#python #python-3.x #flask #flask-sqlalchemy #gunicorn
Вопрос:
Я разработал приложение Flask, и до сих пор я развертывал его только с помощью одного рабочего. Приложение подключается к базе данных SQLite с помощью Flask-SQLAlchemy. В начале я проверяю, есть ли в моей базе данных уже данные, и если нет, я инициализирую некоторые данные, как пользователь настройки по умолчанию, например:
root_user = User.query.filter_by(username='root').one_or_none()
if not root_user:
new_user = User(username="root", password_hash="SomeLongAndSecurePasswordHash")
new_user.roles = [serveradmin_role]
db.session.add(new_user)
Когда я запускаю этот код с несколькими рабочими и потоками gunicorn, рабочие выходят из строя, потому что они пытаются создать несколько пользователей root, что не соответствует моему УНИКАЛЬНОМУ ограничению в БД. По-видимому, все они одновременно читают базу данных, когда корневой пользователь еще не существует, а затем все они пытаются записать пользователя в базу данных, которая работает только для одного из работников.
Каков был бы хороший способ предотвратить это? Я чувствую, что мой код должен просто лучше справляться с возникающей ошибкой SQLAlchemy, или мне здесь чего-то не хватает? То же самое может произойти и в производстве, если два человека попытаются создать одного и того же пользователя в одно и то же время, как бы я справился с этим там?