ActiveRecord(不带滑轨)create_database引发错误“数据库不存在”

丹尼斯·范·德·霍夫

我认为,对于一个新项目,为什么不跳过轨道并自己做更多的事情。可悲的是,我未能解决一个非常简单的问题。

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] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

操作错误:致命:数据库“ django”不存在

来自分类Dev

错误:greenplum数据库上不存在关系

来自分类Dev

django / postgres错误:“数据库XX不存在”

来自分类Dev

数据库错误(如果特定行会不存在)

来自分类Dev

来自不存在的代码的MVC视图引发错误

来自分类Dev

如果表不存在,从Sequel :: Model引发错误?

来自分类Dev

SQL“不存在”在“ Where”子句中引发错误

来自分类Dev

OperationalError:数据库不存在

来自分类Dev

严重:数据库不存在

来自分类Dev

数据库不存在

来自分类Dev

当Rails中不存在数据库时会引发什么类型的异常?

来自分类Dev

Azure SQL数据库重命名失败(错误1801:已存在),但数据库不存在

来自分类Dev

检查对象是否存在,如果不存在则手动引发错误

来自分类Dev

Robolectric访问数据库引发错误

来自分类Dev

如何修复“数据库(database.sqlite)不存在。” 在拉拉维尔(Laravel)?

来自分类Dev

获取数据库中不存在的数据

来自分类Dev

phpBB3 SQL数据库表不存在错误;无法从备份导入或删除损坏的数据库

来自分类Dev

奇怪的错误:播种实体数据库时,类型名称'Models'在类型...中不存在。

来自分类Dev

错误:关系“地方”不存在Heroku数据库导入

来自分类Dev

备份数据库时不存在getaccountname的获取错误

来自分类Dev

neo4j转储错误:数据库不存在

来自分类Dev

在cosmosdb仿真器中获取错误403“数据库帐户localhost不存在”

来自分类Dev

删除不存在的密钥时,Firebase数据库不会返回错误

来自分类Dev

当数据库中不存在值时,Laravel ORM关系返回错误

来自分类Dev

无法插入sqlite数据库,错误:表不存在

来自分类Dev

错误检查数据库<weird chars>文件不存在

来自分类Dev

错误处理:如果数据库行不存在则显示空白输入页

来自分类Dev

pg_restore 错误:“关系不存在”并创建新数据库

来自分类Dev

如果文件不存在,fs.statSync将引发错误

Related 相关文章

  1. 1

    操作错误:致命:数据库“ django”不存在

  2. 2

    错误:greenplum数据库上不存在关系

  3. 3

    django / postgres错误:“数据库XX不存在”

  4. 4

    数据库错误(如果特定行会不存在)

  5. 5

    来自不存在的代码的MVC视图引发错误

  6. 6

    如果表不存在,从Sequel :: Model引发错误?

  7. 7

    SQL“不存在”在“ Where”子句中引发错误

  8. 8

    OperationalError:数据库不存在

  9. 9

    严重:数据库不存在

  10. 10

    数据库不存在

  11. 11

    当Rails中不存在数据库时会引发什么类型的异常?

  12. 12

    Azure SQL数据库重命名失败(错误1801:已存在),但数据库不存在

  13. 13

    检查对象是否存在,如果不存在则手动引发错误

  14. 14

    Robolectric访问数据库引发错误

  15. 15

    如何修复“数据库(database.sqlite)不存在。” 在拉拉维尔(Laravel)?

  16. 16

    获取数据库中不存在的数据

  17. 17

    phpBB3 SQL数据库表不存在错误;无法从备份导入或删除损坏的数据库

  18. 18

    奇怪的错误:播种实体数据库时,类型名称'Models'在类型...中不存在。

  19. 19

    错误:关系“地方”不存在Heroku数据库导入

  20. 20

    备份数据库时不存在getaccountname的获取错误

  21. 21

    neo4j转储错误:数据库不存在

  22. 22

    在cosmosdb仿真器中获取错误403“数据库帐户localhost不存在”

  23. 23

    删除不存在的密钥时,Firebase数据库不会返回错误

  24. 24

    当数据库中不存在值时,Laravel ORM关系返回错误

  25. 25

    无法插入sqlite数据库,错误:表不存在

  26. 26

    错误检查数据库<weird chars>文件不存在

  27. 27

    错误处理:如果数据库行不存在则显示空白输入页

  28. 28

    pg_restore 错误:“关系不存在”并创建新数据库

  29. 29

    如果文件不存在,fs.statSync将引发错误

热门标签

归档