2016-05-31 11 views
0

私はRoRの開発者です。私は足場などを使用して独自のデータベースを作成しています。しかし、私は既存の人口データベースにレールアプリを作成するように言われました。私が検索し、私はこれを見つけた: 既存のデータベースを使用したRailsアプリケーション

1. write config/database.yml to reference your database. 
2. Run "rake db:schema:dump" to generate db/schema.rb. Here's the 
documentation: 

$ rake -T db:schema:dump 
... 
rake db:schema:dump # Create a db/schema.rb file that can be 
portably used against any DB supported by AR 

3. Convert schema.rb into db/migrate/001_create_database.rb: 

Class CreateMigration < ActiveRecord::Migration 
def self.up 
# insert schema.rb here 
end 

def self.down 
# drop all the tables if you really need 
# to support migration back to version 0 
end 
end 

は、しかし、私はいくつかのコメントは、彼らが自分のデータを失ったことを言って、いくつかそれが働いたと言ってました。私はデータベースからデータを失う可能性はありません。誰かが私にもう少し確かな説明をくれたらいいですか?

+0

既存のデータが格納されているデータベースを使用する必要があるのはなぜですか?既存のアプリケーションがデータベースを共有するために維持されているために、データベースが存在する場合は、しばしば悪い考えです。データベースの所有権を取得している場合は、必ずしも問題はありません。 –

+0

でも、モバイルアプリのデータベースであり、オンラインバックオフィスが必要です。他の提案はありますか? – Boltz0r

+0

私があなたの立場にいる場合は、サンプルコードですべてを行います。ただし、001_create_database.rbの移行ロールバックはサポートされず、schema.rbからデータベースを作成しません。代わりに、私は 'psql#{Rails.configuration.database_configuration [Rails.env] ['host']}のようなコマンドを実行することによって、現在のデータベースのSQLダンプファイルからデータベースを作成するために、マイグレーションファイル001_create_databaseを実際に記述します。 <パス/ to/sql_file'。これにより、データベースが正確であるという確信が得られます。 (この提案はまだ再評価する必要があります) –

答えて

1

Railsはすべての移行ファイルをdb/migrate /でチェックし、すべてが "schema_migrations"テーブルの一部であるかどうかをチェックします。上記のコードは、コードの新しいコピー(Railsプロジェクトのクローンを作成した場合)でのみ動作します。マイグレーションはファイル名の順に実行されるためです。それは00001_create_dなので、私の最後には最初に実行され、続いて他のマイグレーションファイルが実行されます。

すべての移行ファイルが既に移行された後にスキーマコードが実行されるため、移行するとデータが失われる可能性があります。

プロジェクトに取り組んでいる開発者だけですので、単にrake db:migrateをやってみることはできません。また、あなたのプロジェクトの新しいクローナが上記のコードに問題はないでしょう。 001_create_database.rbは既にあなたのschema_migrationsテーブルの一部になっているので、それをスキップしますが、(自分のような)新しいクローナはスキップしません。

重要

:作成した後、コード

デシベル/移行/ 001_safeguard_create_database.rb

class SafeguardCreateDatabase < ActiveRecord::Migration 
    def up 
    # if current migration version already has a created database 
    if ActiveRecord::Migrator.current_version > 2 
     # force the next migration 002_create_database.rb to be skipped 
     ActiveRecord::SchemaMigration.create(version: '2') 
     # the version '2' above is the version of the file which is (002 becomes 2) 
    end 
    end 
    def down 
    raise ActiveRecord::IrreversibleMigration 
    end 
end 

デシベル/移行/ 002_create_database.rb

class CreateDatabase < ActiveRecord::Migration 
    def up 
    # your schema.rb here 
    end 
    def down 
    raise ActiveRecord::IrreversibleMigration 
    end 
end 

の下に行う前に、最初のバックアップデータベースをこれら2つのファイルは、rake db:migrateを試してください。 001_safeguard_create_databaseのみ処理し、002_create_databaseをスキップする必要があります。これは、現在のDBが既に設定されているとみなされるためです。 002_create_databaseは、DBをまだ持っていない新規のプロジェクトユーザーに対してのみ実行されます。これらのユーザーの場合、これらの最初の2つの移行ファイルが最初に実行され、その後に他のすべての移行が実行されます。

+0

私はすでにマイグレーションを実行し、スキーマをダンプし、-no migrationを使って足場を作成しますが、正しいのであなたの答えを受け入れるでしょう:) – Boltz0r

0

私は同じ問題を抱えていましたが、私は上記の解決策を使用できません。

私のデータベースは、レールのアプリのルビーよりも前に作成された、それが実行したとき、それはそう、schema_migrations表が作成されていませんでしたこの:それはこのようにif文ではfalse、それ決して返さない

if ActiveRecord::Migrator.current_version > 2 
    # force the next migration 002_create_database.rb to be skipped 

    ActiveRecord::SchemaMigration.create(version: '2') 

    # the version '2' above is the version of the file which is (002 becomes 2) 
end 

私の場合は create_databaseの移行をスキップしてください。

私は移行を実行してテーブルを再作成することを避け、同時に新しいコーダーがテーブルを作成してテーブルを作成できる方法を探していました。

は、いくつかの検索の後、私はそう、table_exists?機能が見つかりました:001_create_database.rbdb/schema.rbファイル からスキーマを貼り付け:

  1. を私はその後、私は私の最初の移行を作成しrake db:schema:dump
  2. を使用してスキーマの移行を作成しました
  3. 最後に、それぞれのテーブルを作成する前に、マイグレーションの追加とifのステートメントを編集しました。

    if !table_exists?("CarsTable") 
        create_table "CarsTable" do |t| 
         t.bigint "Owner", null: false 
         t.string "Color", limit: 20, null: false 
         t.string "Make", limit: 40, null: false 
         t.string "Model", limit: 20, null: false 
         t.string "Plate", limit: 10, null: false 
        end 
    end 
    

私はこれを2つの方法でテストしました。データベースは以前に作成され、作成され、(実際のケースと自分のケースでは)データベースなしで(新しいコーダーの場合)動作しました。

関連する問題