Python、SQLite3:当提交介入时游标返回重复项

2023-12-27

此 Python 代码创建一个表,向其中插入三行并迭代这些行,并在游标完全耗尽之前进行干预提交。为什么它返回五行而不是三行?如果删除干预提交,则返回的行数如预期为 3。或者是否预期提交(甚至不触及相关表)会使游标无效?

Edit:添加了忘记的提交(这使得问题消失)和插入到不相关的表(这使得问题再次出现)。

#!/usr/bin/env python3

import sqlite3 as sq

db = sq.connect(':memory:')

db.execute('CREATE TABLE tbl (col INTEGER)')
db.execute('CREATE TABLE tbl2 (col INTEGER)')
db.executemany('INSERT INTO tbl (col) VALUES (?)', [(0,), (1,), (2,)])
db.commit()

print('count=' + str(db.execute('SELECT count(*) FROM tbl').fetchone()[0]))

# Read and print the values just inserted into tbl
for col in db.execute('SELECT col FROM tbl'):
    print(col)
    db.execute('INSERT INTO tbl2 VALUES (?)', col)
    db.commit()

print('count=' + str(db.execute('SELECT count(*) FROM tbl').fetchone()[0]))

输出是:

count=3
(0,)
(1,)
(0,)
(1,)
(2,)
count=3

通常,插入 N 行后,迭代器将返回 N+2 行,显然前两行总是重复的。


