为Ruby应用程序迁移Azure数据库的问题

问题描述 投票:0回答:2

[我有一个在Linux服务器(Amazon AMI v 2018.03 rhel fedora)上运行的Ruby on Rails应用程序(运行Ruby 2.2.10p489和Rails 4.2.5和activerecord-sqlserver-adapter 4.2.6)。它连接到Azure数据库。一切正常。但是,当我迁移到其他Azure数据库并更改凭据以指向新数据库时,会得到一堆无用的错误,看起来像这样:

SystemStackError: stack level too deep
        from /apps/acme_dynamite/path/ruby/2.2/gems/tiny_tds-1.0.5/lib/tiny_tds/client.rb:53:in `connect'
        from /apps/acme_dynamite/path/ruby/2.2/gems/tiny_tds-1.0.5/lib/tiny_tds/client.rb:53:in `initialize'
        from /apps/acme_dynamite/path/ruby/2.2/gems/activerecord-sqlserver-adapter-4.2.6/lib/active_record/connection_adapters/sqlserver_adapter.rb:280:in `new'
        from /apps/acme_dynamite/path/ruby/2.2/gems/activerecord-sqlserver-adapter-4.2.6/lib/active_record/connection_adapters/sqlserver_adapter.rb:280:in `dblib_connect'
        from /apps/acme_dynamite/path/ruby/2.2/gems/activerecord-sqlserver-adapter-4.2.6/lib/active_record/connection_adapters/sqlserver_adapter.rb:271:in `connect'
        from /apps/acme_dynamite/path/ruby/2.2/gems/activerecord-sqlserver-adapter-4.2.6/lib/active_record/connection_adapters/sqlserver_adapter.rb:59:in `initialize'
        from /apps/acme_dynamite/path/ruby/2.2/gems/activerecord-sqlserver-adapter-4.2.6/lib/active_record/sqlserver_base.rb:18:in `new'
        from /apps/acme_dynamite/path/ruby/2.2/gems/activerecord-sqlserver-adapter-4.2.6/lib/active_record/sqlserver_base.rb:18:in `sqlserver_connection'
        from /apps/acme_dynamite/path/ruby/2.2/gems/activerecord-4.2.5/lib/active_record/connection_adapters/abstract/connection_pool.rb:438:in `new_connection'
        from /apps/acme_dynamite/path/ruby/2.2/gems/activerecord-4.2.5/lib/active_record/connection_adapters/abstract/connection_pool.rb:448:in `checkout_new_connection'
        from /apps/acme_dynamite/path/ruby/2.2/gems/activerecord-4.2.5/lib/active_record/connection_adapters/abstract/connection_pool.rb:422:in `acquire_connection'
        from /apps/acme_dynamite/path/ruby/2.2/gems/activerecord-4.2.5/lib/active_record/connection_adapters/abstract/connection_pool.rb:349:in `block in checkout'
        from /usr/share/ruby/2.2/monitor.rb:211:in `mon_synchronize'
        from /apps/acme_dynamite/path/ruby/2.2/gems/activerecord-4.2.5/lib/active_record/connection_adapters/abstract/connection_pool.rb:348:in `checkout'
        from /apps/acme_dynamite/path/ruby/2.2/gems/activerecord-4.2.5/lib/active_record/connection_adapters/abstract/connection_pool.rb:263:in `block in connection'
        from /usr/share/ruby/2.2/monitor.rb:211:in `mon_synchronize'
        from /apps/acme_dynamite/path/ruby/2.2/gems/activerecord-4.2.5/lib/active_record/connection_adapters/abstract/connection_pool.rb:262:in `connection'
        from /apps/acme_dynamite/path/ruby/2.2/gems/activerecord-4.2.5/lib/active_record/connection_adapters/abstract/connection_pool.rb:571:in `retrieve_connection'
        from /apps/acme_dynamite/path/ruby/2.2/gems/activerecord-4.2.5/lib/active_record/connection_handling.rb:113:in `retrieve_connection'
        from /apps/acme_dynamite/path/ruby/2.2/gems/activerecord-4.2.5/lib/active_record/connection_handling.rb:87:in `connection'
        from (irb):1
        from /apps/acme_dynamite/path/ruby/2.2/gems/railties-4.2.5/lib/rails/commands/console.rb:110:in `start'
        from /apps/acme_dynamite/path/ruby/2.2/gems/railties-4.2.5/lib/rails/commands/console.rb:9:in `start'
        from /apps/acme_dynamite/path/ruby/2.2/gems/railties-4.2.5/lib/rails/commands/commands_tasks.rb:68:in `console'
        from /apps/acme_dynamite/path/ruby/2.2/gems/railties-4.2.5/lib/rails/commands/commands_tasks.rb:39:in `run_command!'
        from /apps/acme_dynamite/path/ruby/2.2/gems/railties-4.2.5/lib/rails/commands.rb:17:in `<top (required)>'
        from bin/rails:4:in `require'

正在运行的Azure连接看起来像:

env PRODUCTION_DATABASE_HOST="xxx.database.windows.net"
env PRODUCTION_DATABASE_PORT=1433
env PRODUCTION_DATABASE="databasename_no_dots"
env PRODUCTION_DATABASE_USERNAME="username_no_dots_or_ands"
env PRODUCTION_DATABASE_PASSWORD="supersecret"

不工作的样子:

env PRODUCTION_DATABASE_HOST="xxx2.database.windows.net"
env PRODUCTION_DATABASE_PORT=1433
env PRODUCTION_DATABASE="other_databasename_no_dots"
env PRODUCTION_DATABASE_USERNAME="username_no_dots_or_ands"
env PRODUCTION_DATABASE_PASSWORD="supersecret"

问题不是连通性或防火墙,因为我实际上可以使用/ node_modules / sql-cli连接到此新的Azure服务器。有什么可能是错的吗?我的Ruby版本与Azure的另一个实例之间是否存在某些不兼容?我没有主意。

仅通过发出如下语句即可从irb内部触发大量错误:

results = ActiveRecord::Base.connection.exec_query("SELECT 1")
ruby-on-rails sql-server ruby azure
2个回答
0
投票

您可以尝试:

env PRODUCTION_DATABASE_HOST =“ xxx2。数据库。windows.net”


0
投票

更新:解决此问题的关键在于创建新的Azure登录名/用户(请参阅https://azure.microsoft.com/en-us/blog/adding-users-to-your-sql-azure-database/)。尽管您可能很想使用admin用户来进行某些数据库连接,但在Ruby on Rails中,它可能会以上述无用的方式失败。相信我,如果您首先设置其他一些特定于应用程序的SQL登录名,则可以避免很多麻烦。如果Ruby on Rails简单地报告数据库用户没有足够的权限而不是陷入失控的递归中,那么所有这些事情都可以避免。

© www.soinside.com 2019 - 2024. All rights reserved.