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
相关产品推荐
相关产品推荐

