我想搬过来一个简单的末日应用的Heroku。 用丝锥了Ruby应用程序代码的迁移和现有的MySQL数据库进行得很顺利,但我发现下面的Postgres的错误:
PostgresError - 错误:运营商不存在:文本=整数LINE 1:... d_at”, “POST_ID” FROM “意见” WHERE( “POST_ID”(4,17,... ^提示:没有运营商匹配给定名字和参数类型,你可能需要增加明确的类型转换。
这是明显的问题是关系到查询类型不匹配,但是这正从一个非常高层次的抽象由DataMapper的ORM一个Haml的模板发出的,所以我不知道我怎么会去控制这个...
具体而言,这似乎是对的通话将被投掷p.comments
从我Haml的模板,其中p
代表一个特定职位。
该DataMapper的模型的关系如下:
class Post
property :id, Serial
...
has n, :comments
end
class Comment
property :id, Serial
...
belongs_to :post
end
这适用于使用MySQL我的本地和当前的托管环境很好,但Postgres的显然更加严格。
必须有上百的DataMapper和Haml的应用程式的上的Postgres DB的运行,而这种模式的关系是超常规的,所以希望有人看到(并确定如何解决)这一点。 谢谢!
UPDATE:请参阅Heroku的:从MySQL迁移数据库后Postgres类型操作错误解决。
它看起来像POST_ID的类型是文本,而不是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