我正在编写一个库来使用 SQLAlchemy 与数据库通信。我真的很喜欢 SQLAlchemy 的autoload_with=engine
特性,它可以传递给Table
构造函数来获取表的所有列,而程序员不必显式定义它们。
这是名为“某物”的表的基本方法:
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)
有没有更好的方法来处理外部调用者的这种模块初始化?