我需要通过SQLAlchemy插入/更新批量行。并获得插入的行。
我试图用session.execute做到这一点:
>>> posts = db.session.execute(Post.__table__.insert(), [{'title': 'dfghdfg', 'content': 'sdfgsdf', 'topic': topic}]*2)
>>> posts.fetchall()
ResourceClosedError Traceback (most recent call last)
搭配引擎:
In [17]: conn = db.engine.connect()
In [18]: result = conn.execute(Post.__table__.insert(), [{'title': 'title', 'content': 'content', 'topic': topic}]*2)
In [19]: print result.fetchall()
ResourceClosedError: This result object does not return rows. It has been closed automatically.
相同的响应是对象已自动关闭。怎么预防呢?
第一个答案-关于“防止自动关闭”。
SQLAlchemy使用insert运行DBAPI
execute()或executemany(),并且不执行任何选择查询。因此,您遇到的异常是预期的行为。执行插入查询后返回的ResultProxy对象包装了不允许对其执行的DB-
API游标.fetchall()
。一旦 .fetchall()
失败,ResultProxy将向用户返回您看到的异常。
在插入/更新/删除操作之后,您可以获得的唯一信息是受影响的行数或自动递增后的主键值(取决于数据库和数据库驱动程序)。
如果您的目标是接收此类信息,请考虑检查ResultProxy方法和属性,例如:
第二个答案-关于“如何进行批量插入/更新并获得结果行”。
使用DBAPI进行单次插入查询时,无法加载已插入的行。您用于批量插入/更新的SQLAlchemy SQL Expression
API也未提供此类功能。SQLAlchemy运行DBAPI
executemany()调用,并依赖于驱动程序的实现。有关详细信息,请参见本节文档。
解决方案是设计表的方式,使每条记录都具有用于标识记录的自然键(以独特方式标识记录的列值的组合)。因此,插入/更新/选择查询将能够针对一条记录。完成后,可以先进行批量插入/更新,然后再通过自然键进行选择查询。因此,您不需要知道自动递增的主键值。
另一种选择:可能是您可以使用SQLAlchemy对象关系API创建对象-然后,SQLAlchemy可能会尝试为您执行executemany来优化插入。使用Oracle
DB时对我有用。开箱即用的更新不会有任何优化。检查此SO问题以获取有效的批量更新建议
问题内容: 我有一个(旧的)工具,该工具不了解像这样的自动关闭标签。所以,我们需要序列与这样的开启/关闭的标签我们的XML文件:。 目前我有: 如何使用打开/关闭的标签进行序列化? 解 由wildwilhelm给出,如下: 问题答案: 似乎标签已分配了的属性: 如果将标记的属性设置为空字符串,则应获得所需的内容: 考虑到这一点,您可能可以在编写XML之前遍历DOM树并修复属性。像这样:
我正在使用Xerces库在文档中编写XML。为此,我使用OutputFormat类在XMLSerializer中传递OutputFormat的对象。但我所有的空xml元素都转换为自动关闭的xml元素。 我想要这个: 但它的到来就像 我尝试了以下代码: 有人能帮我解决这个问题吗。 谢谢
我想做的是:打开大文件的InputStream,读取10MB的块,上传一个块,读取下一个块。 我为这个任务编写了很好的代码,但问题是ContentResolver返回ParcelFileDescriptor。AutoCloseInputStream作为InputStriam。这个实现打破了InputStream的契约,因为它在first.read()之后自动关闭,所以当我尝试读取下一个块时,我得到
问题内容: 我正在尝试在从属计算机上的Jenkins工作中启动Tomcat。我通过打开slave-agent.jnlp手动启动Jenkins slave 这是我在“执行Windows批处理命令”中尝试过的操作: Tomcat开始运行构建,并且将构建标记为成功,但是随后几秒钟后Tomcat自动关闭。 问题答案: 这是 Jenkins进程树杀手 。这是设计使然。您可以通过使用额外参数启动Jenkins
问题内容: 我有一个使用自定义RowSorter可排序列的JTable。我假设RowSorter类自动将自身作为MouseListener添加到表的ColumnHeader中,因为它无需执行任何自定义鼠标侦听代码即可自动执行排序。这很完美。 我还添加了一些代码(基于此示例),该代码允许用户通过双击列标题中的表之间的空间来调整表列的大小(模仿Excel的行为)。问题是,当用户双击标题以调整列的大小时
问题内容: 我目前在将主键设置为时遇到问题。它不断增加。 例如: 从上面的描述中,您会注意到我在该表中有3个输入,但是由于每次更新都会自动递增,因此第三个输入的ID为86。 反正有避免这种情况吗? 这是我的mySQL查询的样子: 这是我的桌子的样子; 问题答案: 您可以将config选项设置为“传统”自动增量锁定模式,以确保所有语句将为列分配连续的值。 也就是说,您不应该依赖于应用程序中自动递增I
我使用Spring Boot框架构建了一个REST接口。然后,我使用Swagger版本2.9.2来生成文档。从下面的照片可以看到,Swagger自动检测了很多模型。 所以,我的问题是:我怎么告诉Swagger该曝光哪些模特? 下面是我的控制器的Swagger配置和代码片段。 控制器:
问题内容: 如果转到页面a并滚动浏览,则刷新页面将在您离开页面的位置刷新。这很好,但是在URL中存在锚点位置的页面上也会发生这种情况。例如,如果您单击一个链接并在环顾四周后刷新页面,您将不会处于锚点,而页面会跳来跳去。有什么办法可以防止使用javascript吗?因此,无论如何,您始终可以导航到锚点。 问题答案: 由于浏览器行为的更改,不再建议使用此解决方案。查看其他答案。 基本上,如果使用锚,则