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.