python-3.x SQLAlchemy:通过不同的文件分离表类

thtygnil  于 2022-12-05  发布在  Python
关注(0)|答案(1)|浏览(197)

我会尽量按顺序解释,这样我的问题就清楚了。根据课文执行的简化代码:

engine = create_engine(...)
session = (...)
Base = declarative_base()

class <someTable>(Base):
    ...

Base.metadata.create_all(bind=engine)

在本例中,一切正常工作。数据库中的一个表正在创建。接下来,我想拆分大量的 (Base) 导入到位于同一文件夹“schemas”中的不同文件中。现在,在启动应用程序后,不会创建表,因为没有“类”的显式定义(Base)”之前的“create_all”。我以为如果导入“Base”在一个单独的文件中,其中一个特定的“类(Base)”,那么这就足够了。首先想到的是在每个CRUD操作之前放置一个“if”条件--如果表不存在,那么“create_all”。首先想到的是在每个CRUD操作之前放置一个“if”条件-如果表不存在,那么“create_all”。
项目的文件结构如下所示:

|project
|
|-|utils
| |-db_api
| |-|db_api
|   |-|schemas
|     |-__init__.py
|     |-<someTable_1>.py #Contains "class <someTable_1>(Base)"
|     |-<someTable_2>.py
|   |-__init__.py
|   |-session.py #there session, Base, and create_all
|   |-<some_db_commands>.py
| |-__init__.py
| |-<some_bot_funcs>.py
|-main.py

这是一个简单的训练电报机器人,它使用“/start”命令在postgres中创建一个表,并在那里写入用户ID。我可以通过实现SQLAlchemy可操作性来保持类似的文件结构吗?

kognpnkq

kognpnkq1#

在调用create_all之前,解释器必须读取每个模型类,否则它们将不在元数据中,因此不会被创建。
1.在模块中定义Base
1.所有声明模型类的文件都必须导入定义Base的模块,并 * 使用Base作为它们的超类 *。
1.在(比如)main.py中,导入Base和所有模型类(以便解释器读取它们),然后执行Base.metadata.create_all()
您可以稍微调整一下上面的步骤,但是要明白,通常您无法在同一个文件中声明Base和执行create_all(),而不创建循环依赖项

相关问题