我认为,对于一个新项目,为什么不跳过轨道并自己做更多的事情。可悲的是,我未能解决一个非常简单的问题。
ActiveRecord::Base.connection.create_database('backend')
设置连接ActiveRecord::Base.establish_connection
以创建数据库后,我已经发现需要使用。
遗憾的是,我得到的错误真的很烦人,因为它告诉我它无法创建数据库,因为它不存在:ActiveRecord::NoDatabaseError (Unknown database 'backend')
。
我使用docker-compose托管代码和数据库,主机名/用户名/密码均正确。因为所有代码示例都使用rails并告诉您调用rake db:create
女巫,所以我显然会尝试使用google,因为我显然在遇到此错误时会尝试创建自己。
irb(main):001:0> require 'active_record'
=> true
irb(main):002:1* ActiveRecord::Base.establish_connection(
irb(main):003:1* adapter: 'mysql2',
irb(main):004:1* host: 'database',
irb(main):005:1* username: 'root',
irb(main):006:1* password: '',
irb(main):007:1* database: 'backend',
irb(main):008:0> )
=> #<ActiveRecord::ConnectionAdapters::ConnectionPool:0x0000565044f4f638 @mon_data=#<Monitor:0x0000565044f4f430>, @mon_data_owner_object_id=300, @query_cache_enabled=#<Concurrent::Map:0x0000565044f4f390 entries=0 default_proc=#<Proc:0x0000565044f4f250 /usr/local/bundle/gems/activerecord-6.0.2.2/lib/active_record/connection_adapters/abstract/query_cache.rb:32>>, @spec=#<ActiveRecord::ConnectionAdapters::ConnectionSpecification:0x0000565044f4fed0 @name="primary", @config={:adapter=>"mysql2", :host=>"database", :username=>"root", :password=>"", :database=>"backend"}, @adapter_method="mysql2_connection">, @checkout_timeout=5, @idle_timeout=300.0, @size=5, @thread_cached_conns=#<Concurrent::Map:0x0000565044f4f160 entries=0 default_proc=nil>, @connections=[], @automatic_reconnect=true, @now_connecting=0, @threads_blocking_new_connections=0, @available=#<ActiveRecord::ConnectionAdapters::ConnectionPool::ConnectionLeasingQueue:0x0000565044f4f020 @lock=#<ActiveRecord::ConnectionAdapters::ConnectionPool:0x0000565044f4f638 ...>, @cond=#<MonitorMixin::ConditionVariable:0x0000565044f4efd0 @monitor=#<Monitor:0x0000565044f4f430>, @cond=#<Thread::ConditionVariable:0x0000565044f4ef30>>, @num_waiting=0, @queue=[]>, @lock_thread=false, @reaper=#<ActiveRecord::ConnectionAdapters::ConnectionPool::Reaper:0x0000565044f4ee90 @pool=#<ActiveRecord::ConnectionAdapters::ConnectionPool:0x0000565044f4f638 ...>, @frequency=60.0>>
irb(main):009:0> ActiveRecord::Base.connection.create_database('backend')
Traceback (most recent call last):
15: from /usr/local/bin/irb:23:in `<main>'
14: from /usr/local/bin/irb:23:in `load'
13: from /usr/local/lib/ruby/gems/2.7.0/gems/irb-1.2.1/exe/irb:11:in `<top (required)>'
12: from (irb):9
11: from /usr/local/bundle/gems/activerecord-6.0.2.2/lib/active_record/connection_handling.rb:206:in `connection'
10: from /usr/local/bundle/gems/activerecord-6.0.2.2/lib/active_record/connection_handling.rb:238:in `retrieve_connection'
9: from /usr/local/bundle/gems/activerecord-6.0.2.2/lib/active_record/connection_adapters/abstract/connection_pool.rb:1121:in `retrieve_connection'
8: from /usr/local/bundle/gems/activerecord-6.0.2.2/lib/active_record/connection_adapters/abstract/connection_pool.rb:439:in `connection'
7: from /usr/local/bundle/gems/activerecord-6.0.2.2/lib/active_record/connection_adapters/abstract/connection_pool.rb:595:in `checkout'
6: from /usr/local/bundle/gems/activerecord-6.0.2.2/lib/active_record/connection_adapters/abstract/connection_pool.rb:873:in `acquire_connection'
5: from /usr/local/bundle/gems/activerecord-6.0.2.2/lib/active_record/connection_adapters/abstract/connection_pool.rb:912:in `try_to_checkout_new_connection'
4: from /usr/local/bundle/gems/activerecord-6.0.2.2/lib/active_record/connection_adapters/abstract/connection_pool.rb:933:in `checkout_new_connection'
3: from /usr/local/bundle/gems/activerecord-6.0.2.2/lib/active_record/connection_adapters/abstract/connection_pool.rb:889:in `new_connection'
2: from /usr/local/bundle/gems/activerecord-6.0.2.2/lib/active_record/connection_adapters/mysql2_adapter.rb:14:in `mysql2_connection'
1: from /usr/local/bundle/gems/activerecord-6.0.2.2/lib/active_record/connection_adapters/mysql2_adapter.rb:28:in `rescue in mysql2_connection'
ActiveRecord::NoDatabaseError (Unknown database 'backend')
我发现的几个不错的资源中有两个是要点和一个教程,但是它们在这里也没有真正的帮助。
提前致谢。
在Apurva Mayank回答后更新:
mysql2-gem也在我的gemfile中,并且也可以使用,在上面相同的IRB中,我可以Mysql2
毫无问题地调用它。
另外,如果我运行以下命令,它可以工作,但它没有使用活动记录:
client = Mysql2::Client.new(:host => "database", :username => "root", :password => '')
client.query("CREATE DATABASE backend")
更新:它变得陌生
似乎先创建数据库,然后使用ActiveRecord::Base.connection
,然后将其删除,然后使用活动记录创建数据库。
irb(main):001:0> require 'active_record'
=> true
irb(main):002:1* ActiveRecord::Base.establish_connection(
irb(main):003:1* adapter: 'mysql2',
irb(main):004:1* host: 'database',
irb(main):005:1* username: 'root',
irb(main):006:1* password: '',
irb(main):007:1* database: 'backend',
irb(main):008:0> )
=> #<ActiveRecord::ConnectionAdapters::ConnectionPool:0x000055f4d9b7e188 @mon_data=#<Monitor:0x000055f4d9b7ddf0>, @mon_data_owner_object_id=300, @query_cache_enabled=#<Concurrent::Map:0x000055f4d9b7dd78 entries=0 default_proc=#<Proc:0x000055f4d9b7dc10 /usr/local/bundle/gems/activerecord-6.0.2.2/lib/active_record/connection_adapters/abstract/query_cache.rb:32>>, @spec=#<ActiveRecord::ConnectionAdapters::ConnectionSpecification:0x000055f4d9b7f358 @name="primary", @config={:adapter=>"mysql2", :host=>"database", :username=>"root", :password=>"", :database=>"backend"}, @adapter_method="mysql2_connection">, @checkout_timeout=5, @idle_timeout=300.0, @size=5, @thread_cached_conns=#<Concurrent::Map:0x000055f4d9b7d8a0 entries=0 default_proc=nil>, @connections=[], @automatic_reconnect=true, @now_connecting=0, @threads_blocking_new_connections=0, @available=#<ActiveRecord::ConnectionAdapters::ConnectionPool::ConnectionLeasingQueue:0x000055f4d9b7d710 @lock=#<ActiveRecord::ConnectionAdapters::ConnectionPool:0x000055f4d9b7e188 ...>, @cond=#<MonitorMixin::ConditionVariable:0x000055f4d9b7d530 @monitor=#<Monitor:0x000055f4d9b7ddf0>, @cond=#<Thread::ConditionVariable:0x000055f4d9b7d4e0>>, @num_waiting=0, @queue=[]>, @lock_thread=false, @reaper=#<ActiveRecord::ConnectionAdapters::ConnectionPool::Reaper:0x000055f4d9b7d288 @pool=#<ActiveRecord::ConnectionAdapters::ConnectionPool:0x000055f4d9b7e188 ...>, @frequency=60.0>>
irb(main):009:0> ActiveRecord::Base.connection.create_database('backend', charset: 'utf8')
=> ActiveRecord::NoDatabaseError (Unknown database 'backend')
irb(main):010:0> client = Mysql2::Client.new(:host => "database", :username => "root", :password => '')
=> #<Mysql2::Client:0x000055f4da55eb08 @read_timeout=nil, @query_options={:as=>:hash, :async=>false, :cast_booleans=>false, :symbolize_keys=>false, :database_timezone=>:local, :application_timezone=>nil, :cache_rows=>true, :connect_flags=>2148573700, :cast=>true, :default_file=>nil, :default_group=>nil, :host=>"database", :username=>"root", :password=>""}>
irb(main):011:0> ActiveRecord::Base.connection.create_database('backend', charset: 'utf8')
=> ActiveRecord::NoDatabaseError (Unknown database 'backend')
irb(main):012:0> client.query("CREATE DATABASE backend")
=> nil
irb(main):013:0> ActiveRecord::Base.connection.create_database('backend', charset: 'utf8')
=> ActiveRecord::StatementInvalid (Mysql2::Error: Can't create database 'backend'; database exists)
irb(main):014:0> client.query("DROP DATABASE backend")
=> nil # it got removed
irb(main):015:0> ActiveRecord::Base.connection.create_database('backend', charset: 'utf8')
=> nil # it was created
我发现了问题,谢谢您的帮助。
在Facebook上,我被建议使用开箱即用的ActiveRecord-without-Rails宝石,但是由于我想知道它是如何工作的,因此在使用它之前我做了更深入的研究。事实证明,创建数据库的rake任务不在Rails中,而是隐藏在ActiveRecord中。
然后查看ActiveRecord如何在rake任务中为Mysql创建数据库,您会看到它首先调用了#built_connection而不使用数据库名称。
如下所示,这是解决方案。现在,它将创建数据库。
irb(main):001:0> require 'active_record'
=> true
irb(main):002:1* ActiveRecord::Base.establish_connection(
irb(main):003:1* adapter: 'mysql2',
irb(main):004:1* host: 'database',
irb(main):005:1* username: 'root',
irb(main):006:0> password: '')
=> #<ActiveRecord::ConnectionAdapters::ConnectionPool:0x0000555a68383c00 @mon_data=#<Monitor:0x0000555a68383868>, @mon_data_owner_object_id=300, @query_cache_enabled=#<Concurrent::Map:0x0000555a68383818 entries=0 default_proc=#<Proc:0x0000555a683835e8 /usr/local/bundle/gems/activerecord-6.0.2.2/lib/active_record/connection_adapters/abstract/query_cache.rb:32>>, @spec=#<ActiveRecord::ConnectionAdapters::ConnectionSpecification:0x0000555a68388340 @name="primary", @config={:adapter=>"mysql2", :host=>"database", :username=>"root", :password=>""}, @adapter_method="mysql2_connection">, @checkout_timeout=5, @idle_timeout=300.0, @size=5, @thread_cached_conns=#<Concurrent::Map:0x0000555a68383598 entries=0 default_proc=nil>, @connections=[], @automatic_reconnect=true, @now_connecting=0, @threads_blocking_new_connections=0, @available=#<ActiveRecord::ConnectionAdapters::ConnectionPool::ConnectionLeasingQueue:0x0000555a683834f8 @lock=#<ActiveRecord::ConnectionAdapters::ConnectionPool:0x0000555a68383c00 ...>, @cond=#<MonitorMixin::ConditionVariable:0x0000555a683834a8 @monitor=#<Monitor:0x0000555a68383868>, @cond=#<Thread::ConditionVariable:0x0000555a68383480>>, @num_waiting=0, @queue=[]>, @lock_thread=false, @reaper=#<ActiveRecord::ConnectionAdapters::ConnectionPool::Reaper:0x0000555a68383430 @pool=#<ActiveRecord::ConnectionAdapters::ConnectionPool:0x0000555a68383c00 ...>, @frequency=60.0>>
irb(main):007:0> ActiveRecord::Base.connection.create_database('backend', charset: 'utf8')
=> nil
irb(main):008:0> ActiveRecord::Base.connection.create_database('backend', charset: 'utf8')
=> ActiveRecord::StatementInvalid (Mysql2::Error: Can't create database 'backend'; database exists)
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句