SQLAlchemy配置外键抛出NoReferencedTableError如何排查解决
报错信息
sqlalchemy.exc.NoReferencedTableError: Foreign key associated with column '('workers',).planning_id' could not find table 'planning' with which to generate a foreign key to target column 'id'
报错原因
核心问题是两个ORM模型类的__tablename__属性赋值末尾多写了一个英文逗号:
- Python语法中,赋值语句末尾尾随逗号会自动将右侧值转为单元素元组,因此代码中实际注册到SQLAlchemy元数据的表名是
('workers',)和('planning',)两个元组,而非预期的字符串"workers"、"planning" - 外键配置
ForeignKey("planning.id")是按字符串表名"planning"查找关联表,自然匹配不到被注册为元组类型的表名,直接触发找不到关联表的错误 - 报错信息里出现的
('workers',).planning_id已经明确提示了表名被解析为元组的异常状态
修复方案
- 删除两个模型类中
__tablename__赋值行末尾的多余逗号,确保表名为合法字符串类型 - (可选优化)修正uuid字段的默认值写法,原代码
str(uuid4)是把函数对象转字符串,不会生成随机uuid,需要改为调用函数uuid4()
修复后的完整模型代码如下:
import sqlalchemy from sqlalchemy import ForeignKey from sqlalchemy.orm import relationship from uuid import uuid4 from sqlalchemy.orm import declarative_base Base = declarative_base() class Workers(Base): __tablename__ = "workers" id = sqlalchemy.Column(sqlalchemy.Integer, primary_key=True) uuid = sqlalchemy.Column(sqlalchemy.String(32), default=lambda: str(uuid4())) first_name = sqlalchemy.Column(sqlalchemy.String(500), nullable=True) last_name = sqlalchemy.Column(sqlalchemy.String(500), nullable=True) job_uuid = sqlalchemy.Column(sqlalchemy.String(32), default=lambda: str(uuid4()), nullable=True) arrival_date = sqlalchemy.Column(sqlalchemy.DateTime, nullable=True) updated_at = sqlalchemy.Column(sqlalchemy.DateTime, nullable=False) created_at = sqlalchemy.Column(sqlalchemy.DateTime, nullable=False) planning_id = sqlalchemy.Column(sqlalchemy.Integer, ForeignKey("planning.id")) class Planning(Base): __tablename__ = "planning" id = sqlalchemy.Column(sqlalchemy.Integer, primary_key=True) uuid = sqlalchemy.Column(sqlalchemy.String(32), default=lambda: str(uuid4())) day = sqlalchemy.Column(sqlalchemy.Integer) job_uuid = sqlalchemy.Column(sqlalchemy.String(32), default=lambda: str(uuid4()), nullable=True) worker_uuid = sqlalchemy.Column(sqlalchemy.String(32), default=lambda: str(uuid4())) created_at = sqlalchemy.Column(sqlalchemy.DateTime) updated_at = sqlalchemy.Column(sqlalchemy.DateTime) schedule = sqlalchemy.Column(sqlalchemy.JSON) workers = relationship("Workers", backref="planning")
内容的提问来源于stack exchange,提问作者Ben
相关产品推荐
相关产品推荐

