2010-05-29 5 views
1

간단한 Sinatra 앱을 Heroku로 옮기려고합니다. 도청을 사용하여 루비 응용 프로그램 코드의 마이그레이션 및 기존 MySQL 데이터베이스는 순조롭게 진행,하지만 난 다음 포스트 그레스 오류를 받고 있어요 :Heroku의 Sinatra/Haml/DataMapper에서 Postgres 오류가 발생했습니다.

PostgresError - ERROR: operator does not exist: text = integer LINE 1: ...d_at", "post_id" FROM "comments" WHERE ("post_id" IN (4, 17,... ^ HINT: No operator matches the given name and argument type(s). You might need to add explicit type casts.

그것은 문제가 쿼리의 형식이 일치 관련이 있음을 분명하지만 이것이 매우 높은 추상화 수준에서 DataMapper ORM에 의해 Haml 템플릿에서 발행되었으므로이 컨트롤을 어떻게 처리 할 것인지 확신 할 수 없습니다.

특히 이것은 전화를 던지는 것 같습니다. 내 Haml 템플릿의 p.comments입니다. 여기서 p은 주어진 게시물을 나타냅니다. 이것은 MySQL을 사용 내 로컬 및 현재 호스팅 환경에서 잘 작동하지만 포스트 그레스는 분명히 더 엄격한

class Post 
    property :id, Serial 
    ... 
    has n, :comments 
end 

class Comment 
    property :id, Serial 
    ... 
    belongs_to :post 
end 

다음과 같이

Datamapper 모델은 관련이 있습니다.

Datampper & Haml 앱이 Postgres DB에서 실행되고 있어야하며,이 모델 관계는 매우 전통적이므로 잘 보니 누군가가이를 수정 (해결 방법 결정)했기 때문입니다. 감사!

업데이트 : 해결 방법은 Heroku: Postgres type operator error after migrating DB from MySQL을 참조하십시오.

답변

1

post_id가 INTEGER 대신 TEXT 유형 인 것처럼 보입니다. 이 문제를 해결하려면 데이터 유형을 변경해야합니다. 이것은 버전 8.3에서 변경되었으며 이전 버전은 암시 적 캐스트를가집니다. 당신은 그렇게 할 PostgreSQL을 알 수 있습니다 :

CREATE FUNCTION pg_catalog.text(integer) RETURNS text STRICT IMMUTABLE LANGUAGE SQL AS 'SELECT textin(int4out($1));'; 
CREATE CAST (integer AS text) WITH FUNCTION pg_catalog.text(integer) AS IMPLICIT; 

CREATE FUNCTION pg_catalog.text(smallint) RETURNS text STRICT IMMUTABLE LANGUAGE SQL AS 'SELECT textin(int2out($1));'; 
CREATE CAST (smallint AS text) WITH FUNCTION pg_catalog.text(smallint) AS IMPLICIT; 

CREATE FUNCTION pg_catalog.text(bigint) RETURNS text STRICT IMMUTABLE LANGUAGE SQL AS 'SELECT textin(int8out($1));'; 
CREATE CAST (bigint AS text) WITH FUNCTION pg_catalog.text(bigint) AS IMPLICIT; 

은 또한 프랭크 http://wiki.postgresql.org/wiki/Image:Pg83-implicit-casts.sql

+0

감사를 참조하십시오. 문제는 ID 열이 TEXT로 설정되어 있다는 것입니다. 질문은 * 왜 *? 원래의 MySQL 백엔드에서 이러한 열은 INT로 저장되고 응용 프로그램은 정상적으로 실행되지만 어떤 이유로 DB 전송에서 변환됩니다. 아쉽게도 Heroku는 데이터베이스에 직접 SQL 액세스를 제공하지 않으므로 이러한 기능을 만들 수 있다고 생각하지 않습니다. 처음에 INT로 ID를 저장할 수 있다면이 문제는 사라질 것입니다.) 이것은 실제로 Taps 버그 인 것으로 보이며 Sinatra/Haml과 관련이 없으므로 다시 말하려고 시도합니다 ... 다시 한 번 감사드립니다. – sevennineteen

관련 문제