【问题标题】:Rails dynamic migration with second database使用第二个数据库进行 Rails 动态迁移
【发布时间】:2020-06-20 10:40:57
【问题描述】:

我正在尝试创建一个 Rails 应用程序,该应用程序可以在给定 json 架构的情况下在 非主 DB 中创建数据库表。该应用程序旨在充当管理辅助数据库的界面。应用程序永远不会访问动态创建的表,除非可能(很少)更改表。

这是我的设置

config
 |
 |- secondary_db.yml
 |- initializers/secondary_db.rb

所以现在我的辅助数据库配置在整个应用程序中都可用。

我有一个名为 Topic 的模型,它接受 json 类型的属性 topic_schema。假设模式很浅,没有层次结构或嵌套。

topic_schema: {
  "type" => "object",
  "required" => ["a", "b"],
  "properties" => {
    "a" => {"type" => "integer"},
    "b" => {"type" => "string"}
  }
}

我必须创建一个名为 TableCreator 的服务类,它可以采用这个 json 模式并基于它创建一个表。因此,每次我使用有效的 json topic_schema 创建一个新的 Topic 时,表都会自动创建。请记住,我的应用程序永远不会从该表中读取或写入,我可能很少需要更改或删除该表。所以我不需要在我的 schema.rb 文件中跟踪这些表

我可以创建一个可以将 json 模式转换为table migration 的服务。我想弄清楚如何在不更改应用程序架构文件的情况下运行到secondary_db 的迁移。非常感谢您的帮助:)

【问题讨论】:

  • 这只是我的 2c,但迁移的全部目的是改变 Rails 应用程序数据库模式作为开发人员关注的问题,这与它设计的用例相去甚远。与其试图将你正在做的事情硬塞进一个非常不合适的事情中,你应该真正考虑使用ActiveRecord::ConnectionAdapters::TableDefinition 和ActiveRecord::ConnectionAdapters::SchemaStatements,它们是在你自己的逻辑类中生成 SQL 的 DSL。

标签: ruby-on-rails activerecord ruby-on-rails-5 database-migration ruby-on-rails-6


【解决方案1】:

这是实现我想做的 TableCreator 类。

    class TableCreator < ActiveRecord::Migration[6.0]

      def create
        with_secondary_db_connection do
          create_table :ts_test_table, id: false do |t|
            t.datetime 'time'
            t.string 'value'
          end
        end
      end

      def with_secondary_db_connection
        primary = ActiveRecord::Base.remove_connection
        ActiveRecord::Base.establish_connection(TIMESCALE_CONFIG)
        yield
      ensure
        ActiveRecord::Base.establish_connection(primary)
      end

    end

感谢Max的建议

【讨论】:

    猜你喜欢
    • 2016-10-15
    • 1970-01-01
    • 1970-01-01
    • 2017-02-10
    • 2019-12-02
    • 2017-02-21
    • 2011-10-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多