如何跨文件对 sqlalchemy orm 对象使用 create_all()
how to use create_all() for sqlalchemy orm objects across files
我在 a.py
中声明了多个 orm 类:
Base = declarative_base()
class Message(Base):
__tablename__ = "message"
__table_args__ = {"schema": "stocktwits"}
id = Column(BigInteger, primary_key=True)
user_id = Column(BigInteger, nullable=False)
body = Column(String, nullable=False)
created_at = Column(DateTime, nullable=False)
__table_args__ = (
Index("created_at_idx", created_at),
)
...
我正在另一个文件中初始化数据库b.py
:
def init_db(self):
engine = create_engine(db_url)
meta.create_all(engine)
session = sessionmaker(bind=engine)()
关于这样的结构我有两个问题:
首先,当我在b.py
中调用方法meta.create_all(engine)
时,如何引用我在a.py
中声明的orm对象?我应该使用 Base.metadata.create_all(bind=engine)
吗?在那种情况下,我必须找出一种跨文件共享 Base
对象的方法。
其次,在调用 meta.create_all()
之前我有 read posts about 导入对象,因为 python 不允许在函数中导入通配符,这是否意味着我必须导入我的所有 orm单独对象,例如 from a.py import a, b, c, d, ....
Should I use Base.metadata.create_all(bind=engine)?
是 - 从 Base
继承的所有模型 类 都在其 metadata
中注册,因此调用 Base.metadata.create_all(engine)
将创建所有关联表。
In that case I have to figure out a way to share the Base object across files
from a import Base
in b.py
应该足够了。显然你应该只定义一次 Base
。
我在 a.py
中声明了多个 orm 类:
Base = declarative_base()
class Message(Base):
__tablename__ = "message"
__table_args__ = {"schema": "stocktwits"}
id = Column(BigInteger, primary_key=True)
user_id = Column(BigInteger, nullable=False)
body = Column(String, nullable=False)
created_at = Column(DateTime, nullable=False)
__table_args__ = (
Index("created_at_idx", created_at),
)
...
我正在另一个文件中初始化数据库b.py
:
def init_db(self):
engine = create_engine(db_url)
meta.create_all(engine)
session = sessionmaker(bind=engine)()
关于这样的结构我有两个问题:
首先,当我在b.py
中调用方法meta.create_all(engine)
时,如何引用我在a.py
中声明的orm对象?我应该使用 Base.metadata.create_all(bind=engine)
吗?在那种情况下,我必须找出一种跨文件共享 Base
对象的方法。
其次,在调用 meta.create_all()
之前我有 read posts about 导入对象,因为 python 不允许在函数中导入通配符,这是否意味着我必须导入我的所有 orm单独对象,例如 from a.py import a, b, c, d, ....
Should I use Base.metadata.create_all(bind=engine)?
是 - 从 Base
继承的所有模型 类 都在其 metadata
中注册,因此调用 Base.metadata.create_all(engine)
将创建所有关联表。
In that case I have to figure out a way to share the Base object across files
from a import Base
in b.py
应该足够了。显然你应该只定义一次 Base
。