Rails:获取PostgreSQL表的列类型

19 浏览
0 Comments

Rails:获取PostgreSQL表的列类型

如果我有一个包含不同PostgresQL数据类型的表:\n

 CREATE TABLE users (
    name varchar(255),
    age int4
  );

\n当我通过模型获取该表的列时,返回的sql_type与我输入的不同:\n

User.columns.first.name #=> "name"
User.columns.first.sql_type #=> "character varying"
User.columns.last.name #=> "age"
User.columns.last.sql_type #=> "integer"

\n如何获取原始类型?在这种情况下,它应该是varchar(255)int4

0
0 Comments

Rails: 获取PostgresQL表列的类型

在使用Rails开发过程中,我们经常需要获取数据库表的列类型。然而,当我们使用PostgresQL数据库时,有些列类型的名称并不是我们之前熟悉的名称,这可能会导致一些困惑。在本文中,我们将解释这种情况的原因,并提供解决方法。

根据PostgresQL官方文档,字符类型的名称实际上是"character varying",但是我们也可以使用"varchar"作为其别名。类似地,对于整数类型,"int4"是"integer"的别名。这意味着我们可以在创建表时使用"varchar"和"int4",但是实际上数据库内部会将它们转换成"character varying"和"integer"。

为了验证数据库的实际存储类型,我们可以使用"psql"命令行工具。下面是一个示例:

=> create table users (name varchar(255), age int4);
CREATE TABLE
=> \d users
            Table "public.users"
 Column |          Type          | Modifiers 
--------+------------------------+-----------
 name   | character varying(255) | 
 age    | integer                | 

从上述输出可以看出,实际上并没有"varchar"或"int4"的存在,而是使用了标准的"character varying"和"integer"类型。因此,我们在创建表时可以使用别名,但是数据库内部始终使用标准类型与我们进行交互。

事实上,在使用其他列类型时,也会遇到类似的情况。例如,"decimal(m,n)"是"numeric(m,n)"的别名,"timestamp"实际上是"timestamp without time zone"的别名,等等。

总结起来,当我们在Rails中使用PostgresQL数据库时,要获取表列类型的名称时,需要注意别名和标准类型之间的转换关系。虽然我们可以在创建表时使用别名,但是数据库内部始终使用标准类型与我们进行交互。

0