【问题标题】:Heroku: Postgres type operator error after migrating DB from MySQLHeroku:从 MySQL 迁移数据库后 Postgres 类型运算符错误
【发布时间】:2011-02-25 23:40:42
【问题描述】:

这是我之前提出的问题的后续,该问题将其表述为编程问题而不是数据库问题。

Postgres error with Sinatra/Haml/DataMapper on Heroku

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

简而言之,我的应用程序在我的原始 MySQL 数据库上正常运行,但在对 ID 列执行任何查询时在 Heroku 上引发 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

谢谢!

【问题讨论】:

  • 列 ID 看起来像数据类型 TEXT,而不是 INTEGER。否则不会有这个问题。
  • 是的,就是这样。挑战在于如何在 Heroku 上的数据库部署限制范围内防止这种情况发生。
  • 在常见问题解答中:docs.heroku.com/database#frequently-asked-questions,请参阅无效运算符。
  • 我以前读过,虽然它确实提供了一种成功查询当前数据库结构的方法(即Post.all(:conditions => {:id => "1"})),但它并没有解决获取 ID 的核心问题要创建为 INTEGER 的列。

标签: postgresql heroku datamapper taps


【解决方案1】:

你不能把它拉到本地 postgres 数据库。做必要的 ALTER/COPY?MOVE TABLE 魔法然后再推回去吗?

【讨论】:

  • 我可以尝试这样做,看看是否有帮助。但是,我相信无论源数据库和目标数据库如何,数据都被抽象为用于传输的数组,而 adam.heroku.com/past/2009/2/11/taps_for_easy_database_transfers/…>(db:push 的底层服务)的主要优点之一是在数据库平台之间传输数据.
  • 我会祈祷的。
【解决方案2】:

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

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

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

无论是平台还是支持,Heroku 都给他们留下了深刻的印象。

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-16
  • 2015-05-04
  • 1970-01-01
相关资源
最近更新 更多