Ich hätte gerne eine Möglichkeit, die tatsächliche sql zu erzeugen (dh wenn ich in eine mysql-Konsole einfügen würde, würde es funktionieren), die von einer Rake-Datenbank generiert wird: migrieren, ohne die Zieldatenbank tatsächlich zu aktualisieren.
rake db: migrate: status zeigt sehr gut an, welche Migrationen für eine bestimmte Datenbank ausstehen, aber ich muss noch einen Weg finden, um das eigentliche SQL zu erzeugen.
Irgendwelche Ideen?
Dies kann durch Affepatching des Datenbankadapters erfolgen. Dieses Beispiel funktioniert für MySQL.
Erstellen Sie eine Rake-Aufgabe für "fake db: migrate":
%Vor% Die Rake-Aufgabe affe-patcht die Methode execute
im Verbindungsadapter, so dass SQL gedruckt wird, anstatt ausgeführt zu werden, bevor die Migrationen tatsächlich ausgeführt werden. Allerdings müssen wir noch einige interne SQL-Anweisungen ausführen, die von der db:migrate
-Aufgabe verwendet werden, um das Datenbankschema abzurufen und herauszufinden, welche Migrationen ausstehen. Das ist der real_execute
-Aufruf.
Angenommen, wir haben eine ausstehende Migration in db/migrate/20160211212415_create_some_table.rb
:
Lassen Sie uns nun unsere gefälschte Migrationsaufgabe ausführen:
%Vor%Der Migrationsstatus wurde nicht geändert, d. h. die Migration steht noch aus:
%Vor% Getestet auf Schienen 4.2.3 mit dem mysql2
Juwel.
Sehr interessante Frage! Ich habe diesen Weg gefunden:
db/migrate/20160102210050_create_items.rb
und in CreateItems
platziert wurde.
Gehen Sie zur Rails-Konsole und laden Sie die Migrationsdatei:
%Vor%Öffnen Sie die Transaktion, führen Sie die Migration und Rollback-Transaktion vor dem Festschreiben aus:)
%Vor% Wenn Sie SQL beim Rollback überprüfen möchten, rufen Sie einfach CreateItems.new.migrate :down
in Schritt 3 auf. SQL wird ausgeführt und in der Datenbank getestet, aber nicht festgeschrieben - so können Sie Ihre Migration ohne Auswirkungen überprüfen.
Tags und Links database ruby-on-rails rake