【问题标题】:Postgresql breaking rails querying functionalityPostgresql 破轨查询功能
【发布时间】:2012-05-03 01:07:09
【问题描述】:

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

【问题讨论】:

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


【解决方案1】:

这个错误

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

通常意味着您正在尝试比较两种不同的数据类型是否相等。有些平台会让你通过默默地强制一个到另一个来做到这一点。 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。

【讨论】:

  • Rails 默认使用 SQLite(不幸的是),因为它应该“易于”使用。可惜 Rails 的人不尊重数据库。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-23
  • 1970-01-01
  • 2021-12-06
  • 2021-08-03
  • 2013-02-17
  • 2013-09-22
相关资源
最近更新 更多