1

我有一个在 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 传递,它仍然会产生上述错误。模型设置为 :ratings belongs_to User which has_many :ratings。有任何想法吗?提前致谢。

版本:Rails 3.1.1、Ruby 1.9.2、设计 1.5.1

4

1 回答 1

5

这个错误

错误:运算符不存在:字符变化 = 整数

通常意味着您正在尝试比较两种不同的数据类型是否相等。有些平台会让你通过默默地强制一个到另一个来做到这一点。SQLite 会,它会让你做很多不符合 SQL 标准的事情。PostgreSQL 通常不允许这样的比较。因为它打印

WHERE "ratings"."user_id" = 1

在错误消息中,它告诉您,尽管您提供了一个整数 ( 1),但 rating.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。

于 2012-05-03T01:44:25.347 回答