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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.08 11:45:03