Como Conectar ao DuckDB com C++

🚀 Um banco de dados veloz e futurista para seus projetos.


Como Conectar ao DuckDB com C++


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

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

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/
  • 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

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:

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

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ê.



duckdb cpp sql


Compartilhe


Nosso canal no Youtube

Inscreva-se


Marcos Oliveira

Marcos Oliveira

Desenvolvedor de software
https://github.com/terroo


Crie Aplicativos Gráficos para Linux e Windows com C++

Aprenda C++ Moderno e crie Games, Programas CLI, GUI e TUI de forma fácil.

Saiba Mais

Receba as novidades no seu e-mail!

Após cadastro e confirmação do e-mail, enviaremos semanalmente resumos e também sempre que houver novidades por aqui para que você mantenha-se atualizado!