16 Stimmen

Wie migriere ich gespeicherte Prozeduren in eine Test-DB?

Ich habe ein Problem mit gespeicherten Prozeduren und der Testdatenbank in Rails 3.0.7. Beim Ausführen

rake db:test:prepare

Es migriert die DB-Tabellen aus schema.rb und nicht direkt aus Migrationen. Die Prozeduren werden innerhalb der Migrationen durch Aufruf der execute-Methode und Übergabe eines SQL-Strings wie CREATE FUNCTION foo() ... BEGIN ... END; .

Nach Recherchen habe ich herausgefunden, dass man die

config.active_record.schema_format = :sql

innerhalb application.rb . Nachdem ich diese Zeile hinzugefügt hatte, führte ich Folgendes aus

rake db:struktur:dump rake db:test:clone_structure

Die erste soll die Struktur in eine development.sql Datei und die zweite erstellt die Testdatenbank aus dieser Datei. Aber meine gespeicherten Prozeduren und Funktionen werden immer noch nicht in der Testdatenbank angezeigt. Wenn jemand etwas über dieses Problem weiß. Hilfe wird geschätzt werden.

Ich habe auch versucht, rake db:test:prepare erneut auszuführen, aber immer noch keine Ergebnisse.

MySQL 5.5, Rails 3.0.7, Ruby 1.8.7.

Vielen Dank im Voraus!

0voto

Alexander Presber Punkte 6087

Wenn Sie Ruby-Dumps (im Gegensatz zu SQL-Dumps) benötigen, können Sie dieses Juwel ausprobieren:

https://github.com/jovoto-team/trackless_triggers

Es unterstützt das Dumping von Triggern und Funktionen für Mysql, ohne neue Rake-Tasks einzuführen. Es basiert auf dem trigger_happy-Plugin von tenderlove.

0voto

jpgeek Punkte 4631

Auf Rails 4 habe ich es als Post Load Hook auf der db:test:load Rake-Aufgabe wie folgt:

require File.expand_path('../config/application', __FILE__)

Rails.application.load_tasks

namespace :db do
  namespace :test do

    task :post_load_hook do
      re_create_sps
    end

    def re_create_sps
      [20170905123456, 20170905123457].each do |version|
        ActiveRecord::Migrator.run(
          :down, ActiveRecord::Migrator.migrations_paths, version)
        ActiveRecord::Migrator.run(
          :up, ActiveRecord::Migrator.migrations_paths, version)
      end
    end

    # stored procs must be restored each time.
  end
end

Rake::Task['db:test:load'].enhance(['db:test:post_load_hook'])

Dieser Ansatz wird automatisch ausgeführt, so dass Sie die Datenbank nicht bei jedem Testlauf manuell neu laden müssen, und er wirkt sich nur auf die db:test:load Ich denke also, dass es sich um eine ziemlich isolierte Aufgabe handelt.

IMHO ein bisschen hässlich mit der Migration ids in der Aufgabe, so dass Sie alternativ den Migrationscode zu einer Lib extrahieren und rufen Sie es sowohl von der Migration und der Rake-Aufgabe oben, um es zu bereinigen.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X