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

Python操作MySQL执行INSERT语句无报错但数据未插入问题求助

问题根因

你封装的database_connection函数每次被调用都会新建一个独立的数据库连接:你第一次调用函数获取游标时,在连接A上执行了INSERT语句;第二次调用函数获取连接时,拿到的是全新的连接B,此时提交连接B不会对连接A上的未提交事务生效。连接A的资源被回收时,未提交的事务会自动回滚,因此数据表看不到插入的数据。

修复方案

1. 调整调用逻辑,保证操作在同一个连接上完成

修改create_groupone_account_login函数,单次获取连接后再生成对应游标,所有操作都在同一个连接上执行,最后提交该连接的事务:

def create_groupone_account_login(groupone_account_id):
    groupone_account_login_created = False
    # 单次获取连接,基于该连接生成游标
    connection = database_connection("connection")
    cursor = connection.cursor()
    try:
        time = datetime.utcnow().isoformat()[:-3] + 'Z'
        # 改用参数化查询,避免SQL注入风险,无需手动拼接引号
        sql_create_account_login = "INSERT INTO account_login (groupone_account_id, login_date) VALUES (%s, %s)"
        cursor.execute(sql_create_account_login, (groupone_account_id, time))
        # 提交当前操作所在连接的事务
        connection.commit()
        groupone_account_login_created = True
    except Exception as e:
        # 操作异常时回滚事务
        connection.rollback()
        print(f"插入操作失败: {str(e)}")
    finally:
        # 无论操作成功与否都释放资源,避免连接泄漏
        cursor.close()
        connection.close()
    return groupone_account_login_created

2. 可选优化:调整database_connection封装逻辑

如果需要减少重复建连开销,可以引入数据库连接池,避免每次调用都新建TCP连接。如果是低频次调用场景,保持现有实现即可,只需注意同一次数据库操作不要多次调用该函数生成多个连接。

额外排查点

如果修改后仍然无法插入,可以检查两点:

  • 确认account_login表的login_date字段类型和传入的时间格式匹配,避免隐式类型转换导致插入失败
  • 确认表没有设置唯一约束、插入触发器等会拦截写入的规则

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 07:54:01