我在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(我的开发和生产数据库)不兼容。
答案 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';