当前位置: 首页>>代码示例 >>用法及示例精选 >>正文


Python 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] 支持的数据库。可以新创建、附加或覆盖表。

参数

namestr

SQL 表的名称。

consqlalchemy.engine(引擎或连接)或 sqlite3.Connection

使用 SQLAlchemy 可以使用该库支持的任何数据库。为 sqlite3.Connection 对象提供了旧版支持。用户负责 SQLAlchemy 可连接的引擎处理和连接关闭,请参阅这里

schemastr,可选

指定架构(如果数据库风格支持此)。如果没有,使用默认模式。

if_exists{‘fail’, ‘replace’, ‘append’},默认 ‘fail’

如果表已经存在,如何表现。

  • 失败:引发ValueError

  • 替换:在插入新值之前删除表。

  • append:向现有表中插入新值。

index布尔值,默认为真

将DataFrame 索引写为一列。使用index_label 作为表中的列名。

index_labelstr 或序列,默认无

索引列的列标签。如果给出 None(默认)并且 index 为 True,则使用索引名称。如果DataFrame 使用MultiIndex,则应给出一个序列

chunksizeint 可选

指定每次要写入的每批中的行数。默认情况下,将一次写入所有行。

dtypedict或标量,可选

指定列的数据类型。如果使用字典,键应该是列名,值应该是 SQLAlchemy 类型或 sqlite3 旧模式的字符串。如果提供了标量,它将应用于所有列。

method{无,‘multi’,可调用},可选

控制使用的 SQL 插入子句:

  • 无:使用标准 SQL INSERT 子句(每行一个)。

  • ‘multi’:在单个 INSERT 子句中传递多个值。

  • 可使用签名 (pd_table, conn, keys, data_iter) 调用。

详细信息和示例可调用实现可以在部分插入方法中找到。

返回

无或int

受to_sql 影响的行数。如果传递给method 的可调用对象不返回行数,则返回无。

受影响的返回行数是 sqlite3.Cursor 或 SQLAlchemy 可连接的 rowcount 属性的总和,这可能无法反映 sqlite3SQLAlchemy 中规定的写入行的确切数量。

抛出

ValueError

当表已存在且if_exists 为‘fail’(默认值)时。

注意

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

参考

pandas.DataFrame.to_sql

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')]

指定 dtype(对于缺少值的整数特别有用)。请注意,虽然 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,)]

相关用法


注:本文由纯净天空筛选整理自pandas.pydata.org大神的英文原创作品 pandas.DataFrame.to_sql。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。