跳到内容

数据库

从数据库读取

Polars 可以使用 `pl.read_database_uri` 和 `pl.read_database` 函数从数据库读取数据。

read_database_uriread_database 的区别

如果你想使用名为 `uri` 的连接字符串来指定数据库连接,请使用 `pl.read_database_uri`。例如,以下代码片段展示了一个查询,该查询从 Postgres 数据库中的 `foo` 表读取所有列,我们使用 `uri` 进行连接

read_database_uri

import polars as pl

uri = "postgresql://username:password@server:port/database"
query = "SELECT * FROM foo"

pl.read_database_uri(query=query, uri=uri)

另一方面,如果你想通过使用 SQLAlchemy 等库创建的连接引擎进行连接,请使用 `pl.read_database`。

read_database

import polars as pl
from sqlalchemy import create_engine

conn = create_engine(f"sqlite:///test.db")

query = "SELECT * FROM foo"

pl.read_database(query=query, connection=conn.connect())

请注意,如果你正在使用 SQLAlchemy 或 DBAPI2 连接,`pl.read_database_uri` 可能比 `pl.read_database` 更快,因为这些连接可能会先将数据按行加载到 Python 中,然后再将数据复制到列式的 Apache Arrow 格式。

引擎

Polars 本身不管理数据库连接和数据传输。相反,外部库(称为*引擎*)处理这些。

使用 `pl.read_database` 时,你在创建连接对象时指定引擎。使用 `pl.read_database_uri` 时,你可以指定以下两种引擎之一从数据库读取数据

这两种引擎都原生支持 Apache Arrow,因此可以直接将数据读取到 Polars `DataFrame` 中,无需复制数据。

ConnectorX

ConnectorX 是默认引擎,支持包括 Postgres、Mysql、SQL Server 和 Redshift 在内的多种数据库。ConnectorX 用 Rust 编写,并将数据以 Arrow 格式存储,以实现零拷贝到 Polars。

要使用 `ConnectorX` 从支持的数据库中读取数据,你需要在安装 Polars 时激活额外的依赖项 `ConnectorX`,或者手动安装它,通过

$ pip install connectorx

ADBC

ADBC (Arrow Database Connectivity) 是 Apache Arrow 项目支持的一种引擎。ADBC 旨在成为连接数据库的 API 标准,以及在多种语言中实现此标准的库。

ADBC 尚处于早期阶段,因此对不同数据库的支持有限。目前,ADBC 的驱动程序仅适用于 PostgresSQLiteSnowflake。要安装 ADBC,你需要安装对应数据库的驱动程序。例如,要安装 SQLite 的驱动程序,你运行

$ pip install adbc-driver-sqlite

由于 ADBC 不是默认引擎,你必须将引擎指定为 `pl.read_database_uri` 的一个参数。

read_database_uri

uri = "postgresql://username:password@server:port/database"
query = "SELECT * FROM foo"

pl.read_database_uri(query=query, uri=uri, engine="adbc")

写入数据库

我们可以使用 Polars 的 `pl.write_database` 函数写入数据库。

引擎

与从数据库读取数据类似,Polars 使用*引擎*将数据写入数据库。目前支持的引擎有

  • SQLAlchemy
  • Arrow Database Connectivity (ADBC)

SQLAlchemy

使用默认引擎 SQLAlchemy,你可以写入任何 SQLAlchemy 支持的数据库。要使用此引擎,你需要安装 SQLAlchemy 和 Pandas

$ pip install SQLAlchemy pandas

在此示例中,我们将 `DataFrame` 写入数据库中名为 `records` 的表。

write_database

uri = "postgresql://username:password@server:port/database"
df = pl.DataFrame({"foo": [1, 2, 3]})

df.write_database(table_name="records",  connection=uri)

在 SQLAlchemy 方法中,Polars 将 `DataFrame` 转换为由 PyArrow 支持的 Pandas `DataFrame`,然后使用 Pandas `DataFrame` 上的 SQLAlchemy 方法将数据写入数据库。

ADBC

ADBC 也可用于写入数据库。写入操作支持与 ADBC 读取操作相同的数据库。如上所示,你需要为你的数据库安装相应的 ADBC 驱动程序。

write_database

uri = "postgresql://username:password@server:port/database"
df = pl.DataFrame({"foo": [1, 2, 3]})

df.write_database(table_name="records", connection=uri, engine="adbc")