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++
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.0/libduckdb-linux-amd64.zip
Descompacte:
unzip libduckdb-linux-amd64.zip -d libduckdb-linux-amd64
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
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);
}
Compile e rode:
g++ main.cpp libduckdb.so
LD_LIBRARY_PATH=. ./a.out
Provável saída:
1 | Marcos Oliveira
2 | Mark Raasveldt
3 | Hannes Muhleisen
Se quiser instalar no seu sistema e compilar com a flag -lduckdb
, rode os comandos abaixo:
.h
para include
:sudo mkdir -p /usr/local/include/duckdb
sudo cp duckdb.h /usr/local/include/duckdb/
lib
E atualizar o cache de bibliotecas compartilhadas do sistema.
sudo cp libduckdb.so /usr/local/lib/
sudo ldconfig
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
Se quiser criar .pc
para pkg-config
, expanda o procedimento abaixo:
/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
Salve com:
sudo mkdir -p /usr/local/lib/pkgconfig
sudo vim /usr/local/lib/pkgconfig/duckdb.pc
# cole o conteúdo acima
Atualize o cache:
export PKG_CONFIG_PATH=/usr/local/lib/pkgconfig:$PKG_CONFIG_PATH
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
Se também tiver problemas, verifique dependências faltando:
nm libduckdb_static.a | grep " U "
(
"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ê.
.hpp
: https://stackoverflow.com/questions/71782764/how-to-add-duckdb-library-in-c-program