SqlAlchemy: блокировка таблицы с помощью шаблона `get or create` - PullRequest
3 голосов
/ 23 мая 2011

Я использую шаблон get_or_create, похожий на ответ на этот вопрос:

Есть ли в SQLAlchemy эквивалент get_or_create Джанго?

Но у меня возникли проблемы с другим потоком, создающим экземпляр (с таким же pk) между «select» и «insert» первого потока.

Должна ли функция get_or_create заблокировать таблицу для двух запросов? Каков наилучший способ реализации блокировки с помощью SqlAlchemy?

Я использую postgresql: http://www.postgresql.org/docs/current/static/sql-lock.html

Единственная функциональность блокировки sqlalchemy, которую я вижу, это ' для обновления ', что не похоже на правильный тип блокировки?

Ответы [ 2 ]

2 голосов
/ 23 мая 2011

Кажется, я неправильно понял ваш ответ на мой ответ на другой вопрос.

То, что вы ищете здесь, вероятно, не блокируется напрямую, а транзакции.http://www.sqlalchemy.org/docs/core/connections.html#using-transactions

Но ... вы пытаетесь предотвратить выполнение одной и той же вставки дважды?В этом случае вам понадобится блокировка где-нибудь в python (или перехватить ошибку дублированного ключа).На самом деле это единственный надежный способ сделать это.Попробуйте вставить и получить его, если вы получили ошибку дублирующего ключа.

0 голосов
/ 23 мая 2011

Благодаря WoLpH мне кажется, что мне подходит следующее (EdgeInfo - модель эликсира):

from sqlalchemy import exc

session.begin_nested()
e_info = EdgeInfo(pk_attr_1=pk_attr_1, pk_attr_2=pk_attr_2)
try:
    session.commit()
except exc.IntegrityError:
    session.rollback()
    e_info = EdgeInfo.get((pk_attr_1, pk_attr_2))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...