2011-01-26 7 views
2

私はRuby Railsの基本的なJavaプログラマーと初心者でした。 javaでは、データベースのantタスクを実行すると、antタスクはSQLスクリプトを実行します。 SQLスクリプトは基本的に挿入文のセットです。Ruby RailsプラットフォームでSQLスクリプトを実行してmysqlデータベースにシードする方法は?

sqlスクリプトを実行するためのRuby Railsプラットフォームには、antタスクと同等のものが必要ですか?ニキータによって答えに応じて編集

1は、データを播種ための方法の一つとして、移行を使用することができますが。しかし、私はSQLスクリプトに対応する移行クラスを書き直すことをやり直したくありません。だから私はそれを介してSQLスクリプトファイルを実行する必要があるいくつかのソリューションが必要です。私はSQLコードを介してのみデータベースで管理したい。

答えて

2

コンソールからレールアプリケーションを生成した場合は、db/seeds.rbファイルが必要です。データベース表にデフォルト値を設定します。

rake db:seedを実行できます。

自動生成seeds.rb

は、あなたが(通常は)それに任意のSQL文を入れていないことを、

# This file should contain all the record creation needed to seed the database with its default values. 
# The data can then be loaded with the rake db:seed (or created alongside the db with db:setup). 
# 
# Examples: 
# 
# cities = City.create([{ :name => 'Chicago' }, { :name => 'Copenhagen' }]) 
# Major.create(:name => 'Daley', :city => cities.first) 

注疑問をクリアする必要があり、この例が含まれています。シードファイルまたは移行からsqlを実行することはできますが、ルビコードとモデルを使用することが推奨されます。

コメント
「シード」の意味を理解しているのかもしれません。
とにかく、migrationsがお手伝いします。
私のポストでそれをカバーするには大きすぎるトピックですので、ガイドをお読みください。表の作成/削除に重点を置いていますが、移行時にもデータを操作できます。

+0

デフォルト値は必要ありません。私はデータベースに多くのデータをシードしたい、その目的のために私はSQLスクリプトを実行する必要があります。 db/seeds.rbには、デフォルト値をダンプするためのステートメントがないとコメントされたコード行があります。 –

+0

Maddy.Shik - Nikitaは正しいです、あなたは種を使って実行するべきです。既存のデータをデータベースにインポートするだけの場合は、レールの外でスクリプトを実行してください。 –

+0

@Maddy * "db/seeds.rbには、デフォルト値をダンプするステートメントがないとコメントされたコード行があります。" *解明できますか? –

5

個人的には、マイグレーションを使用して大量の「静的」データをシードすることは嫌いです。 、基本的に

# Empty the soon-to-be-seeded table 
MyModel.delete_all 

# Get the current DB connection 
connection = ActiveRecord::Base.connection(); 

# Execute a sql statement 
connection.execute("Insert INTO my_models (id, name) VALUES 
    (1, 'Example 1'), 
    (2, 'Example 2'), 
    (3, 'Example 3');") 

あなたは現在の接続を持っていたら、あなただけconnection.execute("SQL CODE HERE")をuseing SQLステートメントを呼び出すことができます。あなたは簡単でdb/seeds.rbからSQL文を実行することができます。

0

初期状態では、静的データはシードファイルを推奨どおりに使用します。

他の目的では、insertステートメント全体をアクティブなレコードステートメント内にラップすることができます。 find_by_sql(「mytable(col1、col2)の値(1,2)に挿入」)。 "find by"は素晴らしい読み物ではありませんが、それを行うでしょう。
ActiveRecord::Base.connection.execute(sql)を使用して、そこにSQLを置くこともできます。あなたが挿入物などを持っていても実行されます。 yuに複数のステートメントがある場合、通常は;が必要です。

関連する問題