在Heroku上使用Sinatra / Haml / DataMapper的Postgres错误

时间:2010-05-29 17:31:56

标签: postgresql haml heroku datamapper

我正在尝试将一个简单的Sinatra应用程序移到Heroku上。使用Taps迁移Ruby应用程序代码和现有MySQL数据库进展顺利,但我收到以下Postgres错误:

  

PostgresError - 错误:运算符不存在:text = integer   第1行:... d_at“,”post_id“FROM”comments“WHERE(”post_id“IN(4,17,...                                                                ^   提示:没有运算符匹配给定的名称和参数类型。您可能需要添加显式类型转换。

很明显,这个问题与查询中的类型不匹配有关,但这是由DataMapper ORM在很高的抽象级别从Haml模板发出的,所以我不确定我该如何去关于控制这个...

具体来说,这似乎是在我的Haml模板上调用了p.comments,其中p代表了一个给定的帖子。

Datamapper模型的相关内容如下:

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

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

这在使用MySQL的本地和当前托管环境中工作正常,但Postgres显然更严格。

必须有数百个Datamapper&在Postgres DB上运行的Haml应用程序,这种模型关系是超常规的,所以希望有人看到(并确定如何修复)这个。谢谢!

更新: 请参阅Heroku: Postgres type operator error after migrating DB from MySQL以获取解决方案。

1 个答案:

答案 0 :(得分:1)

看起来post_id是TEXT类型而不是INTEGER。要解决此问题,您必须更改数据类型。这在版本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