Sử dụng Cơ Sở Dữ Liệu DuckDB và Thao Tác với Python

Mô tả về DuckDB

DuckDB là một cơ sở dữ liệu nhúng mã nguồn mở miễn phí tương tự như SQLite, hỗ trợ lưu trữ trực tiếp trong bộ nhớ hoặc một tệp duy nhất. Cơ sở dữ liệu này tập trung vào xử lý và phân tích dữ liệu, thuộc loại OLAP (Online Analytical Processing). Các đặc điểm chính của DuckDB bao gồm:

  • Miễn phí và mã nguồn mở theo giấy phép MIT
  • Chức năng đầy đủ, hỗ trợ SQL chuẩn, giao dịch, chỉ mục phụ cấp v.v.
  • Hiệu suất cao, tiêu thụ tài nguyên thấp (tiết kiệm bộ nhớ và không gian đĩa)
  • Cơ chế mở rộng linh hoạt, có thể đọc dữ liệu từ các định dạng như CSV, JSON, MySQL, v.v.
  • Có thể tích hợp với nhiều ngôn ngữ lập trình phổ biến như Python, Java, Go, C, C++, Node.js, Rust và cung cấp công cụ dòng lệnh

Cài đặt DuckDB

Để sử dụng DuckDB, bạn chỉ cần tải xuống tệp thực thi và chạy nó.

Liên kết tải xuống/cài đặt

Có hai cách để khởi động DuckDB:

  1. Sử dụng bộ nhớ làm cơ sở dữ liệu, chỉ cần chạy tệp thực thi DuckDB:
$ ./duckdb 
v1.1.0 fa5c2fe15f
Nhập ".help" để biết các gợi ý sử dụng.
Đã kết nối với cơ sở dữ liệu tạm thời trong bộ nhớ.
Sử dụng ".open FILENAME" để mở lại trên cơ sở dữ liệu cố định.
D 

Ký hiệu "D" ở cuối cùng là dấu nhắc lệnh, cho thấy bạn đang ở trong DuckDB, khi đó bạn có thể nhập câu lệnh SQL và nhấn Enter để thực thi.

  1. Sử dụng một tệp làm cơ sở dữ liệu, nếu tệp không tồn tại thì sẽ được tạo mới:
$ ./duckdb demo.db
v1.1.0 fa5c2fe15f
Nhập ".help" để biết các gợi ý sử dụng.
D 

Thao tác Dòng Lệnh Cơ Bản với DuckDB

Khác với MySQL - một dịch vụ đa cơ sở dữ liệu, DuckDB với bộ nhớ hoặc một tệp cụ thể chính là một cơ sở dữ liệu độc lập, do đó không hỗ trợ lệnh create database xxx;, nhưng hỗ trợ show databases;

Khởi động DuckDB và tạo dữ liệu mới

$ ./duckdb demo.db    
v1.1.0 fa5c2fe15f
Nhập ".help" để biết các gợi ý sử dụng.
D 

Hiển thị cơ sở dữ liệu hiện tại

D show databases;
┌───────────────┐
│ database_name │
│    varchar    │
├───────────────┤
│ demo          │
└───────────────┘
D 

Tạo bảng

Sau khi thử nghiệm, DuckDB không hỗ trợ trường AUTO_INCREMENT

D create table nguoi_dung (ma_nguoi_dung int primary key,ten varchar(50) not null, tuoi int);
D 

Liệt kê tất cả các bảng trong cơ sở dữ liệu hiện tại

D show tables;
┌─────────┐
│  name   │
│ varchar │
├─────────┤
│ nguoi_dung    │
└─────────┘
D 

Chèn dữ liệu

D insert into nguoi_dung values(1,'Kevin',18);
D insert into nguoi_dung values(2,'Lily',19);
D 

Truy vấn dữ liệu

D select * from nguoi_dung where ma_nguoi_dung=1;
┌───────┬─────────┬───────┐
│  ma_nguoi_dung   │  ten   │  tuoi  │
│ int32 │ varchar │ int32 │
├───────┼─────────┼───────┤
│     1 │ Kevin   │    18 │
└───────┴─────────┴───────┘
D 

Thao Tác với DuckDB Sử Dụng Python

Cài đặt gói Python duckdb

pip install duckdb

Kết nối cơ sở dữ liệu (tệp)

import duckdb

# Kết nối đến cơ sở dữ liệu, tạo mới nếu chưa tồn tại
ket_noi = duckdb.connect("demo.db")

Thực thi câu lệnh SQL, có thể sử dụng ket_noi.sql('...') hoặc ket_noi.execute('...'), hai phương pháp gần như giống hệt nhau

Không cần thiết lập con trỏ, không cần commit

Sau khi thực thi, có thể thực hiện các thao tác chuỗi như:

  • ket_noi.sql('...').show(): hiển thị (in ra) kết quả dưới dạng bảng
  • ket_noi.sql('...').fetchone(): lấy một kết quả, trả về kiểu tuple
  • ket_noi.sql('...').fetchall(): lấy tất cả các kết quả, trả về kiểu List[tuple]

Tạo bảng

import duckdb

ket_noi = duckdb.connect("demo.db")
ket_noi.sql('create table if not exists khoa_hoc (ma_khoa_hoc int primary key,ten_khoa_hoc varchar(50) not null); ')
ket_noi.sql('show tables').show()

Kết quả sau khi chạy:

┌─────────┐
│  name   │
│ varchar │
├─────────┤
│ khoa_hoc  │
└─────────┘

Chèn và Truy Vấn Dữ Liệu

import duckdb

ket_noi = duckdb.connect("demo.db")

ket_noi.execute("insert into khoa_hoc values(1, 'Tiếng Việt');")  # Không nên thực thi lặp lại
ket_noi.execute("insert into khoa_hoc values(2, 'Tiếng Anh');")  # Không nên thực thi lặp lại

kq = ket_noi.sql("select * from khoa_hoc where ten_khoa_hoc='Tiếng Việt';").fetchone()
print(kq)


Kết quả sau khi chạy:

(1, 'Tiếng Việt')

Thẻ: duckdb python sql olap Database

Đăng vào ngày 27 tháng 5 lúc 19:16