ADBC é uma API independente de fornecedor para transferir dados Arrow entre uma aplicação e um banco de dados. O driver ADBC do chDB é distribuído pelo ADBC Driver Foundry e pode ser carregado por qualquer gerenciador de drivers ADBC.
Os resultados são transferidos como lotes de registros Arrow, sem conversão linha por linha. As aplicações podem usar o mesmo driver em Python ou em qualquer outra linguagem com um gerenciador de drivers ADBC.
Instalação
Instale o driver do ADBC Driver Foundry usando o dbc:
dbc install chdbO primeiro pacote dbc publicado para o chDB é a versão 26.7.0. Para verificar as versões disponíveis, execute:
dbc search -v chdbO driver instalado pode ser carregado pelo nome chdb por meio de um gerenciador de drivers ADBC.
Há suporte para Linux e macOS em x86-64 e arm64.
Conexão pelo Python
Instale o gerenciador de drivers ADBC do Python:
pip install adbc-driver-manager pyarrowEm seguida, carregue pelo nome o driver chDB instalado com dbc:
from adbc_driver_manager import dbapi
with dbapi.connect(
driver="chdb",
db_kwargs={"uri": "chdb://"},
autocommit=True,
) as conn:
with conn.cursor() as cur:
cur.execute("SELECT number FROM numbers(3)")
print(cur.fetch_arrow_table())uri |
Banco de dados |
|---|---|
chdb:// |
Em memória |
chdb:///absolute/path |
No disco, persistido no diretório especificado |
Ciclo de vida da conexão
O chDB executa um engine embutido em cada processo enquanto houver conexões abertas. Tenha estas regras em mente:
- Todas as conexões ADBC abertas simultaneamente em um processo devem apontar para o mesmo caminho de armazenamento.
- Há suporte para várias conexões nesse caminho, inclusive conexões usadas simultaneamente por diferentes threads. Para consultas concorrentes, dê a cada worker sua própria conexão, em vez de executar operações simultâneas em uma única conexão.
- Fechar a última conexão encerra o engine embutido. Uma conexão posterior pode iniciá-lo novamente, inclusive com um caminho de armazenamento diferente, mas desligamentos e inicializações repetidos consomem tempo e memória. Mantenha pelo menos uma conexão aberta para tarefas recorrentes.
- Apenas um processo do SO pode abrir determinado diretório em disco por vez. Dê a cada processo seu próprio diretório ou use um banco de dados em memória.
Como usar o ADBC com o pacote Python chDB
O pacote dbc instala um driver ADBC nativo independente. Ele é separado da biblioteca nativa carregada pelo pacote Python chdb.
Em um mesmo processo Python, não espere que uma conexão ADBC carregada por dbc e uma conexão chdb comum compartilhem tabelas em memória ou o estado do engine. Para um determinado caminho de banco de dados, use o driver ADBC ou a API Python chdb de cada vez; não mantenha ambos abertos no mesmo caminho em disco. Para mover dados entre as duas APIs, feche todas as conexões de um lado antes de abrir as do outro ou transfira os dados explicitamente por meio do Arrow ou de arquivos.
Funcionalidades implementadas
Not yet indica uma capacidade do driver ADBC que poderá ser adicionada futuramente. Not applicable indica um recurso que não é compatível com o modelo de execução atual do chDB ou do ClickHouse.
Banco de dados
| Função | Status | Observações |
|---|---|---|
AdbcDatabaseNew / Init / Release |
Compatível | |
AdbcDatabaseSetOption |
Compatível | Opções do engine uri, path e chdb.* |
Conexão
| Função | Status | Observações |
|---|---|---|
AdbcConnectionNew / Init / Release |
Compatível | |
AdbcConnectionGetInfo |
Compatível | |
AdbcConnectionGetObjects |
Compatível | Todas as profundidades |
AdbcConnectionGetTableSchema |
Compatível | |
AdbcConnectionGetTableTypes |
Compatível | |
AdbcConnectionGetOption |
Compatível | Inclui o db_schema atual |
AdbcConnectionSetOption |
Parcial | O autocommit deve permanecer habilitado; não é possível alterar db_schema |
AdbcConnectionCommit / Rollback |
Não aplicável | As instruções do ClickHouse usam autocommit; não há uma transação clássica para confirmar ou reverter |
AdbcConnectionGetStatistics |
Ainda não | As estatísticas da tabela não são expostas pelo driver |
AdbcConnectionReadPartition |
Não aplicável | O driver não produz partições de resultados distribuídos |
AdbcConnectionCancel |
Ainda não | O cancelamento de consultas do chDB ainda não é exposto pelo ADBC |
Instrução
| Função | Status | Observações |
|---|---|---|
AdbcStatementNew / Release |
Compatível | |
AdbcStatementSetSqlQuery |
Compatível | ClickHouse SQL |
AdbcStatementPrepare |
Compatível | |
AdbcStatementBind / BindStream |
Compatível | Parâmetros posicionais ? |
AdbcStatementGetParameterSchema |
Compatível | |
AdbcStatementExecuteQuery |
Compatível | Transmite lotes de registros Arrow |
AdbcStatementSetOption |
Compatível | Ingestão em massa; veja abaixo |
AdbcStatementExecuteSchema |
Ainda não | O schema de resultado fica disponível após a execução |
AdbcStatementExecutePartitions |
Não aplicável | Os resultados são retornados como um stream Arrow no processo |
AdbcStatementSetSubstraitPlan |
Não aplicável | O chDB aceita ClickHouse SQL, não planos Substrait |
AdbcStatementCancel |
Ainda não | O cancelamento de consultas do chDB ainda não está disponível por meio do ADBC |
A ingestão em massa é compatível com os modos create, append, create_append e replace, no banco de dados padrão ou em um banco de dados nomeado.
ClickHouse SQL e comportamento dos tipos
O chDB usa o ClickHouse SQL e seu sistema de tipos. A semântica a seguir do ClickHouse também se aplica quando o chDB é acessado por ADBC:
- As colunas não aceitam valores nulos, a menos que sejam declaradas como
Nullable(...). Um NULL tipado vinculado a uma coluna simplesStringé armazenado como uma string vazia, e não como NULL. - Use a delimitação de identificadores do ClickHouse; os exemplos usam backticks.
- Os bancos de dados do ClickHouse são mapeados para
db_schemano ADBC. Não há uma camada de catálogo acima deles, portanto, operações no escopo do catálogo não se aplicam. Decimalnão aceita escalas negativas, eDate32abrange o período de 1900-01-01 a 2299-12-31.- Um
DateTime64sem fuso horário é interpretado no fuso horário do engine. - A saída Arrow atual do ClickHouse não representa o tipo
Time; portanto, ele não pode ser lido por ADBC.
Alguns tipos Arrow preservam seus valores, mas são lidos como um tipo Arrow diferente:
| Tipo Arrow | Armazenado como | Lido como |
|---|---|---|
binary, large_binary, binary_view |
String |
string |
fixed_size_binary (ingestão em massa em uma nova tabela) |
FixedString(n) |
fixed_size_binary |
large_string, string_view |
String |
string |
float16 |
Float32 |
float |
time32 / time64 / timestamp |
DateTime64(n) |
timestamp |
Dados binários são armazenados como String e lidos como UTF-8. Portanto, payloads que não são UTF-8 válidos não são compatíveis com valores binary em operações de round-trip.
Exemplos
Ingestão em massa do Arrow
import pyarrow as pa
from adbc_driver_manager import dbapi
table = pa.table({"id": [1, 2, 3], "name": ["a", "b", "c"]})
with dbapi.connect(
driver="chdb",
db_kwargs={"uri": "chdb://"},
autocommit=True,
) as conn:
with conn.cursor() as cur:
cur.adbc_ingest("events", table, mode="create")
cur.execute("SELECT count() FROM events")
print(cur.fetchone())Parâmetros
from adbc_driver_manager import dbapi
with dbapi.connect(
driver="chdb",
db_kwargs={"uri": "chdb://"},
autocommit=True,
) as conn:
with conn.cursor() as cur:
cur.execute("SELECT number FROM numbers(10) WHERE number > ?", (7,))
print(cur.fetch_arrow_table())C
Após executar dbc install chdb, o gerenciador de drivers C pode localizar o driver pelo nome:
#include <arrow-adbc/adbc.h>
#include <arrow-adbc/adbc_driver_manager.h>
struct AdbcDatabase database = {0};
struct AdbcError error = {0};
AdbcDatabaseNew(&database, &error);
AdbcDatabaseSetOption(&database, "driver", "chdb", &error);
AdbcDatabaseSetOption(&database, "uri", "chdb://", &error);
AdbcDatabaseInit(&database, &error);Como o driver é verificado
As compilações de lançamento do chDB ADBC executam duas suítes externas para o driver nativo em Linux x86-64 e arm64 e macOS x86-64 e arm64:
- a suíte de conformidade do Apache Arrow ADBC, que verifica o contrato em C
- a suíte de validação ADBC Driver Foundry, que verifica o comportamento no nível de SQL, conversões de tipos de ida e volta, metadados e ingestão em massa
As tabelas de suporte nesta página são derivadas dessas execuções. As suítes estão no repositório chdb-core.