You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 22:45:35