Python3.10使用sqlite3从数据库取数赋值变量的问题
问题分析与解决方案
你的代码存在多处关键问题,导致无法输出预期的TestName:
1. SELECT语句未提取实际数据
cur.execute()返回的是游标对象,而非查询结果本身。要获取数据,必须调用游标对应的提取方法:
fetchone():获取查询结果的第一条记录(返回元组,如('TestName',))fetchall():获取所有记录(返回由元组组成的列表)- 直接遍历游标:
for row in cur: ...
2. INSERT逻辑存在缺陷
data_entry函数中的INSERT语句缺少VALUES子句,语法错误- 从未调用
data_entry()插入测试数据 con.commit未加括号,未实际提交事务
修正后的完整代码
import sqlite3 con = sqlite3.connect('main.db') cur = con.cursor() # 创建表(注意字段名大小写一致性,SQLite默认不区分,但建议统一) cur.execute('''CREATE TABLE IF NOT EXISTS datatable (Name PRIMARY KEY, age, pronouns) ''') name = 'TestName' age = 'TestAge' def data_entry(): # 使用参数化查询避免SQL注入,补全VALUES子句 # INSERT OR IGNORE 避免主键重复导致的报错 cur.execute("INSERT OR IGNORE INTO datatable (Name, age) VALUES (?, ?)", (name, age)) # 调用函数插入测试数据 data_entry() # 提交事务(必须加括号执行方法) con.commit() # 执行查询并提取数据 cur.execute('SELECT Name FROM datatable') result = cur.fetchone() if result: name = result[0] print(name) # 输出TestName else: print("无匹配数据") # 关闭数据库连接 con.close()
关键要点说明
- 参数化查询:用
?作为占位符,传入参数元组,是SQLite推荐的安全写法,避免SQL注入风险 - 主键冲突处理:
INSERT OR IGNORE可忽略重复主键的插入请求,防止报错 - 数据提取:
fetchone()适合单条数据场景,若需多条可使用fetchall()或直接遍历游标 - 事务提交:所有修改操作(INSERT/UPDATE/DELETE)必须调用
con.commit()才能持久化到数据库
内容的提问来源于stack exchange,提问作者MemeFox
相关产品推荐
相关产品推荐

