Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Flask 在SQLAlchemy中,如何重试在冲突中插入唯一ID?_Flask_Sqlalchemy_Flask Sqlalchemy - Fatal编程技术网

Flask 在SQLAlchemy中,如何重试在冲突中插入唯一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

我想在数据库中插入一个短的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.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"