这是我之前提出的一个问题的后续问题,这个问题更像是一个编程问题,而不是数据库问题。
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
谢谢!
答案 0 :(得分:1)
我在Heroku开了一个支持请求,他们的家伙能够快速解决这个问题。在向我们发送MySQL表架构后,他们建议我从ID列中删除UNSIGNED
:
你可以删除UNSIGNED位并看看它是否有效?我不认为续集支持这一点。如果有效,我会给续集写一个补丁。
一旦我这样做,我就能够像使用db:push
之前一样迁移数据库,并且该应用程序功能齐全。
对于他们的平台和支持,Heroku不断留下更深刻的印象。
答案 1 :(得分:0)
你不能把它拉到本地的postgres数据库。做必要的ALTER / COPY?移动TABLE魔法并再次将它推回去?