2016-05-21 12 views
1

Ich benutze den Edelstein yaml_db, um meine Postgres-Entwicklungsdatenbank in die Produktion zu exportieren, die sich auf einer virtuellen Maschine befindet, auf der sich meine Ruby on Rails-App befindet.Exportieren der Datenbank von der Entwicklung in die Produktion

Ich benutze rake db:data:dump RAILS_ENV=development, um data.yml und rake db:data:load RAILS_ENV=production zu erstellen, um die Daten zu importieren, aber ich bekomme Fehler beim Importieren.

rake aborted! 
ActiveRecord::StatementInvalid: PG::InFailedSqlTransaction: ERROR: current transaction is aborted, commands ignored until end of transaction block 
: DELETE FROM "improvement_actions" 

PG::FeatureNotSupported: ERROR: cannot truncate a table referenced in a foreign key constraint 
DETAIL: Table "comments" references "improvement_actions". 

Weiß jemand, wie man das löst? Oder gibt es eine andere Methode, um meine Datenbank zu exportieren?

Antwort

1

Der Fehler liegt daran, dass Ihre Datenbank Fremdschlüssel hat, die yaml_db nicht unterstützt.

Ich denke, die einfachste Lösung ist, exportieren Sie Ihre Entwicklungsdatenbank mit pg_dump mit dem --disable-triggers Flag und importieren Sie es in Ihre Produktionsdatenbank mit pg_restore.

Allerdings, wenn Sie wirklich yaml_db verwenden möchten, ein rather complicated solution has been documented. Das Herz dieser Lösung ist

  • machen Sie alle Ihre Fremdschlüssel deferrable initially immediate, wenn sie nicht bereits sind. Die dokumentierte Lösung verwendet das Juwel "schema_plus" oder Sie können dies in Postgres tun.
  • monkey-patch yaml_db SerializationHelper::Base#load die alle Einschränkungen bei jeder Ladetransaktion aufzuzuschieben mit set constraints all deferred;
  • monkey-patch yaml_db SerializationHelper::Base#truncate_table Tische trunkieren durch den Versuch, wie üblich trunkieren (die nicht auf einen Tisch erlaubt ist, die Trigger verzögert) und Löschen wenn die Kürzung fehlschlägt.
+0

Ich habe gerade versucht mit Yaml, weil ich es auf einem Tutorial sah. Mit pg_dump und pg_restore, wie kann ich das zwischen meinem localhost und meiner virtuellen Maschine tun? – terrorista

+0

Genaue Details hängen natürlich vom Host ab, aber im Allgemeinen würden Sie scp verwenden, um den Dump auf Ihre VM zu kopieren, ssh verwenden, um sich bei der VM anzumelden, und pg_restore dort ausführen. –

+0

Wenn die von Ihrer VM verwendete Datenbank direkt von Ihrem Entwicklungscomputer aus zugänglich ist, können Sie pg_restore auf Ihrem Laptop ausführen und auf die VM-Datenbank verweisen. Diese Datenbank ist jedoch aus Sicherheitsgründen möglicherweise nicht von außen zugänglich. –

Verwandte Themen