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() 
  • python пересекает CTE в двойном цикле?
  • Как подключиться к SQL Server через sqlalchemy с помощью проверки подлинности Windows?
  • Подзапрос SQLAlchemy - среднее количество сумм
  • Избегайте дубликатов с завода factory_boy
  • Как написать много столбцов в разделе с sqlalchemy
  • не может уловить MySQL IntegrityError в Python
  • sqlalchemy подключиться к серверу, не указывая базу данных
  • Установите SQLAlchemy для использования PostgreSQL SERIAL для создания идентичности
  • Python - лучший язык программирования в мире.