我正在尝试将一个简单的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以获取解决方案。
答案 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