DuckDB简介

DockDB官网

DuckDB简单使用及Python操作_数据库

DuckDB是一款开源免费类似Sqlite的嵌入式数据库,支持直接使用内存或单个文件作为数据库。
DuckDB着重于数据处理和分析,是一个款OLAP(联机分析处理)类型的数据库,主要特点如下:

  • 开源免费,MIT协议
  • 功能完善,支持标准SQL、事务、二级索引等
  • 高性能,低消耗(内存 / 文件占用小)
  • 灵活的扩展机制,可以直接冲CSV / JSON / MySQL 等读取数据
  • 支持Python / Java / Go / C / C++ / Nodejs / Rust 等主流编程语言,并提供命令行工具

DockDB安装

DockDB直接下载一个duckdb可执行文件,然后运行即可。

下载/安装链接

启动方式有两种

  1. 使用内存作为数据库,直接运行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,回车即可执行

  1. 使用文件作为数据库,文件不存在则自动创建
$ ./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, '中文')