DEV Community

Cover image for Como Conectar ao DuckDB com C++
Marcos Oliveira
Marcos Oliveira

Posted on • Edited on

Como Conectar ao DuckDB com C++

Um banco de dados veloz e futurista para seus projetos.


Nós já fizemos um artigo inicial sobre DuckDB que explica conceitos iniciais, instalação e primeiros passos. Para mais informações acesse o link:

Nesse artigo veremos como conectar ao DuckDB usando a API com C++


01. Fazer download da lib e criar um código básico

A API do DuckDB para C++ ainda não está estável, na própria página da API há esse aviso:


DuckDB's C++ API is internal. It is not guaranteed to be stable and can change without notice. If you would like to build an application on DuckDB, we recommend using the C API.


Por isso eles recomendam que você use a API do C que funciona perfeitamente. Para isso basta acessa a página: https://duckdb.org/docs/installation/ e escolher os dados conforme seu sistema. No meu caso, escolhi:

Depois é só clicar no .zip que será displonibilizado e fazer o download, ou fazer download com wget:

wget -q https://github.com/duckdb/duckdb/releases/download/v1.3.1/libduckdb-linux-amd64.zip 
Enter fullscreen mode Exit fullscreen mode

Descompacte:

unzip libduckdb-linux-amd64.zip -d libduckdb-linux-amd64 
Enter fullscreen mode Exit fullscreen mode

Crie um banco de dados e uma tabela, exemplo: duckdb terminalroot.db

CREATE TABLE terminalroot (id INTEGER, name STRING); INSERT INTO terminalroot VALUES(1, 'Marcos Oliveira'); INSERT INTO terminalroot VALUES(2, 'Mark Raasveldt'); INSERT INTO terminalroot VALUES(3, 'Hannes Muhleisen'); SELECT * FROM terminalroot; .exit 
Enter fullscreen mode Exit fullscreen mode

Entre no diretório que você descompactou e crie um código básico: cd libduckdb-linux-amd64/ && vim main.cpp

#include "duckdb.h" #include <iostream>  int main(){ duckdb_database db; duckdb_connection con; duckdb_result result; if(duckdb_open("terminalroot.db", &db) == DuckDBError){ std::cerr << "Erro ao abrir o banco\n"; return 1; } if(duckdb_connect(db, &con) == DuckDBError){ std::cerr << "Erro ao conectar ao banco\n"; return 1; } if(duckdb_query(con, "SELECT * FROM terminalroot;", &result) == DuckDBError){ std::cerr << "Erro ao executar SELECT\n"; duckdb_disconnect(&con); duckdb_close(&db); return 1; } for(idx_t row = 0; row <= result.deprecated_column_count; row++){ int id = duckdb_value_int32(&result, 0, row); const char* name = duckdb_value_varchar(&result, 1, row); std::cout << id << " | " << name << '\n'; duckdb_free((void*)name); // libera memória do varchar } duckdb_destroy_result(&result); duckdb_disconnect(&con); duckdb_close(&db); } 
Enter fullscreen mode Exit fullscreen mode

Compile e rode:

g++ main.cpp libduckdb.so LD_LIBRARY_PATH=. ./a.out 
Enter fullscreen mode Exit fullscreen mode

Provável saída:

1 | Marcos Oliveira 2 | Mark Raasveldt 3 | Hannes Muhleisen 
Enter fullscreen mode Exit fullscreen mode

Instalar no sistema

Se quiser instalar no seu sistema e compilar com a flag -lduckdb, rode os comandos abaixo:

  • 01. Mover .h para include:
sudo mkdir -p /usr/local/include/duckdb sudo cp duckdb.h /usr/local/include/duckdb/ 
Enter fullscreen mode Exit fullscreen mode
  • 02. Mover a biblioteca dinâmica para lib > E atualizar o cache de bibliotecas compartilhadas do sistema.
sudo cp libduckdb.so /usr/local/lib/ sudo ldconfig 
Enter fullscreen mode Exit fullscreen mode

Após isso, basta testar com a flag e nem precisa estar na pasta com os arquivos baixados e nem usar a variável de ambiente LD_LIBRARY_PATH:

Mas precisa do terminalroot.db, se você pôr o caminho absoluto, ex.: "/home/$USER/.db/terminalroot.db" seu binário rodará independente do lugar onde você estiver no sistema!

g++ main.cpp -lduckdb ./a.out 
Enter fullscreen mode Exit fullscreen mode

Se quiser criar .pc para pkg-config, expanda o procedimento abaixo:

Crie o arquivo /usr/local/lib/pkgconfig/duckdb.pc com este conteúdo:

prefix=/usr/local exec_prefix=${prefix} libdir=${exec_prefix}/lib includedir=${prefix}/include Name: DuckDB Description: DuckDB embedded database Version: 1.2.1 Libs: -L${libdir} -lduckdb Cflags: -I${includedir}/duckdb 
Enter fullscreen mode Exit fullscreen mode

Salve com:

sudo mkdir -p /usr/local/lib/pkgconfig sudo vim /usr/local/lib/pkgconfig/duckdb.pc # cole o conteúdo acima 
Enter fullscreen mode Exit fullscreen mode

Atualize o cache:

export PKG_CONFIG_PATH=/usr/local/lib/pkgconfig:$PKG_CONFIG_PATH 
Enter fullscreen mode Exit fullscreen mode

Eu tentei a biblioteca estática libduckdb_static.a, mas tive problemas, mas se você preferir, tente:

g++ main.cpp libduckdb_static.a -I. -ldl -pthread -lm -lz -static-libstdc++ -static-libgcc 
Enter fullscreen mode Exit fullscreen mode

Se também tiver problemas, verifique dependências faltando:

nm libduckdb_static.a | grep " U " 
Enter fullscreen mode Exit fullscreen mode

("U" = undefined symbol)

Ou use ldd ./a.out para ver se ainda tem lib dinâmica pendurada.

No meu caso nenhuma dessa etapas funcionaram, mas veja se também de aplica a você.


Links úteis

Top comments (0)