Flask 在SQLAlchemy中,如何重试在冲突中插入唯一ID?
我想在数据库中插入一个短的6位唯一字母数字ID。我希望管理冲突并在同一事务中重试。冲突的可能性很低,但是为了论证起见,让我们假设Flask 在SQLAlchemy中,如何重试在冲突中插入唯一ID?,flask,sqlalchemy,flask-sqlalchemy,Flask,Sqlalchemy,Flask Sqlalchemy,我想在数据库中插入一个短的6位唯一字母数字ID。我希望管理冲突并在同一事务中重试。冲突的可能性很低,但是为了论证起见,让我们假设n=1。我尝试了以下方法: 密码 最大重试次数=3次 bar=bar() db.session.add(条) db.session.flush() 尽管如此: 尝试: obj=Foo(Foo=get\u unique\u id(n=6),bar\u id=bar.id) db.session.add(obj) db.session.flush() 除完整性错误外: db
n=1
。我尝试了以下方法:
密码
最大重试次数=3次
bar=bar()
db.session.add(条)
db.session.flush()
尽管如此:
尝试:
obj=Foo(Foo=get\u unique\u id(n=6),bar\u id=bar.id)
db.session.add(obj)
db.session.flush()
除完整性错误外:
db.session.rollback()
最大重试次数-=1
如果最大重试次数<1:
提升
其他:
打破
db.session.commit()
错误:
为什么bar\u id
不在表中?我想,我可以在db.session.rollback()之后重试,bar\u id=bar.id
应该仍然有效
我在Flask应用程序中使用Flask SQLAlchemy插件,前面提到的代码位于请求函数中。我找到了解决方案。我需要使用db.session.savepoint()
,这样它就不会回滚以前的所有插入
插入bar=bar()
后接db.session.flush()
,我需要创建一个保存点
完整工作代码如下:
最大重试次数=3次
bar=bar()
db.session.add(条)
db.session.flush()
db.session.savepoint()#
sqlalchemy.exc.IntegrityError: (psycopg2.errors.ForeignKeyViolation) insert or update on table "foo" violates foreign key constraint "foo_bar_id_fkey"
DETAIL: Key (bar_id)=(1) is not present in table "bar"