Migration zum Erstellen einer Tabelle löst Mysql2 :: Error aus: Tabelle existiert nicht

9

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:

  • hat die Datenbank.yml überprüft, die gut zu sein scheint. Nichts hat sich geändert, und ich habe kürzlich andere Migrationen problemlos ausgeführt (obwohl keine Migrationen Datenbank-Tabellen erstellt haben)
  • ran bundle um sicherzustellen, dass alle Edelsteine ​​installiert wurden
  • löschte die 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?

    
Neil 14.06.2017, 16:25
quelle

4 Antworten

2

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).

    
Neil 14.06.2017, 17:02
quelle
12

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%     
Marcis Viskints 22.08.2017 19:30
quelle
1

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.

    
helmutrs 02.01.2018 14:41
quelle
0

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.

    
Adam Ehven 13.12.2017 00:01
quelle

Tags und Links