Ошибка Postgres с Sinatra / Haml / DataMapper на Heroku - PullRequest
1 голос
/ 29 мая 2010

Я пытаюсь переместить простое приложение Sinatra в Heroku. Миграция кода приложения Ruby и существующей базы данных MySQL с использованием Taps прошла гладко, но я получаю следующую ошибку Postgres:

PostgresError - ОШИБКА: оператор не существует: text = integer ЛИНИЯ 1: ... d_at "," post_id "ОТ" комментирует "ГДЕ (" post_id "IN (4, 17, ... ^ СОВЕТ: ни один оператор не соответствует заданному имени и типу (аргументам) аргумента. Возможно, вам придется добавить явные приведения типов.

Очевидно, что проблема связана с несовпадением типов в запросе, но это выдается из шаблона Haml в DataMapper ORM на очень высоком уровне абстракции, поэтому я не уверен, как бы я поступил об управлении этим ...

В частности, это похоже на вызов 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, и эта модель отношений супер-традиционна, так что, надеюсь, кто-то видел (и решил, как это исправить). Спасибо!

ОБНОВЛЕНИЕ: См. Heroku: Ошибка оператора типа Postgres после миграции БД из MySQL для разрешения.

1 Ответ

1 голос
/ 31 мая 2010

Похоже, что 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

...