既存のスキーマで動作する新しい Rails アプリケーションを作成しています。スキーマ SQL が与えられましたが、Rails 移行を作成して、開発中のデータベースにデータを入力したいと考えています。スキーマはそれほど複雑ではなく、約 20 個のテーブルがありますが、移行を手動で作成して時間を無駄にしたり、タイプミスのリスクを冒したりしたくありません。
スキーマの SQL を指定して Rails マイグレーションを生成する方法はありますか?
既存のスキーマで動作する新しい Rails アプリケーションを作成しています。スキーマ SQL が与えられましたが、Rails 移行を作成して、開発中のデータベースにデータを入力したいと考えています。スキーマはそれほど複雑ではなく、約 20 個のテーブルがありますが、移行を手動で作成して時間を無駄にしたり、タイプミスのリスクを冒したりしたくありません。
スキーマの SQL を指定して Rails マイグレーションを生成する方法はありますか?
もちろん、アプリケーションをデータベースに接続してから実行してください
rake db:schema:dump
これにより、すべての定義を含む db/schema.rb の準備が整います。db/schema.rb ができたので、宣言内の内容を新しい移行にコピーするだけです。私はこれを以前にやったことがありますが、うまくいきます。
SQL 実行呼び出しを使用して、最初の移行の up メソッドを単純に記述することを好みます。
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 構文よりもはるかに高速に実行されることがわかります。たとえば、Ruby 構文の Rails 移行からテーブルを再構築するには 55 秒以上かかりますが、execute ステートメントはテーブルを 20 秒で再生成して再入力します。これはもちろん、初期コンテンツが定期的に改訂されるプロジェクトや、テーブルの仕様が定期的に改訂されるプロジェクトでは重要な問題です。
おそらく同じくらい重要なことですが、実行された SQL 構文で単一の元の移行を維持し、最初に schema.rb を削除してから re の前に rake db:reset を実行することで (その単一ファイルの) 移行を再実行することで、この再構築と再移植の速度を維持できます。 -テーブルにデータを入力します。:version => 0 を設定して、移行に忠実な新しいスキーマを取得するようにしてください。
ActiveRecord::Schema.define(:version => 0) do
end