RailsとPostgresのスキーマ

入門


最近、DBMSとしてPostgresを使用し始めました。 私はその中のスキームに非常に惹かれています、またはそれらはしばしば名前空間と呼ばれるので、これは確かに唯一の美徳であり、主要なものでさえありませんが、ただの些細なことです。 したがって、私の友人と私がパイロットプロジェクトについて考え始めたとき、当然、DBMSとして、Postgresを選択しました。 しかし、あなたが望むようにレールに置くことは初心者にとってそれほど簡単ではありませんでした...

私が最初にしたことは、レール上でプロジェクトを作成することでした:

rails <project name> -d postgresql 


ここではすべてが簡単です。プロジェクトの基本構造が作成され、postgresに接続する設定がdatabase.ymlにすでに作成されています。

 development: adapter: postgresql encoding: unicode database: app_development pool: 5 username: www password: 123 host: localhost port: 5432 


はい、すべてが機能するためには、gemを接続することを忘れないでください-pg :-)

問題


スキームを作成するための移行を作成できない、またはむしろ作成できるという事実に直面しましたが、この移行後にこのスキームでテーブルを作成したい別のものがあれば、問題が始まります...そのため、スキームを作成してすぐにその中にテーブルを作成することはできません。

基本的に、スキームを手動で作成したくありませんでした。プロセスを自動化したいという要望がありました。

 rake db:migrate 

これで完了です。

私がやろうとしたこと


database.yml search_pathに追加:「app、public」-役に立たなかった。 アプリスキームを作成する移行の開始時点ではまだ存在しないため、アプリケーションはデータベースに接続できません。 search_pathに近づかないとすぐに、うまくいきませんでした。

次に、rake-task db:migrateをカスタマイズしました。 私はそれをひねりました、それはうまくいかなかった、何かとそれはうまくいかなかった。

私に合ったオプション


すべての移行をディレクトリに入力することにし、アプリに1つのディレクトリという名前を付けました-アプリスキーマに属するテーブルの移行を追加し、スキーマディレクトリを作成しました-データベースのスキーマを作成するすべての移行はその中にあります
その後、私は考え始めましたが、どうすればスキーマフォルダーにある移行のみを開始し、残りの移行のみを開始できますか。 私は自分のレーキタスクを作成することを検討し始めました。これは次のようになります。

 # ------------------------------------------------------------- # =Description: # Rake task for creating postgres schemas # ------------------------------------------------------------- namespace :db do desc "Run migration for creating schemas" task :create_schemas => :environment do ActiveRecord::Migration.verbose = ENV["VERBOSE"] ? ENV["VERBOSE"] == "true" : true ActiveRecord::Migrator.migrate("db/migrate/schema", ENV["VERSION"] ? ENV["VERSION"].to_i : nil) end end 


非常に簡単なタスク、注意する価値があるもの:


すべての仕組み


ローリング移行の場合、次のことを行います。
 rake db:create_schemas rake db:migrate 

おわりに


私はRubyとRoRを苦しめ始めました.RoRの回路でこの問題に対するより理想的な解決策があるかもしれませんが、現在のバージョンはこれまで私に合っています、誰かが別の、よりシンプルでエレガントな方法を知ることができますか?

Source: https://habr.com/ru/post/J161693/


All Articles