pandas.DataFrame.to_sql#
- DataFrame.to_sql(name, con, schema=None, if_exists='fail', index=True, index_label=None, chunksize=None, dtype=None, method=None)[源代码]#
将存储在DataFrame中的记录写入SQL数据库。
SQLAlChemy支持的数据库 [1] 都是受支持的。可以新创建、追加或覆盖表格。
- 参数
- name应力
SQL表的名称。
- con(引擎或连接)或sqlite3.Connection
通过使用SQLAlChemy,可以使用该库支持的任何数据库。为sqlite3.Connection对象提供了遗留支持。用户负责SQLAlChemy可连接组件的引擎处置和连接关闭(请参阅 here 。
- schema字符串,可选
指定模式(如果数据库风格支持该模式)。如果没有,则使用默认架构。
- if_exists{‘FAIL’,‘REPLACE’,‘APPEND’},默认为‘FAIL’
如果该表已经存在,该如何操作。
失败:引发ValueError。
替换:在插入新值之前删除该表。
追加:在现有表中插入新值。
- index布尔值,默认为True
将DataFrame索引作为列写入。用途 index_label 作为表中的列名。
- index_label字符串或序列,默认为无
索引列的列标签。如果未给出(默认),则为 index 为True,则使用索引名称。如果DataFrame使用多索引,则应给出序列。
- chunksize整型,可选
指定要一次写入的每批中的行数。默认情况下,将一次写入所有行。
- dtypeDict或标量,可选
指定列的数据类型。如果使用字典,则键应该是列名,值应该是SQLAlChemy类型或用于SQLite3遗留模式的字符串。如果提供了标量,它将应用于所有列。
- method{无,‘多’,可调用},可选
控制使用的SQL INSERT子句:
无:使用标准SQL
INSERT
子句(每行一个)。“MULTI”:将多个值在一个
INSERT
条款。可通过签名调用
(pd_table, conn, keys, data_iter)
。
有关详细信息和可调用的实现示例,请参阅 insert method 。
- 退货
- 无或整型
受TO_SQL影响的行数。如果可调用对象传递到
method
不返回行数。受影响的返回行数是
rowcount
attribute ofsqlite3.Cursor
or SQLAlchemy connectable which may not reflect the exact number of written rows as stipulated in the sqlite3 或 SQLAlchemy 。1.4.0 新版功能.
- 加薪
- ValueError
当该表已经存在并且 if_exists 为‘FAIL’(默认设置)。
参见
read_sql
从表中读取DataFrame。
注意事项
支持时区的日期时间列将写入为
Timestamp with timezone
如果数据库支持,则使用SQLAlChemy键入。否则,日期时间将存储为原始时区本地的时区未知时间戳。参考文献
示例
创建内存中的SQLite数据库。
>>> from sqlalchemy import create_engine >>> engine = create_engine('sqlite://', echo=False)
从头开始创建一个包含3行的表。
>>> df = pd.DataFrame({'name' : ['User 1', 'User 2', 'User 3']}) >>> df name 0 User 1 1 User 2 2 User 3
>>> df.to_sql('users', con=engine) 3 >>> engine.execute("SELECT * FROM users").fetchall() [(0, 'User 1'), (1, 'User 2'), (2, 'User 3')]
一个 sqlalchemy.engine.Connection 也可以传递给 con :
>>> with engine.begin() as connection: ... df1 = pd.DataFrame({'name' : ['User 4', 'User 5']}) ... df1.to_sql('users', con=connection, if_exists='append') 2
这是为了支持要求对整个操作使用相同的DBAPI连接的操作。
>>> df2 = pd.DataFrame({'name' : ['User 6', 'User 7']}) >>> df2.to_sql('users', con=engine, if_exists='append') 2 >>> engine.execute("SELECT * FROM users").fetchall() [(0, 'User 1'), (1, 'User 2'), (2, 'User 3'), (0, 'User 4'), (1, 'User 5'), (0, 'User 6'), (1, 'User 7')]
只需用以下命令覆盖该表
df2
。>>> df2.to_sql('users', con=engine, if_exists='replace', ... index_label='id') 2 >>> engine.execute("SELECT * FROM users").fetchall() [(0, 'User 6'), (1, 'User 7')]
指定数据类型(对于缺少值的整数尤其有用)。请注意,虽然Pandas被强制以浮点形式存储数据,但数据库支持可以为空的整数。当使用Python获取数据时,我们得到的是整型标量。
>>> df = pd.DataFrame({"A": [1, None, 2]}) >>> df A 0 1.0 1 NaN 2 2.0
>>> from sqlalchemy.types import Integer >>> df.to_sql('integers', con=engine, index=False, ... dtype={"A": Integer()}) 3
>>> engine.execute("SELECT * FROM integers").fetchall() [(1,), (None,), (2,)]