Python3用pymysql操作MariaDB无报错但未写入数据问题求助
问题根源
PyMySQL默认关闭事务自动提交,所有增删改操作执行后,必须主动调用数据库连接对象的commit()方法才会将数据真正持久化到磁盘。你在MariaDB终端执行SQL可以成功,是因为终端客户端默认开启了autocommit模式,执行语句后自动触发了提交动作。
未提交的事务会在连接关闭后自动回滚,所以你的代码没有报错,也看不到写入的数据。另外你现有代码的connect()函数仅返回游标对象,丢失了数据库连接实例,无法调用提交方法。
修复方案
方案1:手动提交事务(推荐,更安全,适合需要多语句事务的场景)
修改代码如下:
import pymysql class C_DataBase: # Database Communication Class def __init__(self, host_ip, db_name, user_name, password, poll_time = None): self.ip = host_ip self.db = db_name self.un = user_name self.pw = password if poll_time is not None: self.pt = poll_time def connect(db): try: con = pymysql.connect(host=db.ip, user=db.un, passwd=db.pw, db=db.db) # 同时返回连接对象和游标对象 return con, con.cursor() except Exception as e: print('DBOpenError, Failed to Connect to={}, IP={}, user={}, pw={}'.format(db.db, db.ip, db.un, db.pw)) def pub_sql(db, cons, prod, msgb): # 接收连接对象和游标 conn, cursor = connect(db) # 改用参数化查询,避免SQL注入风险,无需手动拼接引号 sql = "INSERT INTO msg_store (cons, prod, file) VALUES (%s, %s, %s);" try: rslt = cursor.execute(sql, (cons, prod, msgb)) # 执行语句后提交事务 conn.commit() print(rslt, sql) cursor.close() conn.close() except Exception as e: # 异常时回滚事务,避免产生脏数据 conn.rollback() print('SQLWriteError={}'.format(e)) if __name__ == '__main__': db = C_DataBase('localhost', 'testdb', 'rpi', 'rpi') pub_sql(db, 'XXX', 'YYY', 'AAA')
方案2:开启连接自动提交
如果不需要多语句事务控制,可以在建立连接时直接开启自动提交,无需每次手动调用commit:
# 修改connect函数中的连接创建逻辑,新增autocommit参数 con = pymysql.connect(host=db.ip, user=db.un, passwd=db.pw, db=db.db, autocommit=True)
内容的提问来源于stack exchange,提问作者Simon Dreyer
相关产品推荐
相关产品推荐

