Для нового проекта я подумал, почему бы не пропустить рельсы и сделать больше сам. К сожалению, мне не удается решить действительно простую проблему.
Я уже выяснил, что мне нужно использовать ActiveRecord::Base.connection.create_database('backend')
после того, как я установил соединение с ActiveRecord::Base.establish_connection
для создания базы данных.
К сожалению, ошибка Я получаю действительно раздражает, поскольку он говорит мне, что не может создать базу данных, потому что она не существует: ActiveRecord::NoDatabaseError (Unknown database 'backend')
.
Я использую docker -compose для размещения кода и базы данных, имя хоста / имя пользователя / пароль все правильно. Трудно использовать Google, так как все примеры кода используют rails и говорят, чтобы вы вызывали rake db:create
, ведь я, очевидно, пытаюсь создать себя, когда у меня была эта ошибка.
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')
Два из немногих хороших ресурсов, которые я нашел gist и учебное пособие , но и здесь они не очень полезны.
Заранее спасибо.
Обновление после Ответ от 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