Discord bot使用sqlite3查询数据库匹配条目时无打印输出问题
问题原因及修复方案
核心错误
你代码运行到cur.execute行就直接抛出异常中断了,根本没有走到后续的if/else分支,所以两个print都不会执行,问题出在两个地方:
sqlite3.Cursor.execute的第二个参数要求传入序列类型(元组/列表等),你直接传入int类型的user_id,sqlite3会尝试将整数作为可迭代对象解析,直接触发类型错误,你没有捕获异常所以看不到报错,只看到没有输出。- 建表语句中的非空约束写法错误,
NOT_NULL是无效写法,SQLite标准非空约束为NOT NULL(中间为空格),虽然部分版本会兼容,但会导致非空校验不生效的潜在问题。
修复代码
1. 修正查询语句的参数传递
将check_db_entry中的查询行改为单元素元组格式,注意参数末尾的逗号不可省略,否则不会被识别为元组:
# 错误写法 # cur.execute('SELECT id FROM user WHERE id=?', user_id) # 正确写法 cur.execute('SELECT id FROM user WHERE id=?', (user_id,))
额外提示:查询操作不需要调用con.commit(),该方法仅用于增删改等修改数据的操作,你可以删除这行冗余代码。
2. 修正建表语句的约束写法
# 错误写法 # cur.execute('CREATE TABLE IF NOT EXISTS user (id INTEGER NOT_NULL, balance REAL NOT_NULL, text1 TEXT NOT_NULL, text2 TEXT NOT_NULL)') # 正确写法 cur.execute('CREATE TABLE IF NOT EXISTS user (id INTEGER NOT NULL, balance REAL NOT NULL, text1 TEXT NOT NULL, text2 TEXT NOT NULL)')
排查建议
如果修改后仍有异常,可以在调用check_db_entry的位置增加异常捕获,打印具体报错信息方便定位:
try: check_db_entry() except Exception as e: print(f"运行错误:{repr(e)}")
内容的提问来源于stack exchange,提问作者CodeIsLaw
相关产品推荐
相关产品推荐

