簡體   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