2017-07-16 60 views
0

所以我想讓用戶添加一個項目和一個任意的類別。現在我使用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

使用unique約束,

從引用的SQLAlchemy的docs

獨特 - 如果爲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') 
    ) 
+0

所以用這個我能不能擺脫我檢查了一個新的類別? – nanomosfet

+0

是的,但你應該嘗試一下,因爲如果有人試圖創建一個重複的數據,你應該能夠安全地處理它,它應該拋出和異常。 –

+0

如果我刪除恰好是類別最後一個的項目,它是否也會自動刪除該類別?'db_session.delete(user_object)' – nanomosfet