如果存在唯一键,则 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 类中似乎更加清晰 - 可能让我远离霰弹枪手术。

我如何到达那里?我是 PythonSQLAlchemy 的新手,所以对我的代码有任何额外的想法将不胜感激。

原文由 Nemoden 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 538
2 个回答

1.2 版开始,SQLAlchemy 将支持 on_duplicate_key_update 用于 MySQL

还有如何使用它的 示例

 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

例子

 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)

原文由 vishes_shell 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题