DEV Community

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

Posted on • Edited 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.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

A developer toolkit for building lightning-fast dashboards into SaaS apps

A developer toolkit for building lightning-fast dashboards into SaaS apps

Embed in minutes, load in milliseconds, extend infinitely. Import any chart, connect to any database, embed anywhere. Scale elegantly, monitor effortlessly, CI/CD & version control.

Get early access

Top comments (0)

Sonar image

Explore the coding personalities of leading LLMs

Sonar’s new report on leading LLMs explores the critical tradeoffs between performance and security. Explore the distinct coding personalities of models like OpenAI’s GPT-4o and Claude Sonnet 4 to determine the best AI strategy for your team.

Read now

AWS Industries LIVE!

AWS Industries LIVE! features AWS Partners discussing various topics related to their industry, their solutions, and how they can help customers.

Tune in to the full event

DEV is partnering to bring live events to the community. Join us or dismiss this billboard if you're not interested. ❤️