对此有很多问题,我尝试了各种组合,但无法使其发挥作用。 我希望能够将我的模型文件分成单独的文件。
我有以下结构
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
时,它就会消失。 不知何故,它找不到模型目录中的其他文件
我定义
\_\_init\_\_.py
的方式有问题吗?
问题可能在于:
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
的新文件,以避免出现问题。