You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

SQLAlchemy报relation "Cities"不存在 多对多关联建表错误问询

错误原因

你代码的核心问题出在db_init.py的Base实例声明逻辑:

  • models.py中你定义了一个base = declarative_base()实例,所有的模型类(Cities、Sensors)、多对多中间表都绑定在这个base的元数据里
  • 但db_init.py中你又重新实例化了一个全新的base = declarative_base(),这个新的base完全没有关联你定义的任何数据表模型,执行base.metadata.create_all(db)的时候根本不会创建你需要的Cities、Sensors、cities_sensors三张表,所以操作时会提示relation "Cities" does not exist

另外还有一个次要问题:你的PostgreSQL连接串没有指定目标数据库名称,可能会默认连接到系统的postgres库,不符合业务使用规范。
你原有多对多关联的配置本身没有问题,不需要调整。

修复方案

按以下步骤修改db_init.py即可:

  1. 删掉db_init.py中重复的Base导入和实例化代码,改为从models.py导入已经绑定了模型的base实例
  2. 补全数据库连接串中端口后的目标数据库名称(需要你提前在PostgreSQL中创建好对应数据库)

修改后的db_init.py参考代码:

from sqlalchemy import create_engine
from sqlalchemy.orm import sessionmaker
from models import Cities, Sensors, base # 导入models里绑定了模型的base

# 末尾补充你实际使用的数据库名,示例为city_sensor
db_string = "postgresql://postgres:1234@localhost:5438/city_sensor"

db = create_engine(db_string)

Session = sessionmaker(db)
session = Session()

base.metadata.create_all(db) # 此时会正常创建所有关联的表

# 后续插入数据的代码不需要改动
czestochowa_city = Cities(name="Czestochowa")
myszkow_city = Cities(name="Myszkow")
krzepice_city = Cities(name="Krzepice")

temperature_sensor = Sensors(name="temperature",
                             unit="Celsius")
humidity_sensor = Sensors(name="humidity",
                          unit="precentage")
pollution_sensor = Sensors(name="pollution",
                           unit="PM2.5")

session.add(czestochowa_city)
session.add(myszkow_city)
session.add(krzepice_city)
session.add(temperature_sensor)
session.add(humidity_sensor)
session.add(pollution_sensor)

session.commit()

内容的提问来源于stack exchange,提问作者Ignac96

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 14:24:04