You need to enable JavaScript to run this app. SQLAlchemy如何设置列仅在对应外键关联对象下唯一?
优惠活动
大模型
产品
解决方案
定价
更多

SQLAlchemy如何设置列仅在对应外键关联对象下唯一?

调整方案

你需要将原来单字段的全局唯一约束,替换为text和user_id的联合唯一约束,具体修改如下:

  1. 首先在导入部分新增UniqueConstraint的导入
  2. 去掉text字段上的unique=True参数
  3. 给Todo模型添加__table_args__属性配置联合唯一约束

修改后的完整代码如下:

from sqlalchemy import Column, Integer, String, Boolean, ForeignKey, UniqueConstraint
from sqlalchemy.orm import relationship

from database import Base

class Todo(Base):
    __tablename__ = 'todos'
    # 配置联合唯一约束
    __table_args__ = (
        UniqueConstraint('text', 'user_id', name='unique_todo_text_per_user'),
    )
    id = Column(Integer, primary_key=True, index=True)
    # 去掉原来的unique=True参数
    text = Column(String)
    user_id = Column(Integer, ForeignKey('users.id'))

    user = relationship("User", back_populates="todos")

class User(Base):
    __tablename__  = 'users'
    id = Column(Integer, primary_key=True, index=True)
    username = Column(String, unique=True, index=True)
    hashed_password = Column(String)
    is_active = Column(Boolean, default=True)

    todos = relationship("Todo", back_populates="user")

生效说明

  • 如果你的项目还处于开发阶段,数据库表还未正式创建,修改完成后重新初始化表结构即可生效
  • 如果表已经创建且存在数据,SQLite本身不支持直接修改原有约束,你可以选择删除旧表后重建,或者使用Alembic等迁移工具生成兼容SQLite的迁移脚本完成约束更新。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.22 03:15:03