繁体   English   中英

如何使用postgres数据库禁用heroku中的预准备语句

[英]How to disable prepared statement in heroku with postgres database

我在本地修复了我的rails项目的问题(使用postgres配置),同时在database.yml中添加了这个语句:

test:
  prepared_statements: false

我修复的错误与此问题有关:

 PG::ProtocolViolation: ERROR: bind message supplies 2 parameters, but prepared            statement "a24" requires 1 

现在,我想用postgres数据库修复我在Heroku上托管的生产应用程序。 我不知道如何禁用预准备语句,因为database.yml是自动生成的。 我试图追加:

/database?prepared_statements=false

到我的数据库的URI,但它最终导致错误的DATABSE_URL,所以我无法连接到我的数据库。

禁用prepared_statement的过程和正确语法是什么?

截至2014年2月19日,heroku 不再覆盖database.yml因此您可以按照最新文档的建议关闭database.yml文件的productionstaging (或default )块中的预准备语句:

default: &default
  adapter: postgresql
  encoding: unicode
  pool: 5
  prepared_statements: false

development:
  <<: *default
  database: myapp_development

test:
  <<: *default
  database: myapp_test

production:
  <<: *default
  url:  <%= ENV['DATABASE_URL'] %>
  pool: <%= ENV['DB_POOL'] || ENV['MAX_THREADS'] || 5 %>

staging:
  <<: *default
  url:  <%= ENV['DATABASE_URL'] %>
  pool: <%= ENV['DB_POOL'] || ENV['MAX_THREADS'] || 5 %>

我们担心脆弱性并保持登台/生产(在Heroku上使用DATABASE_URL)和开发/测试(使用database.yml / database.example.yml)之间的一致性。

Rails测试的启发,我们将其放在config / initializers / disable_prepared_statements.rb中:

ActiveRecord::Base.establish_connection(
  ActiveRecord::Base.remove_connection.merge(
    :prepared_statements => false
  )
)

remove_connection返回要删除的连接的连接参数的哈希值。 这应该让任何database.yml或DATABASE_URL继续工作。

您应该只能将?prepared_statements=false添加到现有数据库URL并重新启动dynos。 这对我们有用。

heroku config:add DATABASE_URL=[old database url here]?prepared_statements=false

要在重新启动服务器后检查它是否已设置,您可以打开控制台并查询ActiveRecord::Base.connection_config

您可以在初始化程序中将配置哈希传递给ActiveRecord :: Base.establish_connection。 例如:

configure :production, :development, :test do
  db = URI.parse(ENV['DATABASE_URL']

  ActiveRecord::Base.establish_connection(
      :adapter => db.scheme == 'postgres' ? 'postgresql' : db.scheme,
      :host                => db.host,
      :username            => db.user,
      :password            => db.password,
      :database            => db.path[1..-1],
      :encoding            => 'utf8',
      :prepared_statements => false,
  )
end

http://apidock.com/rails/ActiveRecord/Base/establish_connection/class

最近似乎Heroku已禁用使用heroku config:set DATABASE_URL=<blah>?prepared_statements=false ,给我们一个错误“▸无法覆盖附件值DATABASE_URL”。

为了解决这个问题,我们在config /中添加了一个disabled_prepared_statements.rb初始化器:

ActiveRecord::Base.configurations[Rails.env].merge!(prepared_statements: false)

关闭准备好的语句会降低性能,因为postgresql必须在执行之前重新计算每个查询,因此我不建议将其关闭以用于生产服务器 - 特别是因为当你没有非常好地关注急切加载时,rails因为做了很多小查询而臭名昭着一切。 我建议indead确定如何在每次部署后重新启动,而不会影响服务的可用性。 我不是铁路大师,但我知道它是可行的(我们的公司就是这样)。 这里有一个更深入的了解为什么会发生这种情况https://github.com/rails/rails/issues/12330

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM