ビューの作成と検索
昨日作ったプログラムにビューの作成と検索を追加してみる。
db_construct.py
...(略)... statements = [ ...(略)... ("CREATE VIEW person_customer AS " "SELECT * FROM customer " "INNER JOIN person ON customer.id = person.customer_id") ] ...(略)...
db_test.py
...(略)... metadata = MetaData() metadata.reflect(bind=engine, views=True) ...(略)... class PersonCustomer: pass ...(略)... mapper(PersonCustomer, metadata.tables['person_customer'], primary_key=[metadata.tables['person_customer'].get_children()[0]]) ...(略)... for i in session.query(PersonCustomer).order_by(PersonCustomer.id): print(i.id, i.name, i.customer_id) ...(略)...
reflect メソッドの引数 views を True にしないと、ビューは対象とされない。mapper 関数では、primary_key の指定をする。ビューのメタデータを reflect で取得した場合、PRIMARY_KEY がテーブル定義に存在していない。mapper 関数は PRIMARY_KEY を必要とするらしく、エラーとなる。primary_key 引数に Column のリストを渡して、PRIMARY_KEY を設定する。
参考:
http://omake.accense.com/static/doc-ja/sqlalchemy/reference/sqlalchemy/schema.html#sqlalchemy.schema.MetaData.reflect
http://omake.accense.com/static/doc-ja/sqlalchemy/metadata.html#id5
http://omake.accense.com/static/doc-ja/sqlalchemy/reference/orm/mapping.html?highlight=mapper#sqlalchemy.orm.mapper