我会尽量按顺序解释,这样我的问题就清楚了。根据课文执行的简化代码:
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可操作性来保持类似的文件结构吗?
1条答案
按热度按时间kognpnkq1#
在调用
create_all
之前,解释器必须读取每个模型类,否则它们将不在元数据中,因此不会被创建。1.在模块中定义
Base
。1.所有声明模型类的文件都必须导入定义
Base
的模块,并 * 使用Base
作为它们的超类 *。1.在(比如)
main.py
中,导入Base
和所有模型类(以便解释器读取它们),然后执行Base.metadata.create_all()
。您可以稍微调整一下上面的步骤,但是要明白,通常您无法在同一个文件中声明
Base
和执行create_all()
,而不创建循环依赖项