Ich habe einen Datensatz, von dem ich möchte, dass er in der Datenbank vorhanden ist, wenn er nicht vorhanden ist, und wenn er bereits vorhanden ist (Primärschlüssel vorhanden), möchte ich, dass die Felder auf den aktuellen Stand aktualisiert werden. Dies wird oft als upsert .
Der folgende unvollständige Codeschnipsel zeigt, wie es geht, aber er scheint zu klobig zu sein (vor allem, wenn es viel mehr Spalten gäbe). Was ist der bessere/beste Weg?
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()
Gibt es einen besseren oder weniger ausführlichen Weg, dies zu tun? Etwas in dieser Art wäre großartig:
sess.upsert_this(desired_default, unique_key = "name")
obwohl die unique_key
kwarg ist offensichtlich unnötig (der ORM sollte in der Lage sein, dies leicht herauszufinden). Ich habe es nur hinzugefügt, weil SQLAlchemy dazu neigt, nur mit dem Primärschlüssel zu arbeiten. z.B.: Ich habe untersucht, ob Session.merge wäre anwendbar, aber das funktioniert nur mit dem Primärschlüssel, der in diesem Fall eine automatisch inkrementierende ID ist, die für diesen Zweck nicht sehr nützlich ist.
Ein Beispiel für einen Anwendungsfall ist das Starten einer Serveranwendung, die ihre standardmäßig erwarteten Daten aktualisiert hat, d. h. es gibt keine Gleichzeitigkeitsprobleme bei dieser Aktualisierung.