【发布时间】:2015-12-10 20:32:33
【问题描述】:
我有一个 Ruby on Rails 应用程序,开发数据库在 Mysql 中。我决定使用 sqlite 数据库进行测试。为此,我做了以下工作:
配置 database.yml 文件以支持 test.sqlite3 用于测试环境
使用
rake db:schema:dump转储当前开发数据库架构- 尝试使用 schema.rb 通过命令在 test.sqlite3 数据库文件中生成表。
rake db:test:clone
然后就火爆了。我有一个例外
SQLite3::SQLException index XXX
already exists:CREATE INDEX "XXX" ON table ("XXX")
当我仔细检查迁移文件和架构时,我意识到在多个表中使用了相同的索引名称。比如schema.rb中的一些语句是这样的:
add_index("patients", ["appointment_id"], {:name=>"appointment_id"})
add_index("doctors", ["appointment_id"], {:name=>"appointment_id"})
我知道mysql在表的范围内保持索引名的唯一性。现在一个简单的解决方案可能是恢复到 mysql 用于测试数据库。我无法弄清楚的是在这种特殊情况下是否有可能从 schema.rb 生成一个 sqlite 文件。
现在是奇怪的部分。我做了以下更改并在一个虚拟应用程序中进行了测试。
add_index("patients", ["appointment_id"], {:name=>"pappointment_id"})
add_index("doctors", ["appointment_id"], {:name=>"dappointment_id"})
成功了!现在我可能很想在我的真实应用程序中做同样的事情。残酷的现实是有很多地方我需要进行重命名和生产,这将不仅仅是一项繁琐的任务,因为如果我删除旧索引并添加新索引,我们有数百万条记录会受到影响(Mysql 5.5) .有出路吗?
【问题讨论】:
标签: mysql ruby-on-rails database sqlite schema.rb