为什么sqlite3中fetchall返回的行计数不正确,已存在的表检测不到?
问题根因
- 核心错误为SQL查询语句的字符串格式化逻辑缺失:你在查询条件中写的
'{EMBEDDING}'没有经过任何字符串插值处理,SQLite实际执行时会匹配名称为{EMBEDDING}(包含两侧大括号)的表,和你实际创建的EMBEDDING表名完全不匹配,因此查询结果永远为空,table_count始终返回0。 - 次要逻辑缺陷:当前代码仅在表不存在、执行创建操作后才关闭数据库连接,若表已存在会跳过关闭逻辑,造成数据库连接资源泄漏。
修复方案
方案1:修正表存在性校验逻辑
如果需要保留手动校验的逻辑,直接将表名写死在查询语句中即可,不需要加占位符:
import sqlite3 conn = sqlite3.connect('embedding.db') print("Opened database successfully") # 校验语句直接写死表名 cursor = conn.execute("SELECT name FROM sqlite_master WHERE type='table' AND name='EMBEDDING';") table_count = len(cursor.fetchall()) if table_count == 0: conn.execute('''CREATE TABLE EMBEDDING (ID VARCHAR(32) PRIMARY KEY NOT NULL, bert TEXT NOT NULL);''') print("Table created successfully") # 关闭连接逻辑要放到判断外,所有分支都要执行 conn.close()
如果需要用变量存储表名,可使用f-string完成字符串插值:
table_name = "EMBEDDING" cursor = conn.execute(f"SELECT name FROM sqlite_master WHERE type='table' AND name='{table_name}';")
方案2:使用SQLite原生语法简化逻辑
SQLite原生支持CREATE TABLE IF NOT EXISTS语法,无需提前校验表是否存在,不存在时自动创建,存在时直接跳过执行,代码更简洁可靠:
import sqlite3 conn = sqlite3.connect('embedding.db') print("Opened database successfully") conn.execute('''CREATE TABLE IF NOT EXISTS EMBEDDING (ID VARCHAR(32) PRIMARY KEY NOT NULL, bert TEXT NOT NULL);''') print("Table initialized successfully") conn.close()
内容的提问来源于stack exchange,提问作者marlon
相关产品推荐
相关产品推荐

