数据库
从数据库读取
Polars 可以使用 `pl.read_database_uri` 和 `pl.read_database` 函数从数据库读取数据。
read_database_uri
与 read_database
的区别
如果你想使用名为 `uri` 的连接字符串来指定数据库连接,请使用 `pl.read_database_uri`。例如,以下代码片段展示了一个查询,该查询从 Postgres 数据库中的 `foo` 表读取所有列,我们使用 `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`。
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 的驱动程序仅适用于 Postgres、SQLite 和 Snowflake。要安装 ADBC,你需要安装对应数据库的驱动程序。例如,要安装 SQLite 的驱动程序,你运行
$ pip install adbc-driver-sqlite
由于 ADBC 不是默认引擎,你必须将引擎指定为 `pl.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` 的表。
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 驱动程序。
uri = "postgresql://username:password@server:port/database"
df = pl.DataFrame({"foo": [1, 2, 3]})
df.write_database(table_name="records", connection=uri, engine="adbc")