我正在将应用程序从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,因为站点上的程序员停止使用迁移并开始直接对db进行更改。现在我正在尝试使用迁移重新启动。该过程中建议的第一步是使用模式转储作为起点。此外,(我不确定)测试是否需要从开发数据库重建测试数据库。
答案 0 :(得分:5)
db:schema:dump
不适合使用,但您可以在Rakefile中添加几行代码以获得所需的结果。
The 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或其他实用程序,您将获得更多自由。您可以使用system
方法从命令行执行,从rake任务中调用此类实用程序。 (请参阅下面的MySQL示例,该示例使用mysqldump实用程序。)
(我没有测试过上面的代码,我自己没有安装SQL 2008,但在this blog上解释了使用SQL Server创建转储的原始SQL代码。)
运行佣金任务
然后在命令行上,拨打rake mydump
或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