你的后续评论让我感到不安(特别是因为很明显你是对的)。所以我花了一些时间研究 python sqlite.c 库的源代码(https://svn.python.org/projects/python/trunk/Modules/_sqlite/ https://svn.python.org/projects/python/trunk/Modules/_sqlite/).

我认为问题是sqlite如何Connection对象正在处理游标。在内部,Connection对象维护游标和准备语句的列表。嵌套的db.execute('INSERT ...')调用重置与关联的准备好的语句列表Connection目的。

解决方案是不依赖快捷方式execute()方法的自动游标管理,并显式保存对正在运行的程序的引用。Cursor. Cursors维护自己的准备好的语句列表,这些列表与Connection对象。

您可以显式创建游标或在 db.execute() 调用上调用 fetchall() 。后者的例子:

import sqlite3 as sq

db = sq.connect(':memory:')

db.execute('CREATE TABLE tbl (col INTEGER)')
db.execute('CREATE TABLE tbl2 (col INTEGER)')
db.executemany('INSERT INTO tbl (col) VALUES (?)', [(0,), (1,), (2,)])
db.commit()

print('count=' + str(db.execute('SELECT count(*) FROM tbl').fetchone()[0]))

# Read and print the values just inserted into tbl
for col in db.execute('SELECT col FROM tbl').fetchall():
    print(col)
    db.execute('INSERT INTO tbl2 VALUES (?)', col)
    db.commit()

print('count=' + str(db.execute('SELECT count(*) FROM tbl').fetchone()[0]))

输出如预期:

count=3
(0,)
(1,)
(2,)
count=3

If the fetchall()方法会限制内存,那么您可能需要依靠两个数据库连接之间的隔离(https://www.sqlite.org/isolation.html https://www.sqlite.org/isolation.html)。例子:

db1 = sq.connect('temp.db')

db1.execute('CREATE TABLE tbl (col INTEGER)')
db1.execute('CREATE TABLE tbl2 (col INTEGER)')
db1.executemany('INSERT INTO tbl (col) VALUES (?)', [(0,), (1,), (2,)])
db1.commit()

print('count=' + str(db1.execute('SELECT count(*) FROM tbl').fetchone()[0]))

db2 = sq.connect('temp.db')

# Read and print the values just inserted into tbl
for col in db1.execute('SELECT col FROM tbl').fetchall():
    print(col)
    db2.execute('INSERT INTO tbl2 VALUES (?)', col)
    db2.commit()

print('count=' + str(db1.execute('SELECT count(*) FROM tbl').fetchone()[0]))
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Python、SQLite3:当提交介入时游标返回重复项 的相关文章

  • 如何在刻度标签和轴之间添加空间

    我已成功增加刻度标签的字体 但现在它们距离轴太近了 我想在刻度标签和轴之间添加一点呼吸空间 如果您不想全局更改间距 通过编辑 rcParams 并且想要更简洁的方法 请尝试以下操作 ax tick params axis both whic
  • Python、Tkinter、更改标签颜色

    有没有一种简单的方法来更改按钮中文本的颜色 I use button text input text here 更改按下后按钮文本的内容 是否存在类似的颜色变化 button color red Use the foreground设置按钮
  • 更改自动插入 tkinter 小部件的文本颜色

    我有一个文本框小部件 其中插入了三条消息 一条是开始消息 一条是结束消息 一条是在 单位 被摧毁时发出警报的消息 我希望开始和结束消息是黑色的 但被毁坏的消息 参见我在代码中评论的位置 插入小部件时颜色为红色 我不太确定如何去做这件事 我看
  • 如何使用 Scrapy 从网站获取所有纯文本?

    我希望在 HTML 呈现后 可以从网站上看到所有文本 我正在使用 Scrapy 框架使用 Python 工作 和xpath body text 我能够获取它 但是带有 HTML 标签 而且我只想要文本 有什么解决办法吗 最简单的选择是ext
  • 打破嵌套循环[重复]

    这个问题在这里已经有答案了 有没有比抛出异常更简单的方法来打破嵌套循环 在Perl https en wikipedia org wiki Perl 您可以为每个循环指定标签 并且至少继续一个外循环 for x in range 10 fo
  • javascript 选择自定义光标 (svg)

    我正在动态地将光标更改为悬停时的本地 svg element on mouseover function this css cursor url svgs pointer svg 9 30 auto 工作正常 但我想选择该 svg 来操纵其
  • Python tcl 未正确安装

    我刚刚为 python 安装了graphics py 但是当我尝试运行以下代码时 from graphics import def main win GraphWin My Circle 100 100 c Circle Point 50
  • __del__ 真的是析构函数吗?

    我主要用 C 做事情 其中 析构函数方法实际上是为了销毁所获取的资源 最近我开始使用python 这真的很有趣而且很棒 我开始了解到它有像java一样的GC 因此 没有过分强调对象所有权 构造和销毁 据我所知 init 方法对我来说在 py
  • 从 scikit-learn 导入 make_blobs [重复]

    这个问题在这里已经有答案了 我收到下一个警告 D Programming Python ML venv lib site packages sklearn utils deprecation py 77 DeprecationWarning
  • keras加载模型错误尝试将包含17层的权重文件加载到0层的模型中

    我目前正在使用 keras 开发 vgg16 模型 我用我的一些图层微调 vgg 模型 拟合我的模型 训练 后 我保存我的模型model save name h5 可以毫无问题地保存 但是 当我尝试使用以下命令重新加载模型时load mod
  • 运行多个 scrapy 蜘蛛的正确方法

    我只是尝试使用在同一进程中运行多个蜘蛛新的 scrapy 文档 http doc scrapy org en 1 0 topics practices html但我得到 AttributeError CrawlerProcess objec
  • Python:尝试检查有效的电话号码

    我正在尝试编写一个接受以下格式的电话号码的程序XXX XXX XXXX并将条目中的任何字母翻译为其相应的数字 现在我有了这个 如果启动不正确 它将允许您重新输入正确的数字 然后它会翻译输入的原始数字 我该如何解决 def main phon
  • Nuitka 未使用 nuitka --recurse-all hello.py [错误] 编译 exe

    我正在尝试通过 nuitka 创建一个简单的 exe 这样我就可以在我的笔记本电脑上运行它 而无需安装 Python 我在 Windows 10 上并使用 Anaconda Python 3 我输入 nuitka recurse all h
  • 设置 torch.gather(...) 调用的结果

    我有一个形状为 n x m 的 2D pytorch 张量 我想使用索引列表来索引第二个维度 可以使用 torch gather 完成 然后然后还设置新值到索引的结果 Example data torch tensor 0 1 2 3 4
  • 循环标记时出现“ValueError:无法识别的标记样式 -d”

    我正在尝试编码pyplot允许不同标记样式的绘图 这些图是循环生成的 标记是从列表中选取的 为了演示目的 我还提供了一个颜色列表 版本是Python 2 7 9 IPython 3 0 0 matplotlib 1 4 3 这是一个简单的代
  • 您可以在 Python 类型注释中指定方差吗?

    你能发现下面代码中的错误吗 米皮不能 from typing import Dict Any def add items d Dict str Any gt None d foo 5 d Dict str str add items d f
  • Spark.read 在 Databricks 中给出 KrbException

    我正在尝试从 databricks 笔记本连接到 SQL 数据库 以下是我的代码 jdbcDF spark read format com microsoft sqlserver jdbc spark option url jdbc sql
  • Python - 字典和列表相交

    给定以下数据结构 找出这两种数据结构共有的交集键的最有效方法是什么 dict1 2A 3A 4B list1 2A 4B Expected output 2A 4B 如果这也能产生更快的输出 我可以将列表 不是 dict1 组织到任何其他数
  • Python 分析:“‘select.poll’对象的‘poll’方法”是什么?

    我已经使用 python 分析了我的 python 代码cProfile模块并得到以下结果 ncalls tottime percall cumtime percall filename lineno function 13937860 9
  • Pandas 与 Numpy 数据帧

    看这几行代码 df2 df copy df2 1 df 1 df 1 values 1 df2 ix 0 0 我们的教练说我们需要使用 values属性来访问底层的 numpy 数组 否则我们的代码将无法工作 我知道 pandas Data

随机推荐

  • 如何使用变量名调用java方法?

    假设我有 Method1 void Method2 void 有没有办法我可以选择其中一个带有变量的方法 String MyVar 2 MethodMyVar 使用反射 Method method WhateverYourClassIs c
  • 如何根据单个用户定义的文字自动添加文字定义?

    C 11 offers 用户定义的文字 http en wikipedia org wiki C 2B 2B11 User defined literals 我刚刚开始使用它们 这让我想知道是否可以自动添加所有SI 乘数 http en w
  • Keras + DataFrameMapper + make_pipeline,input_dim 困境

    我的数据看起来像这样 import pandas as pd from sklearn pandas import DataFrameMapper CategoricalImputer from sklearn preprocessing
  • 法罗双重调度

    有人可以解释一下 Pharo 4 0 中使用 Smalltalk 进行双重调度的过程吗 我是 Smalltalk 的新手 很难掌握这个概念 因为与 Smalltalk 相比 它在 Java 中的实现方式非常不同 如果有人能用一个例子来解释它
  • 组合 XPATH 轴(前同级和后同级)

    假设我有以下 UL ul li barry li li bob li li carl li li dave li li roger li li steve li ul 我需要获取鲍勃和罗杰之间的所有 LI 我可以抓住鲍勃之后的一切 ul l
  • 编写一个函数来删除对象(如果存在)

    我正在尝试编写一个函数来删除对象 如果存在 原因是我想摆脱日志消息错误 未找到对象 arg 我尝试了以下方法 ifrm lt function arg if exists as character substitute arg rm arg
  • 为什么 pytorch 中的正则化和临时代码不匹配?pytorch 中的正则化公式是什么?

    我一直在尝试对 PyTorch 中的二元分类模型进行 L2 正则化 但是当我匹配 PyTorch 的结果和临时代码时 它不匹配 火炬代码 class LogisticRegression nn Module def init self n
  • 如何通过 Java 在 SQLite 中强制执行外键约束?

    默认情况下 SQLite 似乎不强制执行外键 我在用着sqlitejdbc v056 jar http www zentus com sqlitejdbc 我读过使用PRAGMA foreign keys ON 将打开外键约束 并且需要在每
  • 算法中的陌生符号:∀是什么意思? [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我正在阅读一个算法 这是一个基于A 的寻路算法 它包含一个我不熟悉的数学符号 这是上下文 v s g s mins pred s v s
  • import 不能在 chrome 61 中使用?

    我尝试在最新发布的 chrome 版本 即 chrome 61 中玩 ES6 功能 在使用过程中遇到了错误import关键词 从技术上来说 import使用以下方法 但控制台显示错误 import Mymodule from Mymodul
  • 自然连接的维恩图

    我一直在尝试完全理解 sql 连接的概念 维恩图在这方面帮助了我很多 我发现它们适用于所有类型的连接 但不适用于自然连接 自然连接的维恩图是什么样子的 维恩图对于理解自然连接或内连接没有太大帮助 大多数与 Stack Overflow 和网
  • 如何将数据作为 trie 存储在表中? (SQL 服务器)

    为了方便起见 该表包含英语词典中的所有单词 我想做的是将数据存储为特里树 这样我就可以遍历 trie 的不同分支并返回最相关的结果 首先 如何将表中的数据存储为 trie 结构 其次 如何遍历这棵树 如果有帮助的话 建议上一个问题 http
  • 如何在 Playframework2 中的 i18n 中使用单引号?

    在开发法语应用程序时 法语充满了单引号 我需要使用带有单引号和许多其他重音字符的 i18n 所以这是我的摘录messages fr FR file some key C est la vie 这是输出 Cest la vie 如何在消息中使
  • 为什么我的规范化路径带有前缀 \\?\

    我正在开发一个个人项目 试图通过规范化 Rust 中的相对路径来解决该项目 然而 每当我这样做时 新路径都会以一个奇怪的前缀 顺序 例如 简单的事情如下 let p fs canonicalize unwrap println p disp
  • SQL循环遍历所有表并获取特定列的最大值

    我正在尝试创建一个审核表来检查该表的加载日期 基本上 我想循环遍历数据库中的所有表并检查特定列 LoadedDate并返回每个表的该列的最大值 SELECT TABLE NAME INTO TableList FROM INFORMATIO
  • Android Facebook 对话框

    我已将 Facebook 集成到我的应用程序中 但是 它不是在对话框中显示 而是全屏打开 我想知道是否有人知道如何将其更改为对话框 Facebook 处理程序类 Override public void onCreate Bundle sa
  • 无法连接到总线:没有这样的文件或目录

    我创建了一个 docker 16 4 容器并尝试在容器内运行 docker 继这篇文章之后 https www digitalocean com community tutorials how to install and use dock
  • 使用 MS 编译器的 std::cout 非常慢

    我正在打印多次计算迭代的进度 输出实际上是其中最慢的部分 但只有当我使用 Visual C 编译器时 MinGW 在同一系统上才能正常工作 考虑以下代码 include
  • 实现 HttpSessionListener

    我面临着一个类似的问题 https stackoverflow com questions 1439743 whats wrong with my listener in my web xml并了解到我的侦听器类将在读取 web xml 时
  • Python、SQLite3:当提交介入时游标返回重复项

    此 Python 代码创建一个表 向其中插入三行并迭代这些行 并在游标完全耗尽之前进行干预提交 为什么它返回五行而不是三行 如果删除干预提交 则返回的行数如预期为 3 或者是否预期提交 甚至不触及相关表 会使游标无效 Edit 添加了忘记的