以下の記事で作成したメモアプリのデータ保存先をPostgreSQLに変更しました。
学んだこと✏️
1.pgのインストール
- RubyからPostgreSQLを使用するためのgemであるpgをインストール。
2.DBに接続、テーブルを定義
PG.connectでDBに接続できる。
- DBに接続するのは重い処理な為、インスタンス変数に接続情報をキャッシュ。
アプリ起動時に一度だけ行う処理configurationが使用できる。
PostgreSQLのシステムテーブルtablesから作成したテーブルの存在を確認できる。
- システムカタログ ...リレーショナルデータベース管理システムがテーブルや列の情報などのスキーマメタデータと内部的な情報を格納する場所。PostgreSQLのシステムカタログは通常のテーブル。
情報スキーマ、 PostgreSQL 言語データベースの情報スキーマ ...標準SQLの機能になり、PostgreSQL以外でも(対応しているRDBMSの場合)同じSQLで情報を取得できる。DBのシステム情報(メタデータ)を参照するための標準インタフェース。
連番型を設定したカラムには自動で連続する値が格納されていく。
3.各種機能の修正
3-1. メモ一覧の表示機能
開発環境では特に問題がないかもしれないが、PostgreSQLは必ず同じ順番でレコードを取得できるとは限らない為、明示的にORDER BY
した方が良い。
def load_memos conn.exec('SELECT * FROM memos ORDER BY id ASC') end
- PG::Connection.exec
...PostgreSQLにSQLを発行。引数にparamsを指定した際は、自動で
exec_params
が呼ばれる。
3-2. 特定のメモの表示機能
- pg gemでのプラスホルダーは
$
で始まる。実際の値を割り当てることを「バインドする」という。
今回は以下を使用した。
- PG::Connection.exec_params ...動的プレースホルダで組み立てたSQLを実行。引数に型指定が可能。 SQLインジェクション対策が自動で行われる。
def load_memo(id) result = conn.exec_params('SELECT * FROM memos WHERE id = $1;', [id]) #<PG::Result:0x00000001088f46d0 status=PGRES_TUPLES_OK ntuples=1 nfields=3 cmd_tuples=1> result.tuple(0).values #["1", "メモ1", "メモ1の内容"] end
- 補足:exec_prepared ...静的プレースホルダで組み立てたSQLを実行。
3-3.特定のメモの表示機能とメモの編集機能
- 最初はデータのカラムごとにインスタンス変数を定義していた。これは、カラムが増えるごとに修正が増えてしまうためNG。
@memo
のようにインスタンス変数に格納するよう修正。その後、erb側にて@memo[title]
のように修正。
まとめ
現在Railsの学習を進めていますが、最初は難しく感じたSinatraの学習も Rails全体のイメージを掴む上でとてもいい経験になったと感じることができました!