Как выполнить обновление с помощью SqlAlchemy?Python

Программы на Python
Ответить
Anonymous
 Как выполнить обновление с помощью SqlAlchemy?

Сообщение Anonymous »

У меня есть запись, которую я хочу сохранить в базе данных, если ее там нет, а если она уже есть (первичный ключ существует), я хочу, чтобы поля обновлялись до текущего состояния. Это часто называют 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 явно не нужен (ORM должен легко это понять), я добавил его только потому, что SQLAlchemy имеет тенденцию работать только с первичным ключом. например: я смотрел, применим ли Session.merge, но это работает только с первичным ключом, который в данном случае представляет собой автоматически увеличивающийся идентификатор, который не очень полезен для этой цели.

Примером использования этого является простой запуск серверного приложения, которое могло обновить ожидаемые данные по умолчанию. т.е.: для этого обновления нет проблем с параллелизмом.

Подробнее: https://stackoverflow.com/questions/716 ... sqlalchemy
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Python»