make rake db:create 设置除开发、测试或生产之外的另一个数据库

Posted

技术标签:

【中文标题】make rake db:create 设置除开发、测试或生产之外的另一个数据库【英文标题】:make rake db:create setup another database besides development, test or production 【发布时间】:2020-08-07 09:48:03 【问题描述】:

我正在使用 rails 4.2 并尝试在 this second database approach 之后配置(在已建立的应用程序中)已审核的 Gem。

我的 config/database.yml 文件如下:

default: &default
  adapter: mysql2
  pool: 5
  timeout: 5000

development:
  <<: *default
  host:  <%= ENV["MYSQL_HOST"] %>
  username: <%= ENV["MYSQL_USER"] %>
  password: <%= ENV["MYSQL_PASSWORD"] %>
  database: <%= ENV["MYSQL_DATABASE"] %>

test:
  <<: *default
  host:  <%= ENV["MYSQL_HOST"] %>
  username: <%= ENV["MYSQL_USER"] %>
  password: <%= ENV["MYSQL_PASSWORD"] %>
  database: <%= ENV['TEST_ENV_DB'] %>

我打算让它为另一个数据库工作,除了开发、测试或生产。但是任务rake db:create 只创建我的开发和测试数据库。这可以在我的 rails 版本中完成吗?

audition:
  <<: *default
  host:  <%= ENV["MYSQL_HOST"] %>
  username: <%= ENV["MYSQL_USER"] %>
  password: <%= ENV["MYSQL_PASSWORD"] %>
  database: <%= ENV["AUDITION_DATABASE"] %>

注意试听数据库的新名称

【问题讨论】:

【参考方案1】:

我认为这可能会对您有所帮助: 为审计创建另一个模型:

class AuditModel < ActiveRecord::Base
  connects_to database:  writing: :audit_db, reading: :audit_db
end

ActiveRecord::Base.establish_connection(
  adapter:  "mysql2",
  host:     "localhost",
  username: "myuser",
  password: "mypass",
  database: "somedatabase"
)

详情: https://guides.rubyonrails.org/active_record_multiple_databases.html https://edgeapi.rubyonrails.org/classes/ActiveRecord/ConnectionHandling.html

【讨论】:

【参考方案2】:

如果你想在rails中读/写秒数据库

创建一个模块

module AuditionConn
  def self.included(base)
    base.class_eval do
     if Rails.env == 'development'
       establish_connection "audition-development" # database.yml
      else
       establish_connection "audition-production" # database.yml
      end
    end
  end
end

然后将其包含在您想要从/向试镜数据库读取/写入的任何模型中

class AuditionDBModel < ActiveRecord::Base
  include AuditionConn
end

第二个数据库的迁移

def up
  AuditionDBModel.connection.create_table ... do |t|
    ...

  AuditionDBModel.connection.change_column ...
end

【讨论】:

谢谢,这对迁移很有用。您对如何使 rake db:create/drop 自动为第二个数据库自动执行此步骤有任何想法吗?【参考方案3】:

我想你想创建一个新环境调用audition,对吧?!

克隆一个现有的环境文件,例如 config/environments/test.rb 并将其重命名为 config/environments/audition.rb 在 config/database.yml 中为您的环境添加一个新的配置块。

使用新环境更新 config 文件夹下的任何其他配置文件,一些 gem 需要对其进行配置。

现在可以启动服务器了

rails server -e audition

【讨论】:

不,我需要设置试听数据库,以便像指向链接中的方法一样使用。可以使用 rake db:create 与其他数据库一起创建的东西。 rake db:migrate 也是一样的 @intmarinoreturn0 尝试使用章鱼宝石github.com/thiagopradi/octopus 你可以在 octopus gem 上使用replication,所有的写查询都会发送给 master,而 read 查询会发送给 slave 这是否意味着无法在我的第二个数据库上写入?在这种情况下,试镜之一。这不是经过审核的 gem 的目的

以上是关于make rake db:create 设置除开发、测试或生产之外的另一个数据库的主要内容,如果未能解决你的问题,请参考以下文章

markdown rake db:createすると访问被拒绝用户が出る

尝试使用 Rails 创建数据库时出错,rake db:create

如何运行 db:migrate 从另一个带参数的 rake 任务?

Mage 类似make&&rake 基于golang 的build 工具

migrate

如何在执行 rake db:setup 之前检查数据库是不是存在于 Rails 中