sqlalchemyでテーブルを動的に取得
試したバージョン。
In [1]: import sqlalchemy
In [2]: sqlalchemy.__version__
Out[2]: '1.0.5'
sqlalchemy.Table()
にMetadataとかengine渡してやると、sessionにそのまま渡せる Table
オブジェクトが取得できるらしい。
{ <テーブル名>: sqlalchemy.Table }
のdictにしてモジュール広域に配置してみる。
dbs.py
# -*- coding: utf-8 -*-
import sqlalchemy
import sqlalchemy.ext.declarative
Base = sqlalchemy.ext.declarative.declarative_base()
url = 'mysql://root@127.0.0.1/employees?charset=utf8'
engine = sqlalchemy.create_engine(url, echo=False)
tables = { name: sqlalchemy.Table(name, Base.metadata, autoload=True, autoload_with=engine)
for name in engine.table_names()
}
globals().update(tables)
Session = sqlalchemy.orm.sessionmaker(bind=engine)
session = Session()
employees
テーブルから全件取得。(mysqlのサンプルのやつ)
select.py
# !/usr/bin/env python
# -*- coding: utf-8 -*-
import dbs
for x in dbs.session.query(dbs.employees):
print x
あんま動的なのもどうかと
TODO: 静的なclassの形に書き出すようにするといいかもしれない。
動的にテーブル舐めて、こういう形に吐き出すとか。
こういう形
class Student(Base):
__tablename__ = 'students'
id = sqlalchemy.Column(sqlalchemy.Integer, primary_key=True)
name = sqlalchemy.Column(sqlalchemy.String(255))
kana = sqlalchemy.Column(sqlalchemy.String(255))
def __repr__(self):
return '<name=%s, kana=%s>' % (self.name, self.kana)