Heroku: ошибка оператора типа Postgres после миграции БД из MySQL

Это продолжение вопроса, который я задавал ранее, в котором это сформулировано как скорее проблема программирования, чем проблема базы данных.

Ошибка Postgres с Sinatra / Haml / DataMapper на Heroku

Я считаю, что проблема была связана с хранением столбца идентификатора в базе данных Heroku Postgres после запуска db:push.

Короче говоря, мое приложение правильно работает в моей исходной базе данных MySQL, но выдает ошибки Postgres на Heroku при выполнении любого запроса в столбце идентификатора, который, похоже, был сохранен в Postgres как TEXT, хотя он хранится как INT в MySQL. У меня вопрос: почему столбец ID создается как INT в Postgres при передаче данных в Heroku, и есть ли у меня способ предотвратить это.

Вот результат heroku console сеанса, демонстрирующий проблему:

Ruby console for myapp.heroku.com
>> Post.first.title
=> "Welcome to First!"
>> Post.first.title.class
=> String
>> Post.first.id
=> 1
>> Post.first.id.class
=> Fixnum
>> Post[1]
PostgresError: ERROR:  operator does not exist: text = integer
LINE 1: ...", "title", "created_at" FROM "posts" WHERE ("id" = 1) ORDER...
                                                         ^
HINT:  No operator matches the given name and argument type(s). You might need to add explicit type casts.
Query: SELECT "id", "name", "email", "url", "title", "created_at" FROM "posts" WHERE ("id" = 1) ORDER BY "id" LIMIT 1

Спасибо!


person sevennineteen    schedule 31.05.2010    source источник
comment
Идентификатор столбца выглядит как тип данных TEXT, а не INTEGER. В противном случае у вас не было бы этой проблемы.   -  person Frank Heikens    schedule 31.05.2010
comment
Да, именно так. Проблема в том, как предотвратить это в рамках ограничений развертывания БД на Heroku.   -  person sevennineteen    schedule 31.05.2010
comment
Это в FAQ: docs.heroku.com/database#frequent-asked-questions, см. Недействительный оператор.   -  person Frank Heikens    schedule 31.05.2010
comment
Я читал это раньше, и хотя он предоставляет способ успешного запроса к текущей структуре БД (т.е. Post.all(:conditions => {:id => "1"})), он не решает основную проблему создания столбца идентификатора как INTEGER.   -  person sevennineteen    schedule 31.05.2010


Ответы (2)


Я отправил запрос в службу поддержки Heroku, и их ребята смогли быстро решить эту проблему за меня. Отправив им мою схему таблицы MySQL, они предложили мне удалить UNSIGNED из столбцов идентификатора:

Можете ли вы удалить НЕПОДПИСАННЫЙ бит и посмотреть, работает ли это? Не думаю, что продолжение поддерживает это. Если это сработает, я напишу патч к сиквелу.

Как только я это сделал, я смог перенести базу данных так же, как и до использования db:push, и приложение стало полностью функциональным.

Постоянно большее впечатление на Heroku, как за их платформу, так и за поддержку.

person sevennineteen    schedule 01.06.2010
comment
Это должно быть исправлено в следующей версии Sequel: github.com/jeremyevansmit/ / а> - person Jeremy Evans; 02.06.2010

Разве вы не можете вытащить его в локальную базу данных postgres. Сделать необходимое ALTER / COPY? MOVE TABLE magic и вернуть его обратно?

person Peter Tillemans    schedule 31.05.2010
comment
Я могу попробовать сделать это и посмотреть, поможет ли это. Однако я считаю, что данные абстрагируются в массивы для транспорта независимо от исходной и целевой БД, и это одно из основных достоинств ‹a href = adam.heroku.com/past/2009/2/11/taps_for_easy_database_transfers/›, лежащая в основе db:push служба, передает данные между Платформы БД. - person sevennineteen; 31.05.2010
comment
Я буду держать пальцы скрещенными. - person Peter Tillemans; 31.05.2010