4

Rails 2.3.8 から 3.2.3 にアプリを移行しています。「rake db:schema:dump」は Rails 2.3 では問題なく動作しますが、Rails 3.2 では列名のないテーブル名のみを生成します。

アプリがコンソール経由で正常に接続する場合でも、config/application.rb を変更して含める必要がありました。

ActiveRecord::Base.table_name_prefix = 'dbo.'

rake タスクがこれらのプレフィックスを取得するために何か別のことをする必要がありますか? または、列名が見つからないという問題を引き起こしている何か他のものがありますか?

さらなる明確化: サイトのプログラマーが移行の使用を停止し、db に直接変更を加え始めたため、rake db:schema:dump を探しています。今、移行を使用して再起動しようとしています。このプロセスで推奨される最初のステップは、スキーマ ダンプを出発点として使用することです。また、(私にはわかりませんが)テスト用に、開発用データベースからテスト用データベースを再構築する必要があります。

4

1 に答える 1

5

簡潔な答え:

db:schema:dump使用するのは適切ではありませんが、Rakefile に数行のコードを追加して、必要な結果を得ることができます。

より長い答え:

問題は、タスクdb:schema:dumpが実際には構造体以外のものをダンプすることは想定されていないということです。(私は知っています、それは誤称です。) に似てdb:structure:dumpいますが、一方が .rb ファイルを提供し、もう一方が .sql ファイルを提供する点が異なります。

次のコードを Rakefile に追加することで、独自のダンプ rake タスクを作成できます。

SQL 2008 の場合

task :mydump do
  ActiveRecord::Base.connection.execute(
    "dbcc traceon(2544, -1) \n go \n dbcc traceon(2546, -1) \n go \n dbcc stackdump"
  )
end

SQL サーバー自体を使用してダンプを作成すると (これは前述のコードが行うことです)、ダンプは常にログ ディレクトリに移動するため、制限があります。それ以外は指定できません。

SqlDumper などのユーティリティを使用すると、より自由になります。メソッドを使用してコマンド ラインから実行することにより、rake タスクからこのようなユーティリティを呼び出すことができますsystem。(mysqldump ユーティリティを使用する以下の MySQL の例を参照してください。)

(SQL 2008 をインストールしていないため、上記のコードはテストしていませんが、SQL サーバーでダンプを作成するための生の SQL コードについては、このブログで説明しています。)

rake タスクの実行

次に、コマンド ラインでrake mydumporを呼び出しますrake mydump RAILS_ENV=production

MySQL の場合

次のようにして、MySQL に対して同様のことを行うことができます。

task :mydump do
    config   = Rails.configuration.database_configuration[Rails.env]
    system "mysqldump -h #{config["host"]} -u #{config["username"]} -p#{config["password"]} #{config["database"]} > db/dump.sql"
end
于 2012-06-08T16:01:54.680 に答える