SQLAlchemy を使用してデータベースと対話するためのライブラリを作成しています。autoload_with=engine
SQLAlchemy の機能がとても気に入っています。Table
コンストラクターに渡して、プログラマーが明示的に定義しなくても、テーブルのすべての列を取得できます。
「something」という名前のテーブルの基本的なアプローチは次のとおりです。
Base = declarative_base()
engine = create_engine('mysql://user:pass@host/db_name')
table = Table('something', Base.metadata, autoload_with=engine)
class Something(Base):
__table__ = table
ただし、(異なるホスト上に) データベースの複数のバージョンがあるため、実行時にエンジンをパラメーターとして渡す必要があります。モジュールでこのようなものを書くという考えはちょっと嫌いですが、より良いアプローチをブランクにしています:
Base = declarative_base()
Something = None # gets defined after initialize() is called
def initialize(engine):
table = Table('something', Base.metadata, autoload_with=engine)
class _Something(Base):
__table__ = table
global Something
Something = _Something
そして、クライアント コードは、SQLAlchemy モデルを使用する前に、次のようなやっかいなことをしなければなりません。
import custom_db_api
engine = create_engine(...)
custom_db_api.initialize(engine)
外部の呼び出し元によるこの種のモジュールの初期化を処理するためのより良い方法はありますか?