DuckDB 学习

连接Minio

两种方式:使用secret或者set

CREATE SECRET minio (
TYPE S3,
KEY_ID ‘A6JLo3XVrlgpJ0kaIQbz’,
SECRET ‘zqDtE4qnwHZIhChSPA5GiXZDPVXSCo7ZVQFqd3xe’,
ENDPOINT ‘XXX.:9000’,
url_style ‘path’,
use_ssl ‘false’,
REGION ‘us-east-1’
);

select * from duckdb_secrets();

SET s3_url_style=‘path’;
SET s3_endpoint=‘XXXX:9000’;
SET s3_access_key_id=‘A6JLo3XVrlgpJ0kaIQbz’ ;
SET s3_secret_access_key=‘zqDtE4qnwHZIhChSPA5GiXZDPVXSCo7ZVQFqd3xe’;
SET s3_use_ssl=‘false’;

要特别注意URL_STYLE的设置还有USE_SSL。

Minio 读写

可以直接讲csv表(customer) 写入minio并分区。
COPY customer TO ‘s3://duckdb/customer’ (
FORMAT PARQUET,
PARTITION_BY (c_mktsegment)
);

重写需要加overwrite_or_ignore, 建议先根据业务逻辑控制是否要删除再重写。
–多次copy 測試

COPY customer TO ‘s3://duckdb/customer’ (
FORMAT PARQUET,
PARTITION_BY (c_mktsegment)
);
IO Error: Directory “s3://duckdb/customer” is not empty! Enable OVERWRITE option to overwrite files
COPY customer TO ‘s3://duckdb/customer’ (
FORMAT PARQUET,
overwrite_or_ignore true,
PARTITION_BY (c_mktsegment)
);

如果使用table 模式

CREATE TABLE cus AS SELECT * FROM read_parquet(‘s3://duckdb/customer.parquet’);
CREATE TABLE cus_s3 AS SELECT * FROM read_parquet(‘s3://duckdb/customer//.parquet’);

有新文件加入到minio的时候,duckdb不会自动刷新文件,新文件不会被访问
select count(*) from cus_s3 where c_mktsegment=‘AUTOMOBILE’;

– 不用table 会直接访问所有文件
select count() from read_parquet('s3://duckdb/customer//*.parquet’) where c_mktsegment=‘AUTOMOBILE’;

其它

DuckDB is column-based and ODBC is row-based, there can be some inefficiencies when using ODBC with DuckDB.

ODBC can be slower than other methods of connecting to a database, such as using a native driver, as it adds an extra layer of abstraction between the application and the database

如果是本地库,duckdb会写wal
root@xiehq-virtual-machine:~/duckdb/db-data# ps -ef|grep duckdb
root 5773 5528 2 02:45 pts/1 00:01:13 ./duckdb ./db-data/testdb
root 6084 6083 1 03:00 pts/0 00:00:33 minio server --console-address :9001 /root/duckdb/data

root@xiehq-virtual-machine:~/duckdb/db-data# ls -ltr
total 287304
-rw-r–r-- 1 root root 269496320 Jul 26 03:38 testdb
-rw-r–r-- 1 root root 24696179 Jul 26 03:38 testdb.wal

duckdb定位是分析型db,因此事务类sql支撑比较少。

<think>好的,我需要介绍如何在C++中使用DuckDB。首先,用户可能想知道DuckDB是什么,所以我要先简要说明它是一个嵌入式分析数据库管理系统,适用于OLAP场景。接着,需要指导用户如何开始使用,比如安装和配置步骤。可能用户不熟悉如何获取DuckDB的C++库,所以得说明下载或编译的方法。 然后,需要给出一个简单的代码示例,展示如何连接数据库、创建表、插入数据和查询数据。这里要注意代码的正确性,比如包含正确的头文件,链接库文件,以及使用正确的命名空间。同时,要确保代码中的SQL语句正确,比如使用占位符和参数绑定来防止SQL注入。 接下来,用户可能对事务管理和错误处理感兴趣,所以需要解释DuckDB的事务支持,比如自动提交和显式事务,以及如何捕获异常。这部分需要强调异常处理的重要性,避免程序崩溃。 此外,性能优化也是关键点。需要提到DuckDB的列式存储、向量化查询执行和并行处理能力,以及如何通过预编译语句和批量数据插入来提高效率。这些内容帮助用户充分利用DuckDB的优势。 最后,总结DuckDB在C++中的适用场景,比如数据分析、机器学习预处理等,并指出其轻量级和无需独立服务器的优点。确保整个回答结构清晰,步骤明确,覆盖用户可能遇到的主要问题,同时保持语言简洁易懂。</think>C++ 中使用 DuckDB 的逐步指南: DuckDB 是一款轻量级嵌入式分析数据库管理系统,专为 OLAP 场景设计。以下是在 C++ 项目中使用它的完整流程: 1. **环境准备** ```bash # 下载预编译库(Linux示例) wget https://github.com/duckdb/duckdb/releases/download/v1.0.0/duckdb_cli-linux-amd64.zip unzip duckdb_cli-linux-amd64.zip ``` 2. **基本使用示例** ```cpp #include "duckdb.hpp" using namespace duckdb; int main() { // 创建内存数据库 DuckDB db(nullptr); Connection con(db); // 创建表 con.Query("CREATE TABLE users(id INTEGER, name VARCHAR);"); // 插入数据(参数化查询) auto prep = con.Prepare("INSERT INTO users VALUES (?, ?)"); prep->Execute(1, "Alice"); prep->Execute(2, "Bob"); // 查询数据 auto result = con.Query("SELECT * FROM users"); result->Print(); return 0; } ``` 3. **核心功能说明** - **内存存储**:默认使用内存存储,适合快速分析 ```cpp DuckDB db(":memory:"); // 显式指定内存模式 ``` - **持久化存储** ```cpp DuckDB db("mydb.duckdb"); // 保存到文件 ``` 4. **高级特性** - **事务管理** ```cpp con.Query("BEGIN TRANSACTION"); try { con.Query("INSERT INTO users VALUES (3, 'Charlie')"); con.Query("COMMIT"); } catch (std::exception &e) { con.Query("ROLLBACK"); } ``` - **批量数据插入** ```cpp Appender appender(con, "users"); appender.BeginRow(); appender.Append<int32_t>(3); appender.Append<std::string>("Charlie"); appender.EndRow(); appender.Close(); ``` 5. **性能优化技巧** - 启用并行处理 ```cpp con.Query("PRAGMA threads=4"); ``` - 使用列式存储 ```cpp con.Query("CREATE TABLE sensor_data AS SELECT * FROM 'samples.csv'"); ``` **应用场景建议**: - 数据分析中间结果缓存 - 机器学习特征预处理 - 实时日志分析 - 嵌入式设备数据分析 **注意事项**: 1. 编译时需链接 `libduckdb.a` 2. 使用参数化查询防止 SQL 注入 3. 定期调用 `Checkpoint()` 保持数据持久化 4. 建议使用最新稳定版(当前 v1.0.0) 完整文档参考:https://duckdb.org/docs/api/cpp
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

weixin_40455124

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值