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

Python经SSH连接MySQL插入数据仅临时生效问题解决

问题描述

因大学项目需求租用服务器部署MySQL数据库,在Python中通过SSH隧道连接服务器(已知该方案并非最优实践),向数据库表插入数据时出现异常:

  • 同一Python程序进程内,执行INSERT语句后直接执行SELECT语句,可以查询到刚插入的值
  • 第二次运行程序、移除INSERT语句仅执行查询逻辑时,无法查到之前插入的值,直接查看数据库表也能确认对应数据并未实际持久化写入。
问题复现代码
from sshtunnel import SSHTunnelForwarder
from mysql import connector

with SSHTunnelForwarder(('ip_ssh_server', 22),
                        ssh_username='ssh_username',
                        ssh_password='ssh_password',
                        remote_bind_address=('127.0.0.1', 3306)) as ssh_tunnel:

    db = connector.MySQLConnection (
        user='database_user',
        password='database_password',
        host='127.0.0.1',
        port=ssh_tunnel.local_bind_port,
        database='database_name'
    )

    cursor = db.cursor()
    query = "INSERT INTO MyTable (MyColumn) VALUES ('Hello, World!')"
    cursor.execute(query)

    query = "SELECT MyColumn FROM MyTable"
    cursor.execute(query)
    result = cursor.fetchall()

    for i in result:
        print(i)

    db.close()
问题原因

MySQL InnoDB引擎默认采用事务机制,mysql-connector驱动默认关闭自动提交配置。执行INSERT这类写操作后,如果没有主动提交事务,当前连接内可以看到事务未提交的变更,但连接关闭时未提交的事务会被自动回滚,变更不会持久化到磁盘,因此后续新连接查询、直接查表都看不到之前插入的数据。

解决方案

在数据库连接配置中添加autocommit=True参数开启自动提交,修改后的数据库连接初始化代码如下:

db = connector.MySQLConnection (
    user='database_user',
    password='database_password',
    host='127.0.0.1',
    port=ssh_tunnel.local_bind_port,
    database='database_name',
    autocommit=True
)

如果不需要全局开启自动提交,也可以在每次执行完写操作后,手动调用db.commit()提交当前事务,同样可以保证数据持久化。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.03 04:51:37