2016-03-31 11 views
0

Ich habe eine Rails 4.2.5 Anwendung mit einer MySQL 5.6 Datenbank. Diese MySQL-Datenbank hat eine Reihe von Fremdschlüsseln, Sichten und Funktionen. Schema.rb ist so konzipiert, dass es datenbankunabhängig ist und daher die datenbankspezifischen Befehle, die zum Ändern dieser zusätzlichen Schemaobjekte erforderlich sind, nicht unterstützt, sodass die Funktion "struktur.sql" bereitgestellt wird.Active Record verwenden structure.sql mit Heroku

http://edgeguides.rubyonrails.org/active_record_migrations.html#schema-dumping-and-you

Leider ist die in Struktur Dump Aufgaben für MySQL gebaut keine Prozeduren umfassen, löst oder Fremdschlüssel. Dies ist für unser Team problematisch, da wir diese "Nicht-Standard" -Objekte manuell versionieren müssen. Daher habe ich mich entschlossen, eine Lösung zu finden, mit der das gesamte Datenbankschema mithilfe von Migrationen verwaltet werden kann. Ich bin auf diesen netten Post von Pivotol Labs gelandet.

https://blog.pivotal.io/labs/labs/using-mysql-foreign-keys-procedures-and-triggers-with-rails

namespace :db do 
    namespace :structure do |schema| 
    schema[:dump].abandon 
    desc 'OVERWRITTEN - shell out to mysqldump' 
    task dump: :environment do 
     config = ActiveRecord::Base.configurations[Rails.env] 
     filename = "#{Rails.root}/db/structure.sql" 
     cmd = "mysqldump -u#{config['username']} -p#{config['password']} " 
     cmd += '-d --routines --triggers --skip-comments ' 
     cmd += "#{config['database']} > db/structure.sql" 
     system cmd 
     File.open(filename, 'a') do |f| 
     f << ActiveRecord::Base.connection.dump_schema_information 
     end 
    end 
    end 

    desc 'load the development_structure file using mysql shell' 
    task load: :environment do 
     config = ActiveRecord::Base.configurations[Rails.env] 
     cmd = "mysql -u#{config['username']} -p#{config['password']} " 
     cmd += "#{config['database']} < db/structure.sql" 
     system cmd 
    end 
    end 

    namespace :test do |schema| 
    schema[:clone_structure].abandon 
    desc 'OVERWRITTEN - load the development_structure file using mysql shell' 
    task clone_structure: %w(db:structure:dump db:test:purge) do 
     config = ActiveRecord::Base.configurations['test'] 
     cmd = "mysql -u#{config['username']} -p#{config['password']} " 
     cmd += "#{config['database']} < db/structure.sql" 
     system cmd 
    end 
    end 
end 

Durch von der Shell Verwendung von mysqldump machen ich eine structure.sql Datei erzeugen kann, die alle Schemaobjekte enthält.

Derzeit ist mein Hauptproblem auf Heroku Ich kann mysql Dump nicht finden. Ich habe dieses Buildpack installiert, das die MySQL-Binärdateien bereitstellt.

https://github.com/gaumire/heroku-buildpack-mysql

Allerdings erhalte ich die Fehler

mysqldump: nicht

heroku run rake db:migrate

beim Laufen gefunden.

Wie Sie sehen können, bin ich hier ganz das Kaninchenloch. Ich vermute, dass es ein Problem mit dem Readonly-Dateisystem von Heroku geben wird, auch wenn ich mysqldump richtig lokalisieren kann. Vielleicht sollte ich Nicht-Entwicklungs-Umgebungen in meiner überschriebenen Rake-db: structure: dump-Aufgabe umgehen, weil structure.sql ein Schema enthalten sollte, das in allen meinen Umgebungen konsistent ist, also kann ich vielleicht nicht damit anfangen, in der Produktion zu schreiben.

Wenn jemand dies geschafft hat oder alternative Ansätze zur Verwaltung eines vollständigen MySQL-Schemas mit Active Record-Migrationen hat, würde ich mich über Ihre Eingabe freuen.

Antwort

0

Sie können dies beheben, indem Sie heroku run bash -a <myapp> ausführen, wodurch eine Bash-Shell in einem einmaligen Prüfstand mit der gleichen Umgebung gestartet wird, wie Sie sie beim Ausführen von heroku run rake db:migrate erhalten würden.

Herokus Dateisysteme sind nicht schreibgeschützt, sie sind "ephemer". Sie können Dateien in einem Dyno erstellen/ändern, aber diese Änderungen gehen verloren, wenn der Prüfpunkt beendet wird, so dass Änderungen nicht bestehen bleiben. Daher sollte diese Methode funktionieren, sofern Sie die Binärdatei mysqldump finden.