所以我想让用户添加一个项目和一个任意类别。现在我使用if语句来确保已经创建了类别,而不是再次添加它。有没有更好的方法来利用SQLAlchemy关系,以便我可以跳过一些我必须编写的逻辑来确保类别是唯一的?
以下是我使用过的模型:
class Category(Base):
__tablename__ = 'category'
id = Column(Integer, primary_key=True)
name = Column(String(250), nullable=False)
class Item(Base):
__tablename__ = 'item'
id = Column(Integer, primary_key=True)
name = Column(String(250), nullable=False)
description = Column(String)
category_id = Column(Integer, ForeignKey('category.id'))
category = relationship(Category)
date_created = Column(DateTime)
date_updated = Column(DateTime)
user_id = Column(Integer, ForeignKey('user.id'))
user = relationship(User)
以下是我将如何编辑项目的示例:
if new_category_name != category.name:
if db_session.query(Category).\
filter_by(name=new_category_name).count() == 0:
new_category = Category(name=new_category_name)
else:
new_category = db_session.query(Category)\
.filter_by(name=new_category_name).one()
is_last_of_category = db_session.query(Item)\
.filter_by(category_id=item.category_id).count() == 1
if is_last_of_category:
db_session.delete(category)
item.category = new_category
db_session.commit()
您愿意提出任何其他建议我很乐意倾听。
答案 0 :(得分:0)
使用unique
约束
引用sqlalchemy的docs
唯一 - 如果为True,则表示此列包含唯一 约束,或者如果索引为True,则表示索引 应该使用唯一标志创建。在中指定多个列 约束/索引或指定显式名称,使用 UniqueConstraint或Index明确构造。
来自sqlalchemy documentation的示例:
from sqlalchemy import UniqueConstraint
meta = MetaData()
mytable = Table('mytable', meta,
# per-column anonymous unique constraint
Column('col1', Integer, unique=True),
Column('col2', Integer),
Column('col3', Integer),
# explicit/composite unique constraint. 'name' is optional.
UniqueConstraint('col2', 'col3', name='uix_1')
)