SQLAlchemy – выберите пример обновления

Я ищу полный пример использования select для обновления в SQLAlchemy, но не нашел один googling. Мне нужно заблокировать одну строку и обновить столбец, следующий код не работает (блоки навсегда):

s = table.select(table.c.user=="test",for_update=True) # Do update or not depending on the row u = table.update().where(table.c.user=="test") u.execute(email="foo") 

Мне нужна фиксация? Как мне это сделать? Насколько мне известно, вам необходимо: начать транзакцию select … для обновления обновления commit

3 Solutions collect form web for “SQLAlchemy – выберите пример обновления”

Поздний ответ, но, возможно, кто-то найдет его полезным.

Во-первых, вам не нужно совершать (по крайней мере, не промежуточные запросы, о которых я предполагаю, что вы спрашиваете). Второй запрос зависает бесконечно, потому что вы эффективно создаете два параллельных подключения к базе данных. Первый – это получение блокировки выбранных записей, затем вторая попытка изменения заблокированных записей. Поэтому он не может работать должным образом. (Кстати, в приведенном примере вы вообще не вызываете первый запрос, поэтому я предполагаю, что в ваших реальных тестах вы делали что-то вроде s.execute() где-то). Таким образом, для точечной работы должно выглядеть больше:

 s = conn.execute(table.select(table.c.user=="test", for_update=True)) u = conn.execute(table.update().where(table.c.user=="test), {"email": "foo"}) conn.commit() 

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

Если вы используете ORM, попробуйте функцию with_for_update :

 foo = session.query (Foo) .filter (Foo.id == 1234) .with_for_update (). one ()
 # эта строка заблокирована

 foo.name = 'bar'
 session.add (Foo)

 session.commit ()
 # эта строка теперь разблокирована

Да, вам необходимо совершить сделку, которую вы можете выполнить в Engine или создать Transaction явно. Также модификаторы указываются в методе values(...) и не execute :

 >>> conn.execute(users.update(). ... where(table.c.user=="test"). ... values(email="foo") ... ) >>> my_engine.commit() 
  • SQLAlchemy ON DUPLICATE KEY UPDATE
  • Как правильно использовать bind_proxy и ordering_list вместе с SQLAlchemy
  • Как получить месяц и год из поля «Дата» в sqlalchemy?
  • Обратное определение декларативного класса SQLAlchemy из существующей базы данных MySQL?
  • Проблема Unicode с SQLAlchemy
  • Ошибка SQLAlchemy Сервер MySQL ушел
  • Как подсчитать строки с помощью SELECT COUNT (*) с помощью SQLAlchemy?
  • Включить выполнение нескольких операторов во время выполнения через sqlalchemy
  • Обнаружение ссылок на объект SQLAlchemy
  • Почему я получаю «NameError» с этим импортом?
  • Сохранять изображение, сохраненное в столбце LargeBinary SQLAlchemy
  • Python - лучший язык программирования в мире.