Ich habe ein Problem in meinem Rails-Projekt lokal (mit postgres config) behoben, während ich in database.yml diese Aussage hinzugefügt habe:
%Vor%Der Fehler, den ich behoben habe, war mit diesem Problem verbunden:
%Vor%Nun möchte ich es auf meiner Produktions-App, die auf Heroku gehostet wird, mit einer Postgres-Datenbank beheben. Ich weiß nicht, wie vorbereitete Anweisungen deaktiviert werden, da database.yml automatisch generiert wird. Ich habe versucht, anzufügen:
%Vor%zu dem URI meiner Datenbank, aber es endet mit einer DATABSE_URL, die falsch ist und daher kann ich keine Verbindung zu meiner Datenbank herstellen.
Was ist der Prozess und die richtige Syntax, um prepared_statement zu deaktivieren?
Ab dem 19. Februar 2014 überschreibt heroku database.yml
nicht mehr, sodass Sie vorbereitete Anweisungen in deaktivieren können Ihr production
und staging
(oder default
) Block der database.yml
Datei, wie von neueste Dokumente :
Wir waren besorgt über Sprödigkeit und Aufrechterhaltung der Konsistenz zwischen Staging / Produktion (unter Verwendung von DATABASE_URL auf Heroku) und Entwicklung / Test (unter Verwendung von database.yml / database.example.yml).
Inspiriert von Rails-Tests haben wir dies in Config eingefügt /initialisers/disable_prepared_statements.rb:
%Vor% remove_connection
liefert einen Hash der Verbindungsparameter der Verbindung, die entfernt wird. Dies sollte jede Datenbank.yml oder DATABASE_URL weiter funktionieren lassen.
Sie sollten einfach ?prepared_statements=false
zur vorhandenen Datenbank-URL hinzufügen und Ihre Dynos neu starten können. Das hat für uns funktioniert.
Um zu überprüfen, ob es nach dem Neustart des Servers eingerichtet wurde, können Sie eine Konsole öffnen und ActiveRecord::Base.connection_config
abfragen.
Vor kurzem scheint es, dass Heroku die Einstellung von DATABASE_URL mit heroku config:set DATABASE_URL=<blah>?prepared_statements=false
deaktiviert hat, was uns einen Fehler zurückgibt "▸ Dateianhangswerte DATABASE_URL können nicht überschrieben werden."
Um dies zu beheben, haben wir den Initiator "disabled_prepared_statements.rb" in config / containing:
hinzugefügt ActiveRecord::Base.configurations[Rails.env].merge!(prepared_statements: false)
Das Ausschalten vorbereiteter Anweisungen verringert die Leistung, da postgresql jede Abfrage vor der Ausführung neu planen muss. Daher schlage ich nicht vor, sie für Produktionsserver abzuschalten - besonders da rails dafür bekannt ist, viele kleine Abfragen durchzuführen, wenn Sie nicht wirklich gut aufpassen über eifriges Laden alles. Ich schlage vor, indead herauszufinden, wie Sie nach jeder Bereitstellung Neustarts durchführen können, ohne die Verfügbarkeit Ihres Dienstes zu beeinträchtigen. Ich bin kein Schienenguru, aber ich weiß, dass es machbar ist (unsere Firma macht es genau so). Hier ist ein bisschen mehr Einblick, warum dies geschieht Ссылка
Tags und Links ruby-on-rails postgresql heroku