Rails:获取PostgreSQL表的列类型
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
。
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数据库时,要获取表列类型的名称时,需要注意别名和标准类型之间的转换关系。虽然我们可以在创建表时使用别名,但是数据库内部始终使用标准类型与我们进行交互。