Heroku:从MySQL迁移数据库后的Postgres类型操作符错误

时间:2010-05-31 13:05:53

标签: postgresql heroku datamapper taps

这是我之前提出的一个问题的后续问题,这个问题更像是一个编程问题,而不是数据库问题。

Postgres error with Sinatra/Haml/DataMapper on Heroku

我认为在运行db:push之后,问题已经被Heroku的Postgres数据库中的ID列存储隔离了。

简而言之,我的应用程序在我的原始MySQL数据库上正常运行,但在对ID列执行任何查询时抛出Postgres错误,这似乎已经作为TEXT存储在Postgres中,即使它在MySQL中存储为INT 。我的问题是为什么在Postgres中将ID列创建为INT,以便将数据传输到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

谢谢!

2 个答案:

答案 0 :(得分:1)

我在Heroku开了一个支持请求,他们的家伙能够快速解决这个问题。在向我们发送MySQL表架构后,他们建议我从ID列中删除UNSIGNED

  

你可以删除UNSIGNED位并看看它是否有效?我不认为续集支持这一点。如果有效,我会给续集写一个补丁。

一旦我这样做,我就能够像使用db:push之前一样迁移数据库,并且该应用程序功能齐全。

对于他们的平台和支持,Heroku不断留下更深刻的印象。

答案 1 :(得分:0)

你不能把它拉到本地的postgres数据库。做必要的ALTER / COPY?移动TABLE魔法并再次将它推回去?