【发布时间】:2015-07-30 14:55:52
【问题描述】:
我已经在本地开发 Rails 应用程序已有一段时间了,并且大部分应用程序都保留在本地主机中。我已经对 Heroku 进行了一次部署作为测试,并且从那以后开发了更多应用程序。好吧,现在我想将更新的版本推送到heroku,但我的时间最糟糕。首先,我经历并了解了一致性数据库的重要性(test/dev 使用 sqlite3,heroku 使用 postgres)。
我已将测试/开发数据库从 sqlite3 移至 postgres,这工作正常,但我在推送到本地没有的 heroku 时仍然遇到问题,即使我使用的是 postgres。
这是我得到的错误:
== 20150713172604 ChangingRoomTimeToDatetime: migrating =======================
-- change_column(:rooms, :start_time, :timestamptz)
rake aborted!
StandardError: An error has occurred, this and all later migrations canceled:
PG::DatatypeMismatch: ERROR: column "start_time" cannot be cast automatically to type timestamp with time zone
HINT: Specify a USING expression to perform the conversion.
: ALTER TABLE "rooms" ALTER COLUMN "start_time" TYPE timestamptz/app/vendor/bundle/ruby/2.0.0/gems/activerecord-4.1.8/lib/active_record/connection_adapters/postgresql/database_statements.rb:128:in `async_exec'
最初我对房间使用时间数据类型,直到我意识到日期也很重要:
class AddingTimeToRoomModel < ActiveRecord::Migration
def change
add_column :rooms, :start_time, :time
add_column :rooms, :end_time, :time
end
end
变化:
class ChangingRoomTimeToDatetime < ActiveRecord::Migration
def change
change_column :rooms, :start_time, :timestamptz
change_column :rooms, :end_time, :timestamptz
end
end
此时数据并不重要,因为数据库中唯一的数据是我不小心删除/丢弃的测试数据。我尝试使用 :timestamp 和 :timestamptz ,但我无法得到任何工作,并且很困惑为什么它可以在本地工作,但不能在 heroku 上工作。
【问题讨论】:
-
您正在尝试将时间转换为完整的时间戳,时间戳应该与哪个日期一起使用?
-
抱歉,我不完全确定您的意思。当我最初设置它时,我使用:时间然后意识到我需要日期,因为它是事件的一部分,所以我需要日期,所以切换到:日期时间。然后在使用 heroku/postgres 时开始在此迁移中出错。我不太在意时间戳,我只需要在这个字段上有日期和时间
-
时间看起来像
HH:MM:SS,但时间戳是YYYY-MM-DD HH:MM:SS,如果没有YYYY-MM-DD部分,您无法将时间转换为时间戳。 -
哦,我明白你的意思了,有没有办法设置默认值,或者我应该将初始 add_column 更改为时间戳和回滚迁移?正如我所说,除了一两个无关紧要的测试值之外,数据库中没有任何数据
-
如果您不关心数据,那么只需在一个迁移中删除该列,然后在另一个迁移中添加新版本。
标签: ruby-on-rails postgresql heroku sqlite