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

如何解决SQLAlchemy InvalidRequestError:用户与习惯模型关联报错

问题解决:SQLAlchemy关联模型报错InvalidRequestError

错误原因

  1. Users模型缺少对应关联字段:Habits类中user字段用back_populates="users_habit"指定了反向关联,但Users类里未定义users_habit这个relationship属性,SQLAlchemy找不到对应映射抛出错误。
  2. Habits的habit字段定义错误:relationship是用来关联不同模型的,不能用来存储字符串列表,需改用JSON类型字段保存这类数据。

修改后的代码

Users模型

from ..models import Base
from sqlalchemy.orm import Mapped, mapped_column, relationship
from sqlalchemy import String
from typing import List


class Users(Base):
    
    __tablename__ = "users"
    
    id: Mapped[int] = mapped_column(primary_key=True, autoincrement=True)
    telegram_id: Mapped[int] = mapped_column(nullable=False)
    username: Mapped[String] = mapped_column(String(50), nullable=False)
    # 补上mapped_column定义,否则会触发字段定义错误
    phone_number: Mapped[int] = mapped_column(nullable=False)
    
    # 添加与Habits的关联,反向对应Habits里的user字段
    users_habit: Mapped[List["Habits"]] = relationship(back_populates="user")

Habits模型

from typing import List
from ..models import Base
from sqlalchemy import ForeignKey, JSON
from sqlalchemy.orm import Mapped, relationship, mapped_column


class Habits(Base):
    
    __tablename__ = "users_habits"
    
    # 添加主键,SQLAlchemy要求每个模型必须有主键
    id: Mapped[int] = mapped_column(primary_key=True, autoincrement=True)
    user_id: Mapped[int] = mapped_column(ForeignKey("users.id"), nullable=False)
    # 关联Users模型,反向对应Users里的users_habit字段
    user: Mapped["Users"] = relationship(back_populates="users_habit")
    # 用JSON类型存储字符串列表,适配SQLAlchemy 2.0+的Mapped类型
    habit: Mapped[List[str]] = mapped_column(JSON, nullable=False)

额外注意事项

  • 确保两个模型都导入了所需模块(比如Users需要导入relationship和List,Habits需要导入JSON)。
  • 若使用Python 3.7及以上,可在文件顶部添加from __future__ import annotations,这样模型前向引用(比如"Habits")可去掉引号直接写Habits。
  • 若使用数据库迁移工具(如Alembic),需执行迁移命令让修改后的表结构生效。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.23 03:00:54