我修复了本地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的过程和正确语法是什么?
答案 0 :(得分:14)
截至2014年2月19日,heroku no longer overrides database.yml
因此您可以在production
和staging
(或default
)database.yml
区块中关闭预备语句} latest docs建议的文件:
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 %>
答案 1 :(得分:5)
我们担心脆弱性并保持登台/制作(使用Heroku上的DATABASE_URL)和开发/测试(使用database.yml / database.example.yml)之间的一致性。
受Rails' tests的启发,我们将其放在config / initializers / disable_prepared_statements.rb中:
ActiveRecord::Base.establish_connection(
ActiveRecord::Base.remove_connection.merge(
:prepared_statements => false
)
)
remove_connection
返回要删除的连接的连接参数的哈希值。这应该让任何database.yml或DATABASE_URL继续工作。
答案 2 :(得分:3)
您应该只能将?prepared_statements=false
添加到现有数据库网址并重新启动您的dynos。这对我们有用。
heroku config:add DATABASE_URL=[old database url here]?prepared_statements=false
要在重新启动服务器后检查它是否已设置,您可以打开控制台并查询ActiveRecord::Base.connection_config
。
答案 3 :(得分:1)
您可以在初始化程序中将配置哈希传递给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
答案 4 :(得分:1)
最近似乎Heroku已禁用使用heroku config:set DATABASE_URL=<blah>?prepared_statements=false
设置DATABASE_URL,让我们回复错误&#34; ▸无法覆盖附件值DATABASE_URL。&#34;
为了解决这个问题,我们在config /中添加了一个disabled_prepared_statements.rb初始化程序:
ActiveRecord::Base.configurations[Rails.env].merge!(prepared_statements: false)
答案 5 :(得分:-3)
关闭准备好的语句会降低性能,因为postgresql必须在执行之前重新计算每个查询,因此我不建议将其关闭以用于生产服务器 - 尤其是因为当你没有真正采取任何小查询时,rails很臭名昭着渴望加载所有东西。我建议indead确定如何在每次部署后重新启动,而不会影响服务的可用性。我不是铁路大师,但我知道它是可行的(我们的公司就是这样做的)。以下是对{0}}
发生原因的更深入了解