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

Python sqlite3中connection.commit()未提交至数据库问题求助

问题:SQLite插入数据后调用commit(),但数据库无新增记录(Flask + sqlite3)

问题描述

使用Python Flask开发Web服务器,后端基于sqlite3模块,向Sessions表插入新记录后调用connection.commit(),无异常抛出且能返回预期SessionId,但查询数据库时看不到新增数据。

附原代码:

def Session(Date, UserId):
    print(Date, UserId)
    id = Identifiers()
    cursor.execute(("INSERT INTO Sessions VALUES ({2}, '{1}', {0})").format(UserId, Date, id.current('Session')))
    id.new('Session')
    connection.commit()
    statistics.New('DATABASE', 'writes')
    return int(id.current('Session')) - 1

可能原因及解决办法

1. 字符串拼接SQL导致隐性语法错误

原代码用str.format()拼接SQL语句,若Date包含单引号、特殊字符,或UserId/SessionId格式不符合SQL语法,会破坏SQL结构,但sqlite3可能在某些场景下不抛出明显异常,导致插入静默失败。

解决办法:改用参数化查询
sqlite3支持参数化查询,用?作为占位符,自动处理字符串转义和语法问题,同时避免SQL注入:

cursor.execute("INSERT INTO Sessions VALUES (?, ?, ?)", (id.current('Session'), Date, UserId))

2. Cursor与Connection实例不匹配

如果cursor不是从当前调用commit()的connection创建的(比如全局cursor对应另一个连接),插入操作不会被当前事务包含,commit()自然不会生效。

解决办法:确保Cursor由当前Connection创建
在需要执行SQL前,从目标connection生成cursor:

# 替换全局cursor的定义,每次操作前获取当前连接的cursor
cursor = connection.cursor()
cursor.execute(...)

3. 数据库文件路径错误(Flask上下文问题)

Flask中若使用相对路径指定数据库,不同请求上下文的工作目录可能不同,导致写入的是另一个数据库文件,而你查询的是原文件。

解决办法:使用绝对路径指定数据库

import os
from flask import Flask

app = Flask(__name__)
# 基于Flask应用根目录生成绝对路径
DATABASE_PATH = os.path.join(app.root_path, 'your_database.db')
# 初始化连接时使用绝对路径
connection = sqlite3.connect(DATABASE_PATH)

4. 隐性约束冲突或主键问题

若SessionId重复(违反主键唯一性约束),或其他字段不符合表结构约束,sqlite3可能静默失败(取决于连接配置),但不会抛出异常。

解决办法:添加异常捕获与日志
在执行SQL和commit前后增加错误捕获,打印详细信息:

def Session(Date, UserId):
    print(Date, UserId)
    id = Identifiers()
    session_id = id.current('Session')
    try:
        cursor.execute("INSERT INTO Sessions VALUES (?, ?, ?)", (session_id, Date, UserId))
        # 检查受影响行数,确认插入是否成功
        if cursor.rowcount == 0:
            print("警告:无数据插入,可能存在约束冲突")
        id.new('Session')
        connection.commit()
        statistics.New('DATABASE', 'writes')
        return int(session_id)
    except Exception as e:
        connection.rollback()
        print(f"插入失败详情: {str(e)}")
        raise  # 重新抛出异常,便于上层处理

5. Identifiers类逻辑异常

若id.current('Session')返回的不是合法的主键值,或id.new('Session')未正确递增主键,可能导致插入无效数据或主键冲突。

解决办法:验证Identifiers的返回值
在插入前打印session_id,确认其合法性:

session_id = id.current('Session')
print(f"待插入的SessionId: {session_id}")

同时检查Sessions表的主键定义,确保session_id符合主键要求(唯一、非空等)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 08:12:50