LoginSignup
5
7

More than 5 years have passed since last update.

sqlalchemyでテーブルを動的に取得

Last updated at Posted at 2015-06-10

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)
5
7
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
7