【问题标题】:Postgres error with Sinatra/Haml/DataMapper on HerokuHeroku 上的 Sinatra/Haml/DataMapper 的 Postgres 错误
【发布时间】:2011-02-25 12:45:31
【问题描述】:

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

PostgresError - 错误:运算符不存在:文本 = 整数 LINE 1: ...d_at", "post_id" FROM "cmets" 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 和 Haml 应用程序在 Postgres DB 上运行,并且这种模型关系是超常规的,所以希望有人已经看到(并确定如何解决)这个问题。谢谢!

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

【问题讨论】:

    标签: postgresql haml heroku datamapper


    【解决方案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

    【讨论】:

    • 谢谢,弗兰克。我知道问题在于 ID 列已设置为 TEXT;问题是为什么?在原始 MySQL 后端,这些列存储为 INT 并且应用程序运行良好,但由于某种原因,这些列在数据库传输中被转换。不幸的是,Heroku 没有提供对数据库的直接 SQL 访问,所以我认为我不能创建这些函数。如果我可以首先将 ID 存储为 INT,这个问题就会消失;)这实际上似乎是一个 Taps 错误,与 Sinatra/Haml 无关,所以我会尝试改写......再次感谢。跨度>
    猜你喜欢
    • 2023-03-14
    • 1970-01-01
    • 2012-01-14
    • 1970-01-01
    • 2016-04-22
    • 2011-03-31
    • 2011-11-10
    • 1970-01-01
    • 2011-11-03
    相关资源
    最近更新 更多