python教程—如何使用SqlAlchemy执行upsert ?-Python实用宝典

python教程—如何使用SqlAlchemy执行upsert ?

我有一个记录,如果它不存在,我希望它存在于数据库中,如果它已经存在(主键存在),我希望字段更新到当前状态。这通常称为upsert。

我有一个记录,如果它不存在,我希望它存在于数据中,如果它已经存在(主键存在),我希望字段更新到当前状态。这通常称为upsert

下面这个不完整的代码片段演示了什么可以工作,但是它看起来非常笨拙(尤其是如果有很多列的话)。什么是更好的方法?

    Base = declarative_base() class Template(Base): __tablename__ = 'templates' id = Column(Integer, primary_key = True) name = Column(String(80), unique = True, index = True) template = Column(String(80), unique = True) description = Column(String(200)) def __init__(self, Name, Template, Desc): self.name = Name self.template = Template self.description = Desc def UpsertDefaultTemplate(): sess = Session() desired_default = Template("default", "AABBCC", "This is the default template") try: q = sess.query(Template).filter_by(name = desiredDefault.name) existing_default = q.one() except sqlalchemy.orm.exc.NoResultFound: #default does not exist yet, so add it... sess.add(desired_default) else: #default already exists. Make sure the values are what we want... assert isinstance(existing_default, Template) existing_default.name = desired_default.name existing_default.template = desired_default.template existing_default.description = desired_default.description sess.flush()

有没有更好或更简洁的方法来做这件事?这样的东西会很棒:

    sess.upsert_this(desired_default, unique_key = "name")

虽然unique_key kwarg显然是不必要的(ORM应该能够轻松地解决这个问题),但我添加它只是因为SQLAlchemy倾向于只使用主键。我一直在研究会话。merge是适用的,但是这只适用于主键,在本例中,主键是一个自动递增的id,对于这个目的不是很有用。

一个简单的用例就是在启动一个服务器应用程序时,该应用程序可能已经升级了它的默认预期数据。这个upsert没有并发问题。

回答

​Python实用宝典 (pythondict.com)
不只是一个宝典
欢迎关注公众号:Python实用宝典

本文由 Python实用宝典 作者:Python实用宝典 发表,其版权均为 Python实用宝典 所有,文章内容系作者个人观点,不代表 Python实用宝典 对观点赞同或支持。如需转载,请注明文章来源。
0

发表评论