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

Sol*_*tre 9 postgresql ruby-on-rails heroku

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

test:
  prepared_statements: false
Run Code Online (Sandbox Code Playgroud)

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

 PG::ProtocolViolation: ERROR: bind message supplies 2 parameters, but prepared            statement "a24" requires 1 
Run Code Online (Sandbox Code Playgroud)

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

/database?prepared_statements=false
Run Code Online (Sandbox Code Playgroud)

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

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

mar*_*ada 14

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

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 %>
Run Code Online (Sandbox Code Playgroud)

  • 这为我设置了`prepared_statements`为false.您可以在`rails console`中运行`ActiveRecord :: Base.configurations [Rails.env]`来验证它. (3认同)

小智 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
  )
)
Run Code Online (Sandbox Code Playgroud)

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


kri*_*tok -4

关闭准备好的语句会降低性能,因为 postgresql 必须在执行之前重新计划每个查询,所以我不建议在生产服务器上关闭它 - 特别是当你没有很好地关心急切加载时,rails 因执行许多小查询而臭名昭著一切。我建议确实弄清楚如何在每次部署后实时重新启动而不影响服务的可用性。我不是 Rails 专家,但我知道这是可行的(我们公司就是这样做的)。这里更深入地了解为什么会发生这种情况https://github.com/rails/rails/issues/12330