【问题标题】:`rake db:schema:dump` creates schema with empty system tables [duplicate]`rake db:schema:dump` 使用空系统表创建模式 [重复]
【发布时间】:2015-05-18 00:24:49
【问题描述】:

我正在创建反映现有生产数据库架构的测试和开发数据库。首先,我通过转储生产模式创建 db/schema.rb:

RAILS_ENV=production rake db:schema:dump

这会创建一个 schema.rb,其中每个系统表都有一个空表:

ActiveRecord::Schema.define(version: 0) do

  create_table "MSreplication_objects", id: false, force: :cascade do |t|
  end

  ...    

当我尝试创建测试和开发数据库时,这些空表会导致错误:

$ rake db:reset
-- create_table("MSreplication_objects", {:id=>false, :force=>:cascade})
rake aborted!
ActiveRecord::StatementInvalid: TinyTds::Error: Incorrect syntax near ')'.: CREATE TABLE [MSreplication_objects] ()

如果我在 schema.rb 中删除了系统表的定义,那么数据库就会正常创建:

$ rake db:reset
-- create_table("Org", {:primary_key=>"org_id", :force=>:cascade})
   -> 0.0434s
   -> -1 rows
...

如何防止rake db:schema:dump 转储无法创建的空系统表的定义?


版本:

  • Microsoft SQL Server 2014 - 12.0.2000.8 (x64)
  • 导轨 (4.2.1)
  • activerecord-sqlserver-adapter (4.2.4)
  • 来自github的tiny_tds:
    • git://github.com/rails-sqlserver/tiny_tds.git
    • 提交 c4e59ba82c0cc55a5587cec1b7d5100d1b1ccaf4

【问题讨论】:

  • 获取真正的数据库 :) ?这听起来像是适配器/数据库特定的问题。
  • 还有它的rake db:schema:dump
  • @papirtiger 感谢您的更正。当我从记忆中输入而不是剪切和粘贴时,就会发生这种情况。是的,我希望我可以拥有一个不同的数据库。

标签: ruby-on-rails sql-server activerecord tiny-tds


【解决方案1】:

有希望:

ActiveRecord::SchemaDumper 完成大部分繁重工作,提供了一种忽略表格​​的单例方法:

ActiveRecord::SchemaDumper.ignore_tables = ['MSreplication_objects', 'MSAnotherStupidSystemTable']

activerecord-sqlserver-adapter 似乎没有提供自己的 rake 任务来转储(它应该)应该完成的模式。

【讨论】:

  • 如果您决定制作自己的 rake 任务,您可能需要查看 databases.rake
  • ignore_tables 采用正则表达式,因此 ActiveRecord::SchemaDumper.ignore_tables = [/^MS/] 可以完美运行。谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-10-02
  • 1970-01-01
  • 2011-04-18
  • 2016-10-25
  • 2010-09-20
  • 1970-01-01
相关资源
最近更新 更多