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

Flask中无法向SQLite3查询语句传入变量,寻求解决方法

解决SQLite3插入数据不生效的问题

你的问题核心是写操作没有提交事务,SQLite中INSERT/UPDATE/DELETE这类修改数据的操作需要显式提交事务才能将数据持久化到磁盘,以下是具体解决方案:

1. 分析原代码的问题

你实现的query_db函数仅适配SELECT类查询:

  • 它执行SQL后直接fetchall()获取结果,但INSERT操作不需要返回查询结果,反而需要提交事务。
  • 函数中没有调用数据库连接的commit()方法,导致插入操作仅停留在内存中,并未写入数据库。

你第二次尝试的代码存在两个问题:

  • 调用get_db.cursor()是错误的,应该是get_db().cursor()(get_db()返回数据库连接对象,再调用其cursor()方法)。
  • 同样没有执行commit()提交事务。

2. 正确的实现方式

方式一:改造query_db函数支持写操作

给函数添加commit参数,用于区分读/写操作:

def query_db(query, args=(), one=False, commit=False):
    db = get_db()
    cur = db.execute(query, args)
    # 写操作时提交事务
    if commit:
        db.commit()
    rv = cur.fetchall()
    cur.close()
    return (rv[0] if rv else None) if one else rv

调用插入操作时传入commit=True:

query_db("INSERT INTO users (name, email, pass) VALUES (?, ?, ?)", (name, email, password), commit=True)

方式二:单独封装写操作函数

更清晰的做法是拆分查询和写操作,单独写一个处理修改的函数:

def execute_db(query, args=()):
    db = get_db()
    cur = db.execute(query, args)
    db.commit()
    row_id = cur.lastrowid  # 可选,返回插入数据的行ID
    cur.close()
    return row_id

调用插入:

execute_db("INSERT INTO users (name, email, pass) VALUES (?, ?, ?)", (name, email, password))

方式三:手动提交事务(不推荐,重复代码多)

如果不想修改现有函数,也可以手动执行提交:

db = get_db()
cur = db.cursor()
cur.execute("INSERT INTO users (name, email, pass) VALUES (?, ?, ?)", (name, email, password))
db.commit()  # 必须执行这一步
cur.close()

内容的提问来源于stack exchange,提问作者Anatoliy

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 13:35:20