PostgreSQL 驱动程序¶
语言:C/C++ 状态:稳定
PostgreSQL 驱动程序提供对任何支持 PostgreSQL 通信协议的数据库的访问。它封装了 PostgreSQL 的客户端库 libpq。该项目的整体架构借鉴了 0x0L 的 pgeon 项目。
注意
本项目与 PostgreSQL 没有任何关联。
注意
该驱动程序对 Amazon Redshift 提供实验性支持。由于 Redshift 不支持以 PostgreSQL 二进制格式读取或写入 COPY,因此在连接到 Redshift 时,用于加速查询的优化功能将被禁用。功能方面可能还存在其他差异;如果遇到问题,请提交错误报告。
安装¶
从 conda-forge 安装 libadbc-driver-postgresql
mamba install libadbc-driver-postgresql
安装 C/C++ 驱动程序,然后使用 Go 驱动程序管理器。需要 CGO。
go get github.com/apache/arrow-adbc/go/adbc/drivermgr
从 conda-forge 安装 adbc-driver-postgresql
mamba install adbc-driver-postgresql
从 PyPI 安装 adbc-driver-postgresql
pip install adbc-driver-postgresql
从 CRAN 安装 adbcpostgresql
install.packages("adbcpostgresql")
此外,该驱动程序可以通过驱动程序管理器从 C/C++、C#、GLib、Go、R、Ruby 和 Rust 使用。
用法¶
要连接到数据库,请在构建 AdbcDatabase 时提供“uri”参数。这应当是一个 连接 URI。
#include "arrow-adbc/adbc.h"
// Ignoring error handling
struct AdbcDatabase database;
AdbcDatabaseNew(&database, nullptr);
AdbcDatabaseSetOption(&database, "uri", "postgresql://:5433", nullptr);
AdbcDatabaseInit(&database, nullptr);
运行此程序时,必须确保 libadbc_driver_postgresql.so 位于你的 LD_LIBRARY_PATH 中,或与可执行文件位于同一目录中。这需要 CGO 并会加载 C++ ADBC postgresql 驱动程序。
import (
"context"
"github.com/apache/arrow-adbc/go/adbc"
"github.com/apache/arrow-adbc/go/adbc/drivermgr"
)
func main() {
var drv drivermgr.Driver
db, err := drv.NewDatabase(map[string]string{
"driver": "adbc_driver_postgresql",
adbc.OptionKeyURI: "postgresql://user:pass@localhost:5433/postgres",
})
if err != nil {
// handle error
}
defer db.Close()
cnxn, err := db.Open(context.Background())
if err != nil {
// handle error
}
defer cnxn.Close()
}
import adbc_driver_postgresql.dbapi
uri = "postgresql://user:pass@localhost:5433/postgres"
with adbc_driver_postgresql.dbapi.connect(uri) as conn:
pass
更多示例请参见 PostgreSQL 使用指南。
library(adbcdrivermanager)
# Use the driver manager to connect to a database
uri <- Sys.getenv("ADBC_POSTGRESQL_TEST_URI")
db <- adbc_database_init(adbcpostgresql::adbcpostgresql(), uri = uri)
con <- adbc_connection_init(db)
支持的功能¶
PostgreSQL 驱动程序支持 ADBC API 规范 1.0.0 中定义的功能。
COPY 查询执行¶
为了获得最佳性能,PostgreSQL 驱动程序使用 COPY 执行查询。然而,PostgreSQL 并非在所有查询中都支持此功能(例如 SHOW)。可以通过语句选项 adbc.postgresql.use_copy 来禁用此优化。有关示例,请参见 在不使用 COPY 的情况下执行语句。
批量摄取¶
支持批量导入。Arrow 类型到 PostgreSQL 类型的映射与下表相同。
分区结果集¶
不支持分区结果集。
事务¶
支持事务。
类型支持¶
PostgreSQL 允许在运行时定义新类型,因此驱动程序必须构建一个可用类型映射表。目前此操作在启动时执行一次。
根据类型以及是读取还是写入,目前的类型支持有限。
Arrow 类型 |
作为绑定参数 |
在批量导入中 [1] |
|---|---|---|
二进制型 (binary) |
BYTEA |
BYTEA |
bool |
BOOLEAN |
BOOLEAN |
date32 |
DATE |
DATE |
date64 |
❌ |
❌ |
字典型 (dictionary) |
(作为解包类型) |
(作为解包类型,仅用于 binary/string) |
duration |
INTERVAL |
INTERVAL |
float32 |
REAL |
REAL |
float64 |
DOUBLE PRECISION |
DOUBLE PRECISION |
int8 |
SMALLINT |
SMALLINT |
int16 |
SMALLINT |
SMALLINT |
int32 |
INTEGER |
INTEGER |
int64 |
BIGINT |
BIGINT |
large_binary |
❌ |
❌ |
large_string |
TEXT |
TEXT |
month_day_nano_interval |
INTERVAL |
INTERVAL |
string |
TEXT |
TEXT |
时间戳型 (timestamp) |
TIMESTAMP [3] |
TIMESTAMP/TIMESTAMP WITH TIMEZONE |
PostgreSQL 类型 |
在结果集中 |
|---|---|
ARRAY |
列表型 (list) |
BIGINT |
int64 |
BINARY |
二进制型 (binary) |
BOOLEAN |
bool |
CHAR |
utf8 |
DATE |
date32 |
DOUBLE PRECISION |
float64 |
INTEGER |
int32 |
INTERVAL |
month_day_nano_interval |
NUMERIC |
utf8 [2] |
REAL |
float32 |
SMALLINT |
int16 |
TEXT |
utf8 |
TIME |
time64 |
TIMESTAMP WITH TIME ZONE |
timestamp[unit, UTC] |
TIMESTAMP WITHOUT TIME ZONE |
timestamp[unit] |
VARCHAR |
utf8 |
未知类型¶
没有直接 Arrow 等效项的类型仍可由驱动程序返回。在这种情况下,Arrow 类型将是 binary,内容为 PostgreSQL 通信协议提供的原始字节。
对于支持 Opaque 标准扩展类型 的 Arrow 实现,扩展类型元数据也始终存在。这有助于区分驱动程序是故意返回 binary 列,还是将其作为回退处理返回。
警告
目前,驱动程序还会将名为 ADBC:postgresql:typname 的元数据键附加到未知列的模式字段中,但此方法已被弃用,建议转向使用 Opaque 类型,请勿依赖此键的持续存在。
软件版本¶
对于 Python wheel 包,内置的 PostgreSQL 客户端库版本为 16.9。对于 conda-forge 包,libpq 的版本与你 Conda 环境中的 libpq 版本一致。
PostgreSQL 驱动程序已在 PostgreSQL 11 至 16 版本上进行了测试。