4

我正在将应用程序从 rails 2.3.8 迁移到 3.2.3。'rake db:schema:dump' 在 rails 2.3 中运行良好,但在 rails 3.2 中只生成没有列名的表名。

即使应用程序通过控制台成功连接,我也必须更改 config/application.rb 以包含

ActiveRecord::Base.table_name_prefix = 'dbo.'

我是否需要为 rake 任务做一些不同的事情来获取这些前缀?还是其他原因导致缺少列名问题?

进一步澄清:我正在寻找 rake db:schema:dump 因为现场的程序员停止使用迁移并开始直接对数据库进行更改。现在我正在尝试使用迁移重新启动。该过程中推荐的第一步是使用模式转储作为起点。此外,(我不确定)测试需要从开发数据库重建测试数据库。

4

1 回答 1

5

简短的回答:

db:schema:dump不是正确的使用方法,但您可以在 Rakefile 中添加几行代码以获得您想要的结果。

更长的答案:

scuttlebutt是任务db:schema:dump实际上不应该转储比结构更多的东西。(我知道,这是用词不当。)它类似于db:structure:dump,除了一个给你一个 .rb 文件,另一个给你一个 .sql 文件。

您可以通过将以下代码附加到您的 Rakefile 来创建自己的转储 rake 任务:

对于 SQL 2008

task :mydump do
  ActiveRecord::Base.connection.execute(
    "dbcc traceon(2544, -1) \n go \n dbcc traceon(2546, -1) \n go \n dbcc stackdump"
  )
end

使用 SQL 服务器本身创建转储(这是前面的代码所做的)会限制您,因为转储将始终转到您的日志目录;您不能另行指定。

如果您使用 SqlDumper 或其他一些实用程序,您将拥有更多的自由。您可以从您的 rake 任务中调用这样的实用程序,方法是使用该方法从命令行执行它system。(参见下面的 MySQL 示例,它使用 mysqldump 实用程序。)

(我没有测试上述代码,我自己也没有安装 SQL 2008,但是在这个博客上解释了用于从 SQL 服务器创建转储的原始 SQL 代码。)

运行 rake 任务

然后在您的命令行上,调用rake mydumpor rake mydump RAILS_ENV=production

对于 MySQL

您可以使用以下方法为 MySQL 执行类似的操作:

task :mydump do
    config   = Rails.configuration.database_configuration[Rails.env]
    system "mysqldump -h #{config["host"]} -u #{config["username"]} -p#{config["password"]} #{config["database"]} > db/dump.sql"
end
于 2012-06-08T16:01:54.680 回答