2012-05-03 36 views
1

我有工作正常使用SQLite但在切換到postgre我有這個查詢的問題一個Rails應用程序:PostgreSQL的破軌查詢功能

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或串它仍然產生上述錯誤。模型設置如下:收視率belongs_to has_many:收視率的用戶。有任何想法嗎?提前致謝。

版本:3.1.1的Rails和Ruby 1.9.2,1.5.1設計

+1

「ratings」表上的'user_id'字段/外鍵肯定是一個整數? – pjumble

+0

不,這不是我改變它,它的工作謝謝你。爲什麼會在sqlite上工作,而不是在Postgre上? – Steve

+1

SQLite有一個相當寬鬆的類型系統,PostgreSQL沒有。您應該在同一個堆棧上開發和部署。 –

回答

5

此錯誤

ERROR: operator does not exist: character varying = integer

通常意味着你要比較兩個不同的數據類型是否相等。有些平臺會讓你通過默默地強迫對方來做到這一點。 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。

+1

Rails默認使用SQLite(不幸的是),因爲它應該是「容易」使用的。可惜Rails的人對數據庫沒有任何的尊重。 –