今天在使用 Pandas
的 to_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
- 若数据库 table 存在,需置为
index
:将 DataFrame 索引写为列,默认True
- 若数据库 table 无对应字段,需置为
False
- 若数据库 table 无对应字段,需置为
通过 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)