dataframe 插入mysql报错mysqlpymysql.err.OperationalError: (2006, “MySQL server has gone away (Connection

一个简单的执行dataframe数据插入mysql
data.to_sql('xxx', engine, if_exists='append', index=False)

mysql一个字段内文本较长超过4m导致dataframe存入mysql报错:

mysqlpymysql.err.OperationalError: (2006, "MySQL server has gone away (ConnectionAbortedE …

调大mysql配置 临时 | 改my.cnf

show VARIABLES like '%max_allowed_packet%';
set global max_allowed_packet = 1024*1024*32;
### 解决 pymysql.err.ProgrammingError (1064) 和指定第一列为 MySQL 表主键的方法 #### 错误原因分析 `pymysql.err.ProgrammingError: (1064, "You have an error in your SQL syntax")` 是由于 SQL 语句语法不符合 MySQL 的标准所引发的错误。通常这种问题可能是由以下几种情况引起的: - 默认值设置不当,例如使用双引号而非单引号包裹字符串[^1]。 - 数据库版本与框架(如 Django 或 SQLAlchemy)之间的兼容性问题[^3]。 - 创建表时主键定义有误或缺失必要的关键字。 --- #### 修改后的 SQL 语句示例 针对原始代码中的 `create_sql` 部分进行了调整,确保默认值使用单引号 `' '` 而非其他形式,并明确指定了第一列 (`user_id`) 为主键: ```python create_sql = """ CREATE TABLE IF NOT EXISTS user ( user_id INT(10) UNSIGNED AUTO_INCREMENT, user_name VARCHAR(30) NOT NULL DEFAULT ' ', user_nickname VARCHAR(30) NOT NULL DEFAULT ' ', user_postbox VARCHAR(30) NOT NULL DEFAULT ' ', user_phonenumber VARCHAR(11) NOT NULL DEFAULT ' ', user_password VARCHAR(100) NOT NULL DEFAULT ' ', PRIMARY KEY (user_id) ); """ ``` 在此修正版中注意到了几个关键点: - 所有的默认值均采用单引号包裹的形式,避免了因转义字符或其他特殊符号引起的问题[^1]。 - 明确指出 `PRIMARY KEY (user_id)` 来设定第一个字段作为自增型主键。 --- #### 使用 pymysql 插入数据到 MySQL 中的例子 下面展示了一种安全的方式通过 pymysql 向上述创建好的表格里插入新纪录: ```python import pymysql connection = pymysql.connect( host='localhost', user='root', password='password', database='test_db' ) try: with connection.cursor() as cursor: sql_insert = """ INSERT INTO user(user_name, user_nickname, user_postbox, user_phonenumber, user_password) VALUES (%s, %s, %s, %s, %s) """ values_to_insert = ('John Doe', 'JD', 'john@example.com', '1234567890', 'hashed_password_123') cursor.execute(sql_insert, values_to_insert) connection.commit() finally: connection.close() ``` 这里采用了占位符 `%s` 替代直接拼接字符串进入查询串内的做法,从而有效预防 SQL 注射攻击的同时也减少了手写复杂表达式的负担。 --- #### 结合 Pandas DataFrame 及 SQLite 主键配置 对于原提问提到关于如何在 SQLite 下利用 `to_sql()` 函数同时设立首列为唯一标识符的情况,可参考先前提供的实例稍作修改即可达成目的: ```python def setup_primary_key(df, conn, table_name): # Drop existing table if it exists. drop_table_query = f"DROP TABLE IF EXISTS {table_name};" conn.execute(drop_table_query) # Create new table structure specifying first column as primary key. columns_definition = ", ".join([f"{col} TEXT" for col in df.columns]) create_table_query = f"CREATE TABLE {table_name} ({df.columns[0]} TEXT PRIMARY KEY, {columns_definition});" conn.execute(create_table_query) # Insert dataframe into newly created table without including index. df.to_sql(name=table_name, con=conn, if_exists="append", index=False) # Example usage: data_df = pd.DataFrame({ "unique_identifier": ["A", "B"], "value_column": [10, 20] }) with sqlite3.connect(":memory:") as memory_conn: setup_primary_key(data_df, memory_conn, "sample_table") result_check = pd.read_sql("SELECT * FROM sample_table;", memory_conn) print(result_check) ``` 此函数先移除旧表再重建带有所需主键属性的新表,最后才调用 `to_sql()` 方法完成实际的数据填充工作流程。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值