<p>处理这个问题的一种方法是在函数签名中使用<a href="https://stackoverflow.com/questions/3394835/args-and-kwargs#3394898">^{<cd1>}</a>构造。然后,在调用函数时不要使用位置参数,而只使用要更新的属性的关键字参数来调用它:</p>
<pre><code>def set_warn_settings(serverID, **kwargs):
with INSERTION_LOCK:
try:
row = SESSION.query(WarnSettings).get(serverID)
if row:
for k, v in kwargs.items():
setattr(row, k, v)
# i removed SESSION.add(row) from here as you don't need to
# re-add an instance that was retrieved via Session.query.
SESSION.commit()
else:
action = WarnSettings(**kwargs)
SESSION.add(action)
SESSION.commit()
finally:
SESSION.close()
</code></pre>
<p>如果行存在,这将只更新作为关键字参数传递给函数的属性名的值;如果行不存在,则将使用传入的值创建一个新的<code>WarnSettings</code>实例。它也不会覆盖您不想设置为<code>None</code>的属性值,但也允许您在需要时显式地将值设置为<code>None</code>。你知道吗</p>
<p>基于示例数据的用法示例:</p>
<pre><code>set_warn_settings(102, behavior='action2') # will change value of 'behavior' and not change 'limit'.
set_warn_settings(103, behavior='action1', limit=10) # will change both fields
set_warn_settings(104, behavior='action3', limit=3) # will create a new instance
</code></pre>
<p>注意,我还在函数中使用了<a href="https://docs.sqlalchemy.org/en/latest/orm/query.html#sqlalchemy.orm.query.Query.get" rel="nofollow noreferrer">^{<cd5>}</a>方法,这是一种按主键进行查询并在不存在行时返回<code>None</code>的简洁方法。你知道吗</p>