2017-06-14 39 views
8

pisałem migrację z następujących czynności:Migracja do tworzenia tabeli podnosi Mysql2 :: Error: Tabela nie istnieje

class CreateTableSomeTable < ActiveRecord::Migration[5.1] 
    def change 
    create_table :some_tables do |t| 
     t.references :user, foreign_key: true 
     t.references :author, references: :user, foreign_key: true 
     t.text :summary 
    end 
    end 
end 

Jest to podstawowa że migracja jest tworzenie tabeli bazy danych. Jednakże: gdy uruchamiam rails db:migrate bardzo dziwny komunikat o błędzie przerywa migracją:

Mysql2::Error: Table 'my_database.some_tables' doesn't exist: SHOW FULL FIELDS FROM 'some_tables'

to tak jakby błąd mówi, że nie można utworzyć tabeli, ponieważ tabela nie istnieje, co nie ma sensu.

Czego nie wyglądały na i próbowałem:

  • przeglądu database.yml która wydaje się dobrze. Nic się nie zmieniło, a ja niedawno uruchamiania innych migracje dobrze (chociaż nie ma migracje że tworzone tabele bazy danych)
  • prowadził bundle aby zapewnić wszystkie kamienie zostały zainstalowane
  • skasowany plik schema.rb, odtworzył bazę danych z danymi z innej kopii, i uruchomiłem rake db:schema:dump, aby odtworzyć plik schema.rb. Próbowałem ponownie uruchomić migrację i nadal mam ten sam błąd.

Używam rails 5.1.1 jak również mysql2 0.4.6

jakieś wskazówki, w jaki sposób mogę uzyskać migrację do uruchomienia?

+0

Wygląda na to, że masz kaczki z rzędu, więc jest to prawdopodobnie zbyteczne pytanie, ale: Czy sprawdziłeś, że jest to specyficzna migracja powodująca problem, na przykład umieszczając kod debugowania w migracji, lub za pomocą zmiennej środowiskowej, aby uruchomić tylko jedną migrację? Co pojawia się w pliku dziennika, kiedy przeprowadzasz migrację, która jest powiązana z tą tabelą? –

+1

Spróbuj uruchomić 'rake db: migrate: status', aby zobaczyć migracje, które zostały zastosowane do bazy danych. Być może dowiadujesz się, że łączysz się z innym schematem lub odkrywasz, że migracja, która zawodzi, nie jest tą, która Twoim zdaniem powoduje awarię. – Bustikiller

Odpowiedz

2

Wymyśliłem pracę, ale nadal jest dla mnie bardzo zagadkowa.

Komunikat o błędzie w pliku dziennika nie wskazywał dokładnie na problem. Z jakiegoś powodu może to być rails 5.1.1 lub może być mysql2 0.4.6, ale nie podoba się użycie references wewnątrz bloku create_table z jakiegoś powodu. Bardzo dziwne, ponieważ sprawdziło się w przeszłości.

Więc zmieniłem migrację z tego:

class CreateTableSomeTable < ActiveRecord::Migration[5.1] 
    def change 
    create_table :some_tables do |t| 
     t.references :user, foreign_key: true 
     t.references :author, references: :user, foreign_key: true 
     t.text :summary 
    end 
    end 
end 

do tego:

class CreateTableSomeTable < ActiveRecord::Migration[5.1] 
    def change 
    create_table :some_tables do |t| 
     t.integer :user_id 
     t.integer :author_id 
     t.text :summary 
    end 
    end 
end 

I to działało.

To jest bardzo dziwne, bo references działa dobrze z sqlite3 (testowałem to poprzez generowanie obojętne aplikację, prowadził polecenie rusztowania z kolumną references i pobiegł rails db:migrate i wszystko działało).

+1

Interesujące. Może to być błąd w adapterze. W każdym razie, dzięki za nagranie rozdzielczości. Może to pomóc komuś, kto ma ten sam problem. –

+0

't.references: autor, referencje:: user, foreign_key: true' może to być również twój problem, ponieważ przekazujesz' references:: user' jako 'option' do definicji kolumny. Może to być przypadek błędu bańki, który doprowadziłby do wiadomości, o której wspomniałeś. (Chociaż przeglądając źródło 'active_record' nie widzę powodu, dla którego nie byłbym po prostu ignorowany jako' opcja') – engineersmnky

+0

@engineersmnky Zrobiłem to. Testowałem usunięcie całej linii 'reference', która pozostawiła tylko prostą linię odniesienia:' t.references: user, foreign_key: true'. Niestety nadal się to nie udało. – Neil

12

Wystąpił podobny błąd podczas próby utworzenia nowego modelu, który ma odniesienie do istniejącego modelu, który został utworzony przed migracją do Rails 5.1.

Mimo że komunikat o błędzie nie był do końca jasny, w moim przypadku okazało się, że problemem było niedopasowanie typu danych między kluczem podstawowym starego modelu a kluczem obcym nowego modelu (MySQL nie pozwala na to). Tak było, ponieważ od Rails 5.1 domyślnym typem danych wszystkich kluczy podstawowych i obcych jest bigint, ale dla starego modelu klucz podstawowy był nadal liczbą całkowitą.

Rozwiązałem to, konwertując wszystkie podstawowe i obce klucze obecnych modeli na bigint, dzięki czemu mogę używać nowych domyślnych Railsów i o tym zapomnieć.

Obejście może również określać typ całkowity dla nowych kluczy obcych, tak aby pasowały do ​​podstawowego typu kluczy w starych modelach. Coś jak poniżej:

class CreateUserImages < ActiveRecord::Migration[5.1] 
    def change 
    create_table :user_images do |t| 
     t.references :user, type: :integer, foreign_key: true 
     t.string :url 
    end 
    end 
end 
0

To doprowadziło mnie do szału, myślę, że widziałem inny powód tego niż sugerowali inni. W moim przypadku stało się tak, ponieważ moje nazwy plików migracyjnych nie zgadzały się dokładnie z zawartą w nich klasą migracji. Na przykład miałem plik migracji o nazwie 20171205232654_bonus.rb, ale w klasie został zadeklarowany jako class CreateBonus < ActiveRecord::Migration[5.1]. Kiedy zmieniłem nazwę pliku na 20171205232654_create_bonus.rb wszystko działało.

To może mieć coś wspólnego z faktem, że tworzę tylko migracje, a nie pełne rusztowania, i być może zrobiłem coś złego. Naprawdę nie wiem, jak udało mi się skończyć z tą niedopasowaniem.

1

Duży problem z migracją 5.1 ActiveRecord polega na tym, że oczekuje się, że id będzie BIGINT zamiast INT, więc gdy dodasz kolumnę odnoszącą się do innej tabeli utworzonej przed szynami 5.1, spodziewasz się, że typ kolumny będzie BIGINT, ale zamiast tego jest tylko INT, stąd błąd. Najlepszym rozwiązaniem jest zmodyfikowanie migracji i zmiana typu kolumny na int.

class CreateTableSomeTable < ActiveRecord::Migration[5.1] 
def change 
    create_table :some_tables do |t| 
    t.references :user, foreign_key: true, type: :int 
    t.references :author, references: :user, foreign_key: true 
    t.text :summary 
    end 
end 

które powinno działać.