1

シンプルな Sinatra アプリを Heroku に移行しようとしています。Taps を使用した Ruby アプリ コードと既存の MySQL データベースの移行はスムーズに進みましたが、次の Postgres エラーが発生します。

PostgresError - エラー: 演算子が存在しません: text = integer LINE 1: ...d_at", "post_id" FROM "comments" WHERE ("post_id" IN (4, 17,... ^ ヒント: 与えられた演算子に一致するものはありません名前と引数の型明示的な型キャストを追加する必要がある場合があります。

問題がクエリの型の不一致に関連していることは明らかですが、これは非常に高いレベルの抽象化で DataMapper ORM によって Haml テンプレートから発行されているため、これをどのように制御すればよいかわかりません。 ...

具体的には、これは特定の投稿を表すp.commentsHaml テンプレートからの呼び出しで発生しているようです。p

Datamapper モデルは次のように関連しています。

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

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

これは、MySQL を使用する私のローカルおよび現在ホストされている環境では問題なく動作しますが、Postgres は明らかにより厳密です。

Postgres DB では何百もの Datamapper & Haml アプリが実行されているに違いありません。このモデルの関係は非常に型にはまったものです。ありがとう!

更新:解決方法については、Heroku: MySQL から DB を移行した後の Postgres 型演算子エラーを参照してください。

4

1 に答える 1

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も参照してください。

于 2010-05-31T07:31:54.397 に答える