项目和类别数据库关系

时间:2017-07-16 04:35:10

标签: python sqlalchemy

所以我想让用户添加一个项目和一个任意类别。现在我使用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()

您愿意提出任何其他建议我很乐意倾听。

1 个答案:

答案 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')
    )