DuckDB简介
DuckDB是一款开源免费类似Sqlite的嵌入式数据库,支持直接使用内存或单个文件作为数据库。
DuckDB着重于数据处理和分析,是一个款OLAP(联机分析处理)类型的数据库,主要特点如下:
- 开源免费,MIT协议
- 功能完善,支持标准SQL、事务、二级索引等
- 高性能,低消耗(内存 / 文件占用小)
- 灵活的扩展机制,可以直接冲CSV / JSON / MySQL 等读取数据
- 支持Python / Java / Go / C / C++ / Nodejs / Rust 等主流编程语言,并提供命令行工具
DockDB安装
DockDB直接下载一个duckdb可执行文件,然后运行即可。
启动方式有两种
- 使用内存作为数据库,直接运行duckdb可执行文件即可
$ ./duckdb
v1.1.0 fa5c2fe15f
Enter ".help" for usage hints.
Connected to a transient in-memory database.
Use ".open FILENAME" to reopen on a persistent database.
D
最后显示的D是提示符,表示在DuckDB中,此时输入SQL,回车即可执行
- 使用文件作为数据库,文件不存在则自动创建
$ ./duckdb demo.db
v1.1.0 fa5c2fe15f
Enter ".help" for usage hints.
D
DuckDB命令行简单使用
不同与MySQL这种多数据库服务,duckdb 内存 / 某个文件就是一个单独的数据库,因此不支持
create database xxx;
这种操作,但是支持show databases;
启动DuckDB并新建数据
$ ./duckdb demo.db
v1.1.0 fa5c2fe15f
Enter ".help" for usage hints.
D
显示当前数据库
D show databases;
┌───────────────┐
│ database_name │
│ varchar │
├───────────────┤
│ demo │
└───────────────┘
D
创建表
经试验,不支持AUTO_INCREMENT 字段限制
D create table user (id int primary key,name varchar(50) not null, age int);
D
查看当前数据库所有表
D show tables;
┌─────────┐
│ name │
│ varchar │
├─────────┤
│ user │
└─────────┘
D
插入数据
D insert into user values(1,'Kevin',18);
D insert into user values(2,'Lily',19);
D
查询数据
D select * from user where id=1;
┌───────┬─────────┬───────┐
│ id │ name │ age │
│ int32 │ varchar │ int32 │
├───────┼─────────┼───────┤
│ 1 │ Kevin │ 18 │
└───────┴─────────┴───────┘
D
Python操作DuckDB
安装Python三方包duckdb
pip install duckdb
连接数据库(文件)
import duckdb
# 连接数据库,文件不存在则自动创建
con = duckdb.connect("demo.db")
执行sql,可以用con.sql('...')
或con.execute('...')
执行sql,两个方法几乎完全相同
不需要建立游标,不需要commit
执行后可以进行链式操作,如:
- con.sql('...').show(): 以表格方式显示(打印)结果
- con.sql('...').fetchone(): 获取一条结果,返回
tuple
类型 - con.sql('...').fetchall(): 获取所有结果,返回
List[tuple]
类型
创建表
import duckdb
con = duckdb.connect("demo.db")
con.sql('create table if not exists course (id int primary key,course_name varchar(50) not null); ')
con.sql('show tables').show()
运行后显示如下:
┌─────────┐
│ name │
│ varchar │
├─────────┤
│ course │
└─────────┘
插入及查询数据
import duckdb
con = duckdb.connect("demo.db")
con.execute("insert into course values(1, '中文');") # 不可重复执行
con.execute("insert into course values(2, '英语');") # 不可重复执行
r = con.sql("select * from course where course_name='中文';").fetchone()
print(r)
运行后显示如下:
(1, '中文')