Ich habe eine Migration mit folgendem Inhalt geschrieben:
%Vor% Es ist eine grundlegende Migration, die eine Datenbanktabelle erstellt. Allerdings: Wenn ich rails db:migrate
starte, bricht eine sehr merkwürdige Fehlermeldung die Migration ab:
Mysql2 :: Fehler: Die Tabelle 'my_database.some_tables' existiert nicht: SHOW FULL FIELDS FROM 'some_tables'
Es ist so, als würde der Fehler sagen, dass die Tabelle nicht erstellt werden kann, weil die Tabelle existiert, was keinen Sinn ergibt.
Dinge, die ich angeschaut und ausprobiert habe:
bundle
um sicherzustellen, dass alle Edelsteine installiert wurden schema.rb
-Datei, erstellte die Datenbank mit Daten aus einer anderen Kopie neu und ich führte rake db:schema:dump
aus, um die schema.rb
-Datei neu zu erstellen. Ich habe versucht, die Migration erneut auszuführen, und es ist immer noch derselbe Fehler aufgetreten. Ich verwende rails 5.1.1
sowie mysql2 0.4.6
Irgendwelche Tipps, wie ich die Migration ausführen kann?
Ich habe eine Arbeit gefunden, aber es ist immer noch sehr rätselhaft für mich.
Die Fehlermeldung in der Protokolldatei zeigte nicht genau auf das Problem. Aus irgendeinem Grund könnte es rails 5.1.1
sein oder es könnte mysql2 0.4.6
sein, aber es mag nicht die Verwendung von references
im Block create_table
aus irgendeinem Grund. Sehr merkwürdig, weil es für mich in der Vergangenheit funktioniert hat.
Also habe ich die Migration von diesem geändert:
%Vor%Dazu:
%Vor%Und es hat funktioniert.
Es ist sehr seltsam, denn references
funktioniert gut mit sqlite3
(Ich habe dies getestet, indem ich eine Dummy-App generiert habe, einen Scaffold-Befehl mit einer references
-Spalte ausgeführt habe und rails db:migrate
ausgeführt habe und alles funktioniert hat).
Ich habe einen ähnlichen Fehler beim Versuch, ein neues Modell zu erstellen, das einen Verweis auf ein vorhandenes Modell enthält, das vor der Migration auf Rails 5.1 erstellt wurde.
Obwohl die Fehlermeldung dazu nicht sehr klar war, stellte sich in meinem Fall heraus, dass das Problem nicht übereinstimmender Datentyp zwischen dem Primärschlüssel des alten Modells und dem Fremdschlüssel des neuen Modells war (MySQL lässt dies nicht zu). . Es war so, weil seit Rails 5.1 der Standarddatentyp aller Primär- und Fremdschlüssel Bigint ist, aber für das alte Modell war der Primärschlüsseltyp immer noch ganzzahlig.
Ich löste das, indem ich alle Primär- und Fremdschlüssel der aktuellen Modelle in Bigint umwandelte, damit ich die neuen Standardwerte von Rails verwenden und sie vergessen kann.
Eine Problemumgehung könnte auch ein Integer-Typ für die neuen Fremdschlüssel sein, damit sie dem Primärschlüsseltyp der alten Modelle entsprechen. Etwas wie das Folgende:
%Vor%Das große Problem bei der ActiveRecord-Migration 5.1 ist, dass die ID jetzt BIGINT statt INT ist. Wenn Sie also eine Spalte hinzufügen, die auf eine andere Tabelle vor Rails 5.1 verweist, erwartet sie, dass der Spaltentyp BIGINT ist ein INT, daher der Fehler. Die beste Lösung besteht darin, die Migration zu ändern und den Typ der Spalte in int zu ändern.
%Vor%das sollte funktionieren.
Das hat mich verrückt gemacht, ich glaube, ich sah einen anderen Grund dafür als andere vorgeschlagen haben. In meinem Fall ist es passiert, weil meine Migrationsdateinamen nicht genau mit der darin enthaltenen Migrationsklasse übereinstimmen. Zum Beispiel hatte ich eine Migrationsdatei namens 20171205232654_bonus.rb
, aber innerhalb der Klasse wurde als class CreateBonus < ActiveRecord::Migration[5.1]
deklariert. Sobald ich den Dateinamen in 20171205232654_create_bonus.rb
geändert habe, hat alles funktioniert.
Das könnte etwas damit zu tun haben, dass ich nur Migrationen erstellt habe, keine vollständigen Scaffolds, und vielleicht habe ich etwas falsch gemacht. Ich weiß wirklich nicht, wie ich mit dieser Diskrepanz fertig war.
Tags und Links ruby mysql ruby-on-rails mysql2