我有一条记录,如果它不存在,我希望存在于数据库中,如果它已经存在(主键存在),我希望将字段更新到当前状态。这通常被称为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 倾向于只使用主键。例如:我一直在考虑是否会话合并是适用的,但这仅适用于主键,在本例中是一个自动增量 id,对于此目的来说并不是很有用。
一个示例用例就是启动可能已升级其默认预期数据的服务器应用程序。即:此更新插入没有并发问题。