SQLAlchemy如何设置列仅在对应外键关联对象下唯一?
调整方案
你需要将原来单字段的全局唯一约束,替换为text和user_id的联合唯一约束,具体修改如下:
- 首先在导入部分新增
UniqueConstraint的导入 - 去掉
text字段上的unique=True参数 - 给
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
相关产品推荐
相关产品推荐

