【问题标题】:Rails: Overhauling a live heroku postgres databaseRails:大修一个 live heroku postgres 数据库
【发布时间】:2017-06-27 04:29:26
【问题描述】:
我有一个 Rails 应用程序运行了一年。现在我想彻底检查它的数据库,以便它可以在我的应用程序中运行新功能,我将很快推送到 Heroku。我不想创建添加、删除和修改列和表名的迁移,而是想创建一个新数据库并将旧数据移入其中。
由于我对数据库不太了解,所以我的想法是:
- 从旧数据库中以 csv 格式下载重要表
- 在新应用中创建新的数据库架构
- 使 csv 与新架构匹配
- 删除活动旧数据库
- 将新应用推送到 heroku
- 将表播种到新数据库中
- 希望一切顺利
这是个好主意吗?
我发现可以将应用程序 1 的数据库“附加”到应用程序 2。我是否应该在另一个应用程序中创建新数据库并在那里播种数据,然后将其附加并提升到原始应用程序,以便原始应用程序数据库将被保留,如果发生任何错误可以重新附加?
【问题讨论】:
标签:
ruby-on-rails
heroku-postgres
【解决方案1】:
首先,如果您的应用程序是maintenance mode 上的实时应用程序。
所以不会有新的数据库更新。
现在从您的原始应用程序中获取数据库备份并保存在本地计算机上的某个位置。每当您需要数据时,您都会随身携带适当的数据。
在我看来,您应该创建一个新的 heroku 实例并上传原始数据库
他们将是最好的选择。因为您可以在那里测试所有功能。
您也可以在本地环境中执行相同的操作,但有时本地更改在实时模式下无法正常工作。
现在在新的 heroku 实例中进行新的数据库更改,测试您的应用程序。
如果您对所做的更改感到满意,请将新创建的数据库复制到原始应用程序。
关闭维护模式就完成了。
【解决方案2】:
看来您不需要自动化它,我会:
- 创建生产数据库的备份以防万一
- 在本地准备数据库,包含所有确定的数据(您可以使用任何方法将正确的记录放入其中,包括您的 csv 方法 - 有很多方法,我通常倾向于构建 json 模型,然后使用它来播种)
- 更新/创建新应用
- 使用 heroku 的 CLI Heroku's PG-Push/Pull 将本地数据库复制到生产环境中
您的新应用程序架构当然需要符合要求,这也是 PG-Push 好的原因之一,因为如果您正在开发一个新应用程序或一个与生产“分支”偏离太多的应用程序在迁移等方面,您可以只推送本地分支进行部署,然后将本地的底层数据库也推送到生产环境,使它们保持同步。尽管如此,您仍需要整理并准备好 Db 的“本地”版本。
附录
要从部分现有记录中播种记录,我会执行类似的操作(请记住,您应该将其作为某种方法在某处执行,然后您可以在控制台中运行):
new_hash_of_objects = { }
Model_you_want.all.each do |model|
new_hash_of_objects[model.id.to_sym] = {
new_attribute_1 = '...',
new_attribute_2 = '...',
old_attribute_1 = model.old_attribute_1,
...
}
end
File.open("somewhere/json_records/records.json","w") do |f|
f.write("#{new_hash_of_objects.to_json}")
end
然后你可以有一些东西来加载它们:
def read_json_copy_of_months
@json = JSON.parse(File.read("somewhere/json_records/records.json")).as_json.with_indifferent_access
@json.each do |m,record|
Record.create!(record)
end
end
end
如果您有数百万行,这可能会变得很重,因此您需要将其分解为更小的文件。