pandas.Series.to_sql#

Series.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 of sqlite3.Cursor or SQLAlchemy connectable which may not reflect the exact number of written rows as stipulated in the sqlite3SQLAlchemy

1.4.0 新版功能.

加薪
ValueError

当该表已经存在并且 if_exists 为‘FAIL’(默认设置)。

参见

read_sql

从表中读取DataFrame。

注意事项

支持时区的日期时间列将写入为 Timestamp with timezone 如果数据库支持,则使用SQLAlChemy键入。否则,日期时间将存储为原始时区本地的时区未知时间戳。

参考文献

1

https://docs.sqlalchemy.org

2

https://www.python.org/dev/peps/pep-0249/

示例

创建内存中的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,)]