ビューの作成と検索

昨日作ったプログラムにビューの作成と検索を追加してみる。

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