Изменить базу данных на utf8 в Rails - PullRequest
1 голос
/ 05 февраля 2020

Я пытаюсь изменить базу данных, чтобы принять utf8_general_ci в файле миграции

class AlterTableToArabic < ActiveRecord::Migration[5.2]
  def change
    ALTER DATABASE noswazefa_backend_development CHARACTER SET utf8 COLLATE utf8_general_ci; 
  end
end

, но когда я запускаю rake db:migrate, эта ошибка появляется в консоли:

- utf8_general_ci () рейк прерван! StandardError: Произошла ошибка, все последующие миграции отменены: неопределенная локальная переменная или метод utf8_general_ci для #

Ответы [ 2 ]

2 голосов
/ 05 февраля 2020

Вы не можете просто вставить произвольный SQL в миграцию и ожидать, что Ruby будет в порядке. Это Ruby DSL для записи SQL операторов - не магический c туннель в вашу базу данных.

class AlterTableToArabic < ActiveRecord::Migration[5.2]
  def up
    execute "ALTER DATABASE noswazefa_backend_development CHARACTER SET utf8 COLLATE utf8_general_ci;"
  end
end

В этом случае вы должны использовать def up вместо def change, как это необратимый.

1 голос
/ 16 февраля 2020

создайте файл миграции и вставьте этот код

class ConvertTablesToUtf8 < ActiveRecord::Migration[5.2]
 def change_encoding(encoding,collation)
 connection = ActiveRecord::Base.connection
 tables = connection.tables
 dbname =connection.current_database
 execute <<-SQL
   ALTER DATABASE #{dbname} CHARACTER SET #{encoding} COLLATE #{collation};
 SQL
 tables.each do |tablename|
   execute <<-SQL
     ALTER TABLE #{dbname}.#{tablename} CONVERT TO CHARACTER SET #{encoding} COLLATE #{collation};
   SQL
 end
 end

def change
 reversible do |dir|
   dir.up do
     change_encoding('utf8','utf8_general_ci')
   end
   dir.down do
     change_encoding('latin1','latin1_swedish_ci')
   end
 end
end
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...