すでに生成済みのテーブルに対して処理がしたくてSQLAlchemyでリフレクションしたテーブルをセッション管理しようとした時に変にはまったので、まとめ。
結論的にはautomap_base()を使えばいいだけ。
尚、sclalchemyを全然理解できていないので、指摘歓迎。
前提条件
- mac(OS X El Capitan バージョン 10.11.5)
- python 2.7.9
- MAMP
- mysqlでデータベース、テーブル生成済み
ソースコード例
session.py
# -*- coding: utf-8 -*-
import sys
import sqlalchemy
from sqlalchemy.ext.automap import automap_base
from sqlalchemy.orm import sessionmaker
def main(sys_argv):
# MAMP + Mysql-Python環境でのエンジン生成方法
engine = sqlalchemy.create_engine(
"mysql://user_name:password@localhost/db_name"
+ "?unix_socket=/Applications/MAMP/tmp/mysql/mysql.sock",
echo=False)
# セッション開始
session = sessionmaker(bind=engine)()
# mappedなinstanceをリフレクションを使った上で生成
base = automap_base()
base.prepare(engine, reflect=True)
# 適当にやりたいことを
# your_tableテーブルからdelete_flagが0なidを表示するなら
your_table = base.classes.your_table
result = session.query(your_table).filter(delete_flag == 0)
for row in result:
print row.id
# セッション終了
session.close()
if __name__ == '__main__':
main(sys.argv)