Генерация Rails-миграций из схемы - PullRequest
11 голосов
/ 01 апреля 2011

Я создаю новое приложение Rails, которое будет работать с существующей схемой. Мне дали схему SQL, но я хочу создать Rails-миграции для заполнения базы данных в процессе разработки. Схема не слишком сложная, с примерно 20 таблицами, однако я не хочу тратить время и на опечатки, создавая миграции вручную.

Есть ли способ генерирования миграций Rails с учетом SQL схемы?

Ответы [ 2 ]

15 голосов
/ 01 апреля 2011

Конечно, подключите ваше приложение к базе данных, затем запустите

rake db:schema:dump

. Это даст вам db / schema.rb, готовый со всеми вашими определениями.Теперь, когда у вас есть этот db / schema.rb, просто скопируйте содержимое объявления в новую миграцию.Я делал это раньше, и это прекрасно работает.

5 голосов
/ 09 сентября 2012

Я предпочитаю просто написать метод up начальной миграции с помощью вызовов SQL:

class InitialDbStructure < ActiveRecord::Migration
    def up
        execute "CREATE TABLE abouts (
            id INTEGER UNSIGNED AUTO_INCREMENT,
            updated_at TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
            created_at TIMESTAMP,

            title VARCHAR(125),
            body MEDIUMTEXT,

            CONSTRAINT PK_id PRIMARY KEY (id),
            INDEX ORDER_id (id ASC)
            ) ENGINE=InnoDB;"
        end

ПРИМЕЧАНИЯ

  • Вы обнаружите, особенно если вы часто перестраиваете и заново заполняете таблицы (rake db: drop db: create db: schema: load db: fixtures: load), что инструкции execute выполняются намного быстрее, чем интерпретируются Синтаксис Ruby. Например, нашим таблицам требуется более 55 секунд для восстановления из миграций Rails в синтаксисе Ruby, тогда как операторы execute заново генерируют и повторно заполняют наши таблицы за 20 секунд. Это, конечно, является существенной проблемой в проектах, где первоначальный контент регулярно пересматривается или спецификации таблиц регулярно пересматриваются.

  • Возможно, что не менее важно, вы можете сохранить эту скорость перестроения и повторного заполнения, поддерживая единственную исходную миграцию в исполняемом синтаксисе SQL и повторно выполняя миграции (этого отдельного файла), сначала потрокая ваш schema.rb, а затем запустив rake db: сброс перед повторным заполнением ваших таблиц. Убедитесь, что вы установили: version => 0, так что вы получите новую схему, верную для вашей миграции:

    ActiveRecord::Schema.define(:version => 0) do  
    end
    
...