Tôi đã có một lớp:SQLAlchemy cập nhật nếu khóa duy nhất tồn tại
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,)
Khi thêm tag:
tag = Tag('tag')
session.add(tag)
session.commit()
Tôi muốn nó để cập nhật hiện tag
.
Tất nhiên, tôi có thể đã làm điều này:
tag = session.query(Tag).filter_by(tag='tag').first()
if tag:
tag.cnt++
else:
tag = Tag('tag')
session.add(tag)
session.commit()
nhưng, giữ logic như vậy trong Tag
lớp có vẻ là rõ ràng hơn - có thể giữ cho tôi ra khỏi cuộc phẫu thuật shotgun.
Làm cách nào để đến đó? Tôi khá mới với Python
và SQLAlchemy
, vì vậy mọi ý tưởng bổ sung trên mã của tôi sẽ được đánh giá cao.
Cảm ơn bạn.
P.S. SQLAlchemy
là SO GIGANTIC và chúng không cung cấp cách tiện dụng để thực hiện INSERT ... ON DUPLICATE KEY UPDATE
, huh? WOW!
thử session.me rge (tag) thay vì session.add (tag) –