#postgresql #flask #sqlalchemy #flask-sqlalchemy
Вопрос:
Мне нужно выполнить последовательные шаги:
- чтобы заблокировать таблицу или определенные строки (с условием) для записи;
- чтобы проверить некоторые строки с определенными условиями;
- если строк с условиями нет, добавьте новую строку
- разблокировка
Как я могу это сделать в SQLAlchemy, Flask, PostgreSQL? Какие способы являются правильными?
Комментарии:
1. Сделайте все это в транзакции. Это включает в себя доступ кода к базе данных. Затем установите желаемый уровень изоляции транзакций .
Ответ №1:
Если вы хотите, чтобы это было безопасно от условий гонки, вам нужно использовать транзакцию с SERIALIZABLE
уровнем изоляции. Выполните всю операцию в этой транзакции.
Ответ №2:
Я использую Flask-Sqlalchemy, так что попробуйте внести коррективы.
Вы можете использовать with_for_update() здесь. Документы
Примером может быть.
class TestTable(db.Model):
__tablename__ = "test_table"
id = Column(db.Integer(), primary_key=True)
filename = Column(db.String(1024))
is_complete = Column(db.Boolean(), default=False, server_default="f")
Вы можете заблокировать их, выполнив:
for table in TestTable.query.with_for_update().filter_by(is_complete=False).all():
# Example Check condition
if table.filename != 'bar' and table.id >= 10:
# Add a new row
newtable = TestTable(filename='foo')
db.session.add(newtable)
# Save and release lock
db.session.commit()