Nem*_*den 18 python orm sqlalchemy declarative
我上课了:
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, )
Run Code Online (Sandbox Code Playgroud)
添加标签时:
tag = Tag('tag')
session.add(tag)
session.commit()
Run Code Online (Sandbox Code Playgroud)
我希望它更新现有的tag
.
当然,我可以做到这一点:
tag = session.query(Tag).filter_by(tag='tag').first()
if tag:
tag.cnt++
else:
tag = Tag('tag')
session.add(tag)
session.commit()
Run Code Online (Sandbox Code Playgroud)
但是,在Tag
课堂上保持这样的逻辑似乎更清楚 - 可能让我远离霰弹枪手术.
我如何到达那里?我是很新,Python
和SQLAlchemy
,等我的代码有任何其他想法可以理解的.
谢谢.
PS SQLAlchemy
是SO GIGANTIC,它们没有提供方便的方法INSERT ... ON DUPLICATE KEY UPDATE
,呵呵?哇!
Nil*_*esh 12
你可以试试这个
def get_or_increase_tag(tag_name):
tag = session.query(Tag).filter_by(tag=tag_name).first()
if not tag:
tag = Tag(tag_name)
else:
tag.cnt += 1
return tag
Run Code Online (Sandbox Code Playgroud)
你可以查看链接https://stackoverflow.com/search?q=Insert+on+duplicate+update+sqlalchemy
vis*_*ell 11
从版本1.2 SQLAlchemy的支持on_duplicate_key_update
对MySQL的
还有如何使用它的例子:
Run Code Online (Sandbox Code Playgroud)from sqlalchemy.dialects.mysql import insert insert_stmt = insert(my_table).values( id='some_existing_id', data='inserted value') on_duplicate_key_stmt = insert_stmt.on_duplicate_key_update( data=insert_stmt.values.data, status='U' ) conn.execute(on_duplicate_key_stmt)
从版本1.1 SQLAlchemy的支持on_conflict_do_update
为PostgreSQL的
示例:
Run Code Online (Sandbox Code Playgroud)from sqlalchemy.dialects.postgresql import insert insert_stmt = insert(my_table).values( id='some_existing_id', data='inserted value') do_update_stmt = insert_stmt.on_conflict_do_update( constraint='pk_my_table', set_=dict(data='updated value') ) conn.execute(do_update_stmt)
归档时间: |
|
查看次数: |
16016 次 |
最近记录: |