- 源码:
def to_sql(
self,
name,
con,
schema=None,
if_exists="fail",
index=True,
index_label=None,
chunksize=None,
dtype=None,
method=None,
):
- 函数功能: 将存储在DataFrame中的记录写入SQL数据库。
- 参数:
name
:要写入的表的名字con
:创建数据库连接的对象。仅支持由sqlalchemy.engine.Engine
与sqlite3.Connection
创建的连接schema
:用于创建数据库对象,基本上都是使用默认值。参考if_exists
:如果表存在怎么办?- fail:抛出
ValueError
异常 - replace:在插入数据之前删除表。
注意不是仅删除数据,是删除原来的表,重新建表哦。
- append:插入新数据。
如果有主键,要避免主键冲突;看清表的格式,DataFrame的columns与表的columns是对应的;DF的index默认是作为一列数据的,也就是说默认会写入数据库的,下面仔细介绍:
- fail:抛出
index
:将索引作为一列写入数据库,默认为True,也就是说默认DF的索引是要写入数据库的
,index_label
为列名index_label
:将索引写入数据库时的列名,默认为index
;如果DF是多级索引,则index_label应为一个序列chunksize
:批处理,每次处理多少条数据。默认全部,一般没啥用,除非数据量太大,明显感觉卡的时候可以分批处理。dtype
:一个字典,指定列的数据类型。键是列的名字,值是sqlalchemy types
或者sqlite3的字符串形式
。如果是新建表,则需要指定类型,不然会以存储量最大类型作为默认类型。比如varchar类型就会成为text类型,空间资源浪费很多。如果是添加数据,则一般不需要规定该参数。sqlclchemy的类型基本都在sqlalchemy.types及sqlalchemy模块下,比如:sqlalchemy.types.INT、 sqlalchemy.INT
method
:哪种类型的插入语句?- None:默认单行插入
- ‘multi’:多行插入
- callable:以回调函数插入,写函数的名字,没用过。
- 实例:较多的时候我们只想添加一些数据,以添加数据为例
user表:id自增主键
id | name |
---|---|
1 | 一 |
2 | 二 |
3 | 三 |
添加一些数据: |
import pandas as pd
from sqlalchemy import create_engine
df = pd.DataFrame([["四"], ["五"], ["六"]], columns=['name'])
# 创建Engine实例
engine = create_engine("mysql+pymysql://root:root@localhost:3306/test")
# 创建数据库连接
con = engine.connect()
df.to_sql('user', con, if_exists="append", index=False)
结果:
id | name |
---|---|
1 | 一 |
2 | 二 |
3 | 三 |
4 | 四 |
5 | 五 |
6 | 六 |
【sqlalchemy的使用】参考
# 创建Engine实例
engine = create_engine("dialect+driver://username:password@host:port/database")
# 创建数据库连接
con = engine.connect()
dialect:方言,用于指定哪种数据库,比如:mysql
driver:驱动,用于连接数据库的驱动,不同数据库的驱动不一样。以mysql为例,有:pymysql、mysqldb
username:用户名,比如:root
password:密码,比如:123456
host:主机,比如:localhost
port:端口,比如:3306
database:数据库名字,比如:test
例:engine = create_engine("mysql+pymysql://root:123456@localhost:3306/test")