为何数据库仅在创建新表后才会更新显示数据?
问题描述
在Jupyter Notebook中通过Python执行SQL插入操作后,pd.read_sql能正常查询到插入的数据,但HeidiSQL中无法实时看到:数据库标签显示对应行数,但查看表数据时显示0行,只有创建新表后,旧表的数据才会在HeidiSQL中显示。
插入数据的代码:
cur.execute("CREATE TABLE table_1 (col_1 INT, col_2 INT, col_3 DOUBLE, col_4 DOUBLE, col_5 DOUBLE, col_6 BIGINT)") query = 'INSERT INTO table_1 (col_1, col_2, col_3, col_4, col_5, col_6) VALUES(%s, %s, %s, %s, %s, %s)' my_data = [] for row in data_df: my_data.append(tuple(row)) cur.executemany(query, my_data)
查询数据的代码:
pd.read_sql( '''SELECT * FROM table_1''',conn)
解决方案
这是因为Python的数据库连接默认未开启自动提交,插入操作属于未提交的事务,只有当前连接(Jupyter中的conn)能看到未提交的数据,其他客户端(如HeidiSQL)无法读取到未提交的事务内容。而创建新表的操作会触发隐式事务提交,所以之前的插入数据才会被持久化并可见。
解决方法有两种:
方法1:手动提交事务
在cur.executemany执行完成后,调用连接对象的commit()方法:cur.executemany(query, my_data) conn.commit() # 新增这行提交事务方法2:开启自动提交
在建立数据库连接时,设置自动提交模式(以MySQL为例):# 建立连接时开启自动提交 conn = mysql.connector.connect( host="your_host", user="your_user", password="your_password", database="your_db", autocommit=True # 开启自动提交 )
验证:提交事务后,直接在HeidiSQL中刷新表数据,就能看到插入的内容了。
内容的提问来源于stack exchange,提问作者Maite Martinez
相关产品推荐
相关产品推荐

