如何在 SQLAlchemy 中使用单独的模型文件

问题描述 投票:0回答:1

对此有很多问题,我尝试了各种组合,但无法使其发挥作用。 我希望能够将我的模型文件分成单独的文件。

我有以下结构

app.py
db
   Database.py
   models
      __init__.py
      City.py
      Meteo.py

models.__init__.py
中,我包括了所有模型

from sqlalchemy.orm import DeclarativeBase

import City
import Meteo

class ModelBase(DeclarativeBase):
    pass

metadata = ModelBase.metadata

Database.py
包含数据库的初始化

from sqlalchemy import URL, create_engine

from db.models import metadata

engine = create_engine("   ")


def create_tables(engine):
    metadata.create_all(engine)


# Print the names of all tables in the database
def print_all_tables(engine):
    metadata.reflect(bind=engine)

    tables = metadata.tables.keys()

    print("List of tables:")
    for table in tables:
        print(f'    {table}')

app.py
包含模型并尝试创建所有表格

from db.Database import engine, create_tables, print_all_tables
from views.calibration_views import calibration
import db.models


create_tables(engine)

print_all_tables(engine)

if __name__ == '__main__':
    app.run()

为了完整起见,

City.py
看起来像这样:

from sqlalchemy import String, Integer
from sqlalchemy.orm import mapped_column, relationship

from db.models import ModelBase


class City(ModelBase):
    __tablename__ = 'city'
    city_id = mapped_column(Integer, primary_key=True)
    city_name = mapped_column(String)
    city_climate = mapped_column(String)
    city_meteo_data = relationship("Meteo", backref="city")

但是当 Database.py 包含

db.models
时,它就会消失。 不知何故,它找不到模型目录中的其他文件

enter image description here

我定义

\_\_init\_\_.py
的方式有问题吗?

python sqlalchemy
1个回答
0
投票

问题可能在于:

from sqlalchemy.orm import DeclarativeBase

import City
import Meteo

class ModelBase(DeclarativeBase):
    pass

metadata = ModelBase.metadata

您需要更改导入

from sqlalchemy.orm import DeclarativeBase

import models.City # or import .City
import models.Meteo # or import .City

class ModelBase(DeclarativeBase):
    pass

metadata = ModelBase.metadata

但我还应该提到,定义模型的顺序可能是循环的。首先导入模型,然后定义这些模型继承的基类。最好将

ModelBase
移动到其他位置,例如,在同一目录中创建一个名为
base.py
的新文件,以避免出现问题。

© www.soinside.com 2019 - 2024. All rights reserved.