【问题标题】:SQLAlchemy: Separation of table classes by different filesSQLAlchemy:通过不同文件分离表类
【发布时间】:2022-11-30 16:25:49
【问题描述】:

我将尝试按顺序解释,以便我的问题清楚。 根据课程执行的简化代码:

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

class <someTable>(Base):
    ...

Base.metadata.create_all(bind=engine)

在这种情况下,一切正常。正在创建数据库中的表。 接下来我要分很多(根据)由位于同一文件夹“模式”中的不同文件组成。现在,启动应用程序后,不会创建表,因为在“create_all”之前没有明确定义“class (Base)”。 我认为如果在注册了特定“类(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 可操作性来保持类似的文件结构吗?

【问题讨论】:

    标签: python python-3.x sqlalchemy orm


    【解决方案1】:

    在调用create_all 之前,解释器必须读取每个模型类,否则它们将不在元数据中,因此不会被创建。所以你需要做的是:

    1. 在模块中定义Base
    2. 所有声明模型类的文件必须导入定义Base的模块,并且使用 Base 作为他们的超类.
    3. 在(比如)main.py中,导入Base和所有模型类(以便解释器读取它们)然后执行Base.metadata.create_all()

      您可以稍微调整上述步骤,但请理解,通常您将无法在不创建循环依赖的情况下在同一文件中声明 Base 并执行 create_all()

    【讨论】:

      猜你喜欢
      • 2015-05-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-01-25
      • 1970-01-01
      • 2020-12-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多