今天在使用 Pandasto_sql 方法时,遇到一堆问题,一顿搜索后,靠谱的答案少之又少,各种被误导,特此记录

# 我的环境:

Mysql: 8.0.25
Python: 3.8.11

pandas: 1.3.4
sqlalchemy: 1.4.32
pymysql: 1.0.2

首先看一下 to_sql 方法的参数

DataFrame.to_sql(name, 
				 con, 
				 schema=None, 
                 if_exists='fail', 
	             index=True, 
                 index_label=None, 
                 chunksize=None, 
                 dtype=None, 
                 method=None)

真正需要注意的参数有四个:

  • name:数据库对应的表名
  • con:数据库引擎
  • if_exists:若表存在,如何选择, 默认为 fail
    • 若数据库 table 存在,需置为 append
  • index:将 DataFrame 索引写为列,默认 True
    • 若数据库 table 无对应字段,需置为 False

通过 Pandas 文档可知,参数 con 仅支持 sqlalchemy.engine 或者 sqlite3.Connection

con:sqlalchemy.engine.(Engine or Connection) or sqlite3.Connection
Using SQLAlchemy makes it possible to use any DB supported by that library. Legacy support is provided > for sqlite3.Connection objects. The user is responsible for engine disposal and connection closure for the > SQLAlchemy connectable See here.

💡 前提:保证 Dataframe 各列数据类型 与 Mysql 各字段数据类型一致

因此,正确的代码如下:

import pymysql
from sqlalchemy import create_engine

pymysql.install_as_MySQLdb()
engine = create_engine('mysql+mysqldb://user:passwd@localhost/db?charset=utf8')
df.to_sql(name='user', conengine)

或者

import pymysql
from sqlalchemy import create_engine

engine = create_engine('mysql+pymysql://user:passwd@localhost/db?charset=utf8')
df.to_sql(name='user', conengine)