You need to enable JavaScript to run this app. 为什么sqlite3中fetchall返回的行计数不正确,已存在的表检测不到?
优惠活动
大模型
产品
解决方案
定价
更多

为什么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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.17 09:06:07