DEV Community

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

Posted on

2

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.0/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)