sqlite3布尔字段存储为' t',' f',与postgresql不兼容

时间:2014-10-10 11:10:59

标签: postgresql activerecord ruby-on-rails-4 sqlite

我在sqlite3中有一个带有架构的用户表:

CREATE TABLE "users" (
    "id" INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, 
    "email" varchar(255) DEFAULT '' NOT NULL, 
    "encrypted_password" varchar(255) DEFAULT '' NOT NULL,  
    "admin" boolean,);

其中有一个布尔字段admin。

我从rails控制台添加用户记录:

User.create!({email: "example@example.com", encrypted_password: "sample string", admin:1})

然后当我通过管理字段查询用户记录时

select * from users where admin=1;

返回空结果集。

我查看了sqlite用户表,admin字段保存为字符串't'和'f'。

这会导致一个问题,当我在rails中使用自定义查询时,admin过滤器与sqlite3(我的测试数据库)和postgresql(我的开发和生产数据库)不兼容。

我怎么能克服这个问题?

1 个答案:

答案 0 :(得分:2)

如果必须使用原始SQL,那么您应该在开发,测试和生产中使用相同的dbms。 PostgreSQL在Windows,Linux和OSX上运行良好。

对于SQLite来说,这一点尤其重要,SQLite根本不像SQL数据库那样支持数据类型。 SQLite允许这种字面上的废话。

sqlite> create table test (n integer not null);
sqlite> insert into test values ('wibble');
sqlite> select n from test;
wibble

但是,给你带来麻烦的查询无论如何都不会在PostgreSQL中运行。此查询

select * from users where admin=1;

会在PostgreSQL中引发错误,因为整数1不是布尔值域中的值。但是The string '1' is a valid value。所以这会奏效。

select * from users where admin='1';

就像这样。

select * from users where admin='t';