autoload を使用して既存のデータベースを使用したいと考えています。宣言構文 (model/_init _.py )なしでそれを行う方法を知っています。
def init_model(engine):
"""Call me before using any of the tables or classes in the model"""
t_events = Table('events', Base.metadata, schema='events', autoload=True, autoload_with=engine)
orm.mapper(Event, t_events)
Session.configure(bind=engine)
class Event(object):
pass
これは問題なく動作しますが、宣言構文を使用したいと思います。
class Event(Base):
__tablename__ = 'events'
__table_args__ = {'schema': 'events', 'autoload': True}
残念ながら、この方法で次のようになります。
sqlalchemy.exc.UnboundExecutionError: このテーブルのメタデータにバインドされているエンジンはありません。autoload_with=<someengine> を介してエンジンをテーブルに渡すか、metadata.bind=<someengine> を介して MetaData をエンジンに関連付けます。
ここでの問題は、モデルをインポートする段階でエンジンをどこから取得するか (autoload_with で使用するため) がわからないことです (init_model() で利用可能です)。追加してみました
meta.Base.metadata.bind(engine)
environment.py に追加しましたが、機能しません。エレガントな解決策を見つけた人はいますか?