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

