Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/backbone.js/2.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
Sqlalchemy 执行多个SQL提交,还是一次提交后再执行另一个调用更好?_Sqlalchemy - Fatal编程技术网

Sqlalchemy 执行多个SQL提交,还是一次提交后再执行另一个调用更好?

Sqlalchemy 执行多个SQL提交,还是一次提交后再执行另一个调用更好?,sqlalchemy,Sqlalchemy,我将SQL炼金术与SQL数据库结合使用,并提出了一个最佳实践问题。我需要在SQL中插入一个对象列表,然后使用SQL生成的ID将它们返回到前端。但是,我只能在提交后访问这些ID。现在,我循环遍历列表,在每次迭代中添加一个对象,然后在添加完所有对象后提交。但是那样我就没有身份证了 最好在每次循环迭代后提交,并以这种方式获取ID,还是在循环结束后批量提交新条目,然后再次调用以获取具有ID的新条目?我认为这取决于您的数据架构、数据库以及插入的记录数。例如,SQLite的结果将不同于PostgreSQL,

我将SQL炼金术与SQL数据库结合使用,并提出了一个最佳实践问题。我需要在SQL中插入一个对象列表,然后使用SQL生成的ID将它们返回到前端。但是,我只能在提交后访问这些ID。现在,我循环遍历列表,在每次迭代中添加一个对象,然后在添加完所有对象后提交。但是那样我就没有身份证了


最好在每次循环迭代后提交,并以这种方式获取ID,还是在循环结束后批量提交新条目,然后再次调用以获取具有ID的新条目?

我认为这取决于您的数据架构、数据库以及插入的记录数。例如,SQLite的结果将不同于PostgreSQL,因为SQLite不是为并发性而构建的

我将它用于SQLite,使用8个内核中的7个进行多处理,以及大约10000条记录。在我的具体案例中,在最后仅提交一次就花了5.5分钟。提交每个记录所需的时间要长得多。45分钟过去了,还没有结束。这是9倍的性能差异


如果您使用的是像Postgres一样考虑并发性的数据库,我认为性能差异不会太大,但减少提交似乎可以提高性能。

我认为这取决于您的数据架构、数据库以及插入的记录数量。例如,SQLite的结果将不同于PostgreSQL,因为SQLite不是为并发性而构建的

我将它用于SQLite,使用8个内核中的7个进行多处理,以及大约10000条记录。在我的具体案例中,在最后仅提交一次就花了5.5分钟。提交每个记录所需的时间要长得多。45分钟过去了,还没有结束。这是9倍的性能差异


如果您使用的数据库像Postgres一样考虑并发性,我认为性能差异不会太大,但减少提交似乎可以提高性能。

除非您处理大量记录,否则我认为这真的没什么关系。通常应用程序仅仅依赖于围绕各种操作的“自动提交”行为。。。在自己的单个事务中执行每个操作。但也可以提交记录、提交,然后重新查询(如果您确定知道如何编写重新查询以获得正确的行)来查找ID。(您还应该在事务中进行重新查询。)假设您使用的DBMS支持
INSERT。。。返回…
,您应该能够在插入查询中获取生成的ID。如果您使用的是sqlalchemy ORM,这应该会自动发生-您的实体应该在刷新后立即更新其ID属性。如果您使用的是sqlalchemy core,那么可以使用
insert()
函数的
returning=
选项。除非您处理的记录数量非常多,否则我认为这真的没有多大关系。通常应用程序仅仅依赖于围绕各种操作的“自动提交”行为。。。在自己的单个事务中执行每个操作。但也可以提交记录、提交,然后重新查询(如果您确定知道如何编写重新查询以获得正确的行)来查找ID。(您还应该在事务中进行重新查询。)假设您使用的DBMS支持
INSERT。。。返回…
,您应该能够在插入查询中获取生成的ID。如果您使用的是sqlalchemy ORM,这应该会自动发生-您的实体应该在刷新后立即更新其ID属性。如果您使用的是sqlalchemy core,那么可以使用
insert()
函数的
returning=
选项。