Postgresql打破rails查询功能

时间:2012-05-03 01:07:10

标签: ruby-on-rails ruby-on-rails-3 postgresql

我有一个使用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

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。