我有一个 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) . 有出路吗?