如何解决SQLAlchemy InvalidRequestError:用户与习惯模型关联报错
问题解决:SQLAlchemy关联模型报错InvalidRequestError
错误原因
- Users模型缺少对应关联字段:Habits类中
user字段用back_populates="users_habit"指定了反向关联,但Users类里未定义users_habit这个relationship属性,SQLAlchemy找不到对应映射抛出错误。 - 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
相关产品推荐
相关产品推荐

