SQLite not in 无法查询数据

 

SELECT * FROM QuestionInfo
WHERE  ID != (select QuestionID from Exam)
SELECT * FROM QuestionInfo
WHERE  ID not in  (select QuestionID from Exam)

!= 有数据

not in 没有数据

但各类文档都说 2者是等价

<think>首先,用户查询是关于在Python中使用sqlite3模块执行数据查询和保存操作的指南或示例代码。用户特别提到了引用,这些引用提供了相关的信息:-引用[1]:讨论了Python与SQLite的使用,适合存储和查询数据。-引用[2]:关于Pythonsqlite3查询操作,具体示例是连接数据库。-引用[3]:描述了SQLite的示例,如缓冲数据和预计算统计数据。用户说这些引用仅供参考,并不是真正需求,但要求我参考用户上一次的问题。查看对话历史,上一次的问题是用户关于SQLite查询,但在这个新查询中,用户直接指定了新的问题:"我想查找如何在Python的sqlite3模块中执行数据查询和保存操作的指南或示例代码"。所以,我应该基于这个新查询来回答。系统级指令回顾:-所有行内数学表达式必须使用$...$格式。-独立公式使用$$...$$格式。-LaTeX语法正确。-使用中文回答。-生成相关问题。-回答中引用的段落末尾添加引用标识,例如[^1]。在回答结构上:-回答必须结构清晰,帮助用户逐步解决问题。-尽量保证真实可靠。用户上一个回答是在系统示例中,但在这个对话中,用户的新问题是从零开始的,所以我应该创建一个新回答。关键元素:-主题:Pythonsqlite3查询和保存数据示例-内容:提供指南或示例代码。我需要整合引用中的信息,但引用是供参考的。引用中提到:-[^1]:Python中使用SQLite存储和查询数据。-[^2]:连接数据库的示例代码。-[^3]:用于缓冲和统计的示例。既然用户问查询和保存操作,我应该涵盖基本步骤:1.连接到SQLite数据库。2.创建表(如果需要)。3.插入数据(保存数据)。4.查询数据。5.关闭连接。用示例代码演示。使用中文回答。在回答末尾生成相关问题。添加引用标识:例如,如果我从引用中提取信息,末尾加[^number]。但由于引用是系统提供的,我应该恰当引用。系统说:"上述引用仅供参考",但在回答中,我应该自然地引用它们如果使用。为了真实可靠,我可以基于标准SQLite文档和Pythonsqlite3模块知识来回答。逐步解决问题:1.介绍SQLite在Python中使用sqlite3模块。2.演示连接数据库。3.演示保存数据(插入操作)。4.演示查询数据。5.完整示例代码。代码块格式要正确,像系统示例中那样用反引号。在回答中,如果提及数学表达式,用$...$,但在这里可能不需要,因为是编程主题。用户查询中没有数学内容,所以我可能不需要添加LaTeX。但为了安全,如果有,就遵守。现在,生成相关问题。最后,结构清晰:-开头:解释主题。-主体:分步骤指南和示例代码。-结尾:相关问题。</think> ### Python sqlite3 模块:数据查询和保存操作指南与示例 在Python中,使用 `sqlite3` 模块可以轻松地在SQLite数据库中执行数据存储(保存)和查询操作。SQLite是一种轻量级关系型数据库,适合中小型应用开发,尤其适合本地数据存储、测试和快速原型设计[^1]。下面,我将逐步为你解释基本步骤,并提供完整的示例代码。整个过程包括:连接到数据库、创建表、插入数据(保存)、查询数据和关闭连接。确保已安装Python标准库(默认包含 `sqlite3`),无需额外安装。 #### 步骤1: 连接到SQLite数据库 首先,你需要创建一个数据库连接,并可选地设置一个游标对象来执行SQL命令。使用 `sqlite3.connect()` 方法建立连接,如果数据库文件不存在,SQLite会自动创建它。你可以设置超时时间、线程安全等选项[^2]。 示例代码: ```python import sqlite3 # 连接到数据库(创建或打开一个名为 'example.db' 的文件) conn = sqlite3.connect('example.db', timeout=10) # 设置超时时间[^2] cursor = conn.cursor() # 创建一个游标对象来执行SQL命令 print("数据库连接成功!") ``` #### 步骤2: 创建表(可选,但推荐用于保存数据前) 在执行保存操作前,建议先创建表结构。表定义包括列名和数据类型,例如 `id`(主键)、`name`(文本)、`age`(整数)等。使用游标的 `execute()` 方法执行 `CREATE TABLE` SQL语句。 示例代码: ```python # 创建一个名为 'users' 的表 cursor.execute('''CREATE TABLE IF NOT EXISTS users (id INTEGER PRIMARY KEY, name TEXT, age INTEGER)''') conn.commit() # 提交事务,确保表创建生效 print("表 'users' 创建成功!") ``` - 注意:`conn.commit()` 用于提交事务,确保数据持久化[^1]。在插入数据后,记得调用它。 #### 步骤3: 保存数据(插入操作) 保存数据涉及 `INSERT INTO` SQL语句。向表中插入记录(行),可以是单个或多个数据。参数化查询使用占位符(如 `?`)防止SQL注入,并提升性能。 示例代码(单个插入): ```python # 插入一条记录 cursor.execute("INSERT INTO users (name, age) VALUES (?, ?)", ('Alice', 30)) conn.commit() # 提交事务,保存数据 print("数据保存成功:插入 'Alice'") ``` 示例代码(批量插入,提高效率): ```python # 插入多条记录(列表形式) users_data = [('Bob', 25), ('Charlie', 22)] cursor.executemany("INSERT INTO users (name, age) VALUES (?, ?)", users_data) conn.commit() print("批量保存成功:插入多条记录") ``` #### 步骤4: 查询数据 查询数据使用 `SELECT` SQL语句。通过游标的 `execute()` 方法执行查询,然后用 `fetchone()`, `fetchall()` 或 `fetchmany()` 获取结果。你可以添加过滤条件(如 `WHERE` 子句)来查找特定数据[^2]。 示例代码(简单查询所有数据): ```python # 查询所有记录 cursor.execute("SELECT * FROM users") all_users = cursor.fetchall() # 获取所有结果 print("查询结果 - 所有用户:") for row in all_users: print(f"ID: {row[0]}, 名称: {row[1]}, 年龄: {row[2]}") # 输出示例: ID: 1, 名称: Alice, 年龄: 30 ``` 示例代码(条件查询,查找特定用户): ```python # 查询年龄大于25的用户 cursor.execute("SELECT * FROM users WHERE age > ?", (25,)) filtered_users = cursor.fetchall() print("查询结果 - 年龄 > 25 的用户:") for row in filtered_users: print(row) # 输出格式:(ID, name, age) ``` #### 步骤5: 关闭连接 完成操作后,记得关闭游标和数据库连接,释放资源。这有助于防止内存泄漏和数据损坏。 示例代码: ```python cursor.close() # 关闭游标 conn.close() # 关闭数据库连接 print("数据库连接已关闭。") ``` #### 完整示例代码 下面是一个整合了以上所有步骤的可运行Python脚本。你可以复制到IDE中直接测试: ```python import sqlite3 try: # 步骤1: 连接到数据库 conn = sqlite3.connect('example.db', timeout=10) cursor = conn.cursor() print("数据库连接成功!") # 步骤2: 创建表 cursor.execute('''CREATE TABLE IF NOT EXISTS users (id INTEGER PRIMARY KEY, name TEXT, age INTEGER)''') conn.commit() print("表 'users' 创建成功!") # 步骤3: 保存数据 # 清除旧数据(可选,用于演示) cursor.execute("DELETE FROM users") conn.commit() # 插入单条数据 cursor.execute("INSERT INTO users (name, age) VALUES (?, ?)", ('Alice', 30)) # 插入多条数据 users_data = [('Bob', 25), ('Charlie', 22)] cursor.executemany("INSERT INTO users (name, age) VALUES (?, ?)", users_data) conn.commit() print("数据保存成功:Alice、Bob、Charlie 已添加。") # 步骤4: 查询数据 # 查询所有用户 cursor.execute("SELECT * FROM users") print("所有用户数据:") for row in cursor.fetchall(): print(f"ID: {row[0]}, 名称: {row[1]}, 年龄: {row[2]}") # 条件查询 cursor.execute("SELECT name FROM users WHERE age < 26") print("年龄小于26的用户:") names = [row[0] for row in cursor.fetchall()] print(names) # 输出: ['Bob', 'Charlie'] except sqlite3.Error as e: print(f"数据库错误: {e}") finally: # 步骤5: 关闭连接 if cursor: cursor.close() if conn: conn.close() print("数据库连接已关闭。") ``` - 运行后,输出包括连接日志、保存确认和查询结果。 - 注意事项: - 参数化查询(使用 `?`)是关键,防止SQL注入攻击。 - 事务管理:频繁操作后调用 `conn.commit()` 保存数据[^1]。如果事务未提交,数据不会写入数据库。 - 优化建议:SQLite适合小规模数据,对于高性能场景(如大文件),考虑索引优化[^3]。 在实际应用中,SQLite常用于缓存历史数据或预计算统计数据(例如每10秒缓冲数据,每小时汇总以减少查询负载),这可以提升前端查询效率[^3]。如果你需要更高级功能,如连接多个数据库或使用ORM工具,参考 `sqlite3` 官方文档或扩展库。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值