2

我有一个 Ruby on Rails 应用程序,开发数据库在 Mysql 中。我决定使用 sqlite 数据库进行测试。为了做到这一点,我做了以下事情:

  1. 配置database.yml文件以支持 test.sqlite3 用于测试环境

  2. 使用转储当前开发数据库模式rake db:schema:dump

  3. 尝试使用 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) . 有出路吗?

4

1 回答 1

0

您正在尝试添加测试数据库中已经存在的索引。因此,约会 ID 的索引已经存在于您的测试数据库的患者表中。您可以尝试 RAILS_ENV=test rake db:drop db:create db:test:clone 它应该运行良好。也就是说,我喜欢在迁移中添加条件以避免出现问题。例如:

add_column :patients, :appointment_id, :integer unless column_exists? :patients, :appointment_id

出于对所有神圣事物的热爱,请不要将您的 prod 列重命名为 pappointment_id 或类似的名称。

于 2015-09-14T20:48:53.137 回答