2008-09-16 9 views
5

Erfahrene mit Rails/Active 2.1.1Rake db: migrate erkennt keine neue Migration?

  • Sie erstellen eine erste Version mit (zum Beispiel) Ruby-Skript \ erzeugt Gerüst Produkttitel: string Beschreibung: Text image_url: string
  • Dieses erstellen (zum Beispiel) eine Migrationsdatei namens 20080910122415_create_products.rb
  • Sie die Migration mit rake db gelten: Jetzt
  • migrieren Sie ein Feld der Produkttabelle mit ruby-Skript hinzufügen \ migration add_price_to_product Preis generieren: dezimal
  • Diese Erstellen Sie eine Migrationsdatei mit dem Namen 20080910125745_add_price_to_product.rb
  • Wenn Sie versuchen, Rake db: migrate auszuführen, wird die erste Migration tatsächlich rückgängig gemacht, nicht die nächste! So wird Ihr Produkttisch zerstört!
  • Aber wenn man allein lief rake, hätte es Ihnen gesagt, dass eine Migration

Pls anstand beachten Sie, dass die Anwendung rake db: migrate (sobald der Tisch zerstört wurde) werden alle Migrationen anwenden, um.

Die einzige Abhilfe, die ich gefunden ist, die Version der neuen Migration zu spezifizieren, wie in:

rake db:migrate version=20080910125745 

Also ich frage mich: Ist das ein erwartetes neues Verhalten?

Antwort

1

Sie sollten in der Lage sein

verwenden
rake db:migrate:up 

es zu zwingen, vorwärts zu gehen, aber dann laufen Sie Gefahr, fehlende verschachtelte Migrationen von anderen Menschen in Ihrem Team

, wenn Sie laufen

rake db:migrate 

zweimal, wird es alle Ihre Migrationen erneut anwenden.

Ich begegne dem gleichen Verhalten in Windows mit SQLite, es könnte sich um einen spezifischen Fehler in einer solchen Umgebung handeln.

Bearbeiten - Ich habe warum gefunden. In der Railstie-Datenbank.Rake Aufgabe, die Sie haben den folgenden Code:

desc "Migrate the database through scripts in db/migrate. Target specific version with VERSION=x. Turn off output with VERBOSE=false." 
task :migrate => :environment do 
    ActiveRecord::Migration.verbose = ENV["VERBOSE"] ? ENV["VERBOSE"] == "true" : true 
    ActiveRecord::Migrator.migrate("db/migrate/", ENV["VERSION"] ? ENV["VERSION"].to_i : nil) 
    Rake::Task["db:schema:dump"].invoke if ActiveRecord::Base.schema_format == :ruby 
end 

Dann in meine Umgebungsvariablen Ich habe

echo %Version% #=> V3.5.0f 

in Ruby

ENV["VERSION"] # => V3.5.0f 
ENV["VERSION"].to_i #=>0 not nil ! 

damit die Rechen Aufgabe ruft

ActiveRecord::Migrator.migrate("db/migrate/", 0) 

und in Aktiv Die Bilanz :: Migrator haben wir:

class Migrator#:nodoc: 
    class << self 
    def migrate(migrations_path, target_version = nil) 
     case 
     when target_version.nil?    then up(migrations_path, target_version) 
     when current_version > target_version then down(migrations_path, target_version) 
     else          up(migrations_path, target_version) 
     end 
    end 

Ja, rake db:migrate VERSION=0 ist die lange Version für rake db:migrate:down

bearbeiten - Ich gehe den Leuchtturm Bug aktualisieren würde, aber ich die Super-Firma Proxy verbietet, dass ich verbinde es

In der Zwischenzeit können Sie versuchen, Version zu deaktivieren, bevor Sie migrieren ...

0

Dies ist nicht das erwartete Verhalten. Ich würde vorschlagen, dies als einen Bug auf Leuchtturm zu melden, aber ich sehe, Sie haben already done so! Wenn Sie weitere Informationen (einschließlich OS/Datenbank/Ruby-Version) zur Verfügung stellen, werde ich einen Blick darauf werfen.

1

Ich stimme Tom nicht zu! diese ist ein Fehler !! V3.5.0f ist keine gültige Version für Rake-Migrationen. Rake sollte es nicht zu migrieren verwenden: nach unten, nur weil Rubin zu prüfen, entschied, dass „V3.5.0f“ .to_i 0 ...

Rake laut beschweren soll, dass VERSION nicht gültig ist, damit Benutzer wissen, was oben ist (zwischen Ihnen und mir, überprüfen, dass die Version ist ein YYYYMMDD formatierter Zeitstempel durch Umwandlung in Ganzzahl ist ein wenig Licht)

[Verdammt IE6, die mir nicht erlauben, zu kommentieren! und nein, ich kann nicht Browser dank der Unternehmen] ändern

0

Jean,

Vielen Dank für Ihre Untersuchung. Du hast Recht, und ich glaube, du hast einen ernsteren Fehler entdeckt, den Designfehler der Spezies.

Was passiert, ist, dass Rake wird greifen, was auch immer Wert, den Sie in der Befehlszeile übergeben und speichern sie als Umgebungsvariablen. Die Rake-Tasks, die schließlich aufgerufen werden, ziehen diese Werte aus der Umgebungsvariablen. Wenn db: Abfragen ENV ["VERSION"] migrieren, fordert es tatsächlich den Versionsparameter an, den Sie aufrufend gesetzt haben. Wenn Sie rake db: migrate aufrufen, übergeben Sie keine Version.

Aber wir haben eine Umgebungsvariable namens VERSION haben, die für andere Zwecke durch ein anderes Programm (ich weiß nicht, welche noch) nicht festgelegt wurde. Und die Jungs hinter Rake (oder hinter database.rake) haben nicht gedacht, dass das passieren würde. Das ist ein Designfehler. Zumindest könnten sie spezifischere Variablennamen wie „RAKE_VERSION“ oder „RAKE_PARAM_VERSION“ statt nur „VERSION“ verwendet haben.

Tom, ich werde auf jeden Fall nicht in der Nähe, aber bearbeiten auf Leuchtturm meines Bugreport diese neuen Erkenntnisse zu reflektieren.

Und nochmals danke Jean für Ihre Hilfe.Ich habe diesen Fehler am Leuchtturm wie 5 Tage agao gepostet und habe immer noch keine Antwort!

Rollo

Verwandte Themen