我有一個類:SQLAlchemy的更新,如果唯一的密鑰存在
class Tag(Base, TimestampMixin):
"""Tags"""
__tablename__ = 'tags'
__table_args__ = {'mysql_engine' : 'InnoDB', 'mysql_charset' : 'utf8' }
id = Column(Integer(11), autoincrement = True, primary_key = True)
tag = Column(String(32), nullable = False, unique = True)
cnt = Column(Integer(11), index = True, nullable = False, default = 1)
def __init__(self, tag):
t = session.query(Tag).filter_by(tag=tag).first()
if t:
self.cnt = t.cnt+1
self.tag = t.tag
else:
self.tag = tag
def __repr__(self):
return "<Tag('%s')>" % (self.tag,)
def __unicode__(self):
return "%s" % (self.tag,)
當添加標籤:
tag = Tag('tag')
session.add(tag)
session.commit()
我想它來更新現有tag
。
當然,我可能已經做到了這一點:
tag = session.query(Tag).filter_by(tag='tag').first()
if tag:
tag.cnt++
else:
tag = Tag('tag')
session.add(tag)
session.commit()
,但在Tag
類保持這樣的邏輯似乎是更加清晰 - 有可能讓我離開獵槍手術。
我該如何到達那裏? 我對Python
和SQLAlchemy
很新,所以對我的代碼的任何額外想法將不勝感激。
謝謝。
P.S. SQLAlchemy
是SO GIGANTIC,他們不提供一個方便的方法來做INSERT ... ON DUPLICATE KEY UPDATE
,是吧?哇!
嘗試session.me rge(標籤)而不是session.add(標籤) – 2012-03-30 17:41:50