我有一个使用sqlite工作正常的rails应用程序但是在切换到postgre时我遇到了这个查询的问题:
User.find(1).ratings
仅查询作品,例如
User.find(1)
产生
SELECT "users".* FROM "users" WHERE "users"."id" = $1 LIMIT 1 [["id", 1]]
但是,如果我添加这样的评级:
User.find(1).ratings
产生
User Load (1.4ms) SELECT "users".* FROM "users" WHERE "users"."id" = $1 LIMIT 1 [["id", 1]]
Rating Load (0.9ms) SELECT "ratings".* FROM "ratings" WHERE "ratings"."user_id" = 1
PG::Error: ERROR: operator does not exist: character varying = integer
LINE 1: ...CT "ratings".* FROM "ratings" WHERE "ratings"."user_id" = 1
^
HINT: No operator matches the given name and argument type(s). You might need to add explicit type casts.
: SELECT "ratings".* FROM "ratings" WHERE "ratings"."user_id" = 1
ActiveRecord::StatementInvalid: PG::Error: ERROR: operator does not exist: character varying = integer
LINE 1: ...CT "ratings".* FROM "ratings" WHERE "ratings"."user_id" = 1
^
是否将:id作为int或string传递它仍会产生上述错误。模型设置如下:评级belongs_to用户has_many:评级。有任何想法吗?提前致谢。
版本:Rails 3.1.1,Ruby 1.9.2,设计1.5.1
答案 0 :(得分:5)
此错误
错误:运算符不存在:字符变化=整数
通常意味着您尝试比较两种不同的数据类型是否相等。有些平台会让你通过默默地强制一个到另一个来做到这一点。 SQLite会,它会让你做很多不符合SQL标准的事情。 PostgreSQL通常不允许这样的比较。因为它打印
WHERE "ratings"."user_id" = 1
在错误消息中,它告诉您,虽然您提供了一个整数(1
),但列ratings.user_id实际上是一个varchar()。
SQLite不是SQL。在这里,我使用通用数据类型“wibble”。
sqlite> create table test (n integer not null, s wibble not null);
sqlite> insert into test values (1, 'Wibble');
sqlite> insert into test values ('Wibble', 1);
sqlite> select * from test;
1|Wibble
Wibble|1
SQLite很高兴让我将“Wibble”插入整数列。这至少应该让你停下来,如果不是噩梦。
PostgreSQL是免费的,适用于许多平台。如果您预计在Heroku上进行部署,我看不出有任何理由不安装PostgreSQL并针对它进行开发而不是使用SQLite。