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

Python脚本中SQLite表date字段格式更新无效问题排查

问题:Python中SQLite的UPDATE语句未生效,但SQLite Studio执行正常

问题描述

尝试将finances数据库register表中的date字段转换为日期格式。Python脚本运行无报错,但其中的UPDATE语句未生效;在SQLite Studio中执行相同的UPDATE语句则能正常生效,不清楚原因。

相关代码

Python脚本

import sqlite3
import pandas as pd

conn = sqlite3.connect('C:\SQLite\finances.db')
cursor = conn.cursor()
cursor_obj = conn.cursor()

# 读取CSV文件
df = pd.read_csv('C:\SQLite\finance_register.csv')

# 写入SQLite数据库
df.to_sql("register", conn, if_exists="replace", index=False)

# 修改列名
cursor.execute('''alter table register rename 'Category Group' to category_group''')
cursor.execute('''alter table register rename 'Account' to account''')
cursor.execute('''alter table register rename 'Flag' to flag''')
cursor.execute('''alter table register rename 'Date' to date''')
cursor.execute('''alter table register rename 'Payee' to payee''')
cursor.execute('''alter table register rename 'Category Group/Category' to category_group_category''')
cursor.execute('''alter table register rename 'Category' to category''')
cursor.execute('''alter table register rename 'Memo' to memo''')
cursor.execute('''alter table register rename 'Outflow' to outflow''')
cursor.execute('''alter table register rename 'Inflow' to inflow''')
cursor.execute('''alter table register rename 'Cleared' to cleared''')

# 转换date字段格式
cursor.execute('''update register set date = substr(date, 7, 4) || '-' || substr(date, 1, 2) || '-' || substr(date, 4, 2)''')
    
conn.close()

SQLite Studio中执行的SQL语句

update register set date=substr(date, 7, 4) || '-' || substr(date, 1, 2) || '-' || substr(date, 4, 2);

原因分析

SQLite的Python接口默认开启事务机制,执行UPDATE这类修改操作后,如果没有主动提交事务,所有修改会在连接关闭时自动回滚,导致修改不生效。而SQLite Studio默认开启自动提交模式,执行语句后会立即将修改写入数据库,所以语句能正常生效。

解决方法

有两种可行的解决方式:

方式1:手动提交事务

在执行完UPDATE语句后,调用conn.commit()提交事务,再关闭连接。修改后的关键代码如下:

# 转换date字段格式
cursor.execute('''update register set date = substr(date, 7, 4) || '-' || substr(date, 1, 2) || '-' || substr(date, 4, 2)''')
# 提交事务
conn.commit()
conn.close()

方式2:开启自动提交模式

在连接数据库时设置isolation_level=None,让所有操作自动提交:

conn = sqlite3.connect('C:\SQLite\finances.db', isolation_level=None)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.14 09:01:13