精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

我們一起聊聊 DuckDB 是什么及適用場景

數據庫 其他數據庫
官方文檔就是一個寶庫,有著非常豐富的說明及示例,網址為:https://duckdb.org/docs/index。要想深入理解及掌握 DuckDB,需要多讀讀官方文檔。

DuckDB 是一款集輕量級、高性能于一體的嵌入式分析型數據庫,以其卓越的數據查詢和分析能力在數據庫領域嶄露頭角。這款基于C++ 編寫的數據庫,以其先進的設計理念和高效的存儲引擎,為大規模數據處理提供了強有力的支持。

DuckDB 采用了獨特的列式存儲方式,相較于傳統的行式存儲,這種存儲方式能更加高效地讀取和分析數據。通過將相同列的數據集中存儲在連續的物理位置,列式存儲顯著提升了數據的訪問速度。此外,DuckDB 還利用壓縮算法進一步減少了存儲空間需求,降低了 I/O 開銷,讓數據處理變得更加輕松高效。

在查詢優化和執行方面,DuckDB 同樣表現出色。它支持標準的 SQL 查詢語言,允許用戶通過簡潔明了的 SQL 語句實現復雜的數據查詢和分析任務。其優化的執行引擎充分利用內存優勢,提供高并發和低延遲的查詢體驗。同時,DuckDB 還內置了多種查詢優化技術,通過智能地選擇查詢路徑和減少數據掃描量,進一步提高查詢效率。

作為一款嵌入式數據庫,DuckDB 還具備良好的集成性。它提供了豐富的 API 接口,使開發者能夠輕松地將 DuckDB 嵌入到各種應用程序中,實現無縫的數據管理和查詢功能。這種高度的靈活性使得 DuckDB 成為各類應用系統中的理想選擇。

DuckDB 的適用場景

1.實時分析

在追求速度和響應能力的實時分析領域,DuckDB 以其高性能和低延遲的特性成為不可或缺的工具。無論是監控系統、實時報表還是預警系統,DuckDB 都能快速響應大量的數據查詢請求,提供準確而及時的分析結果。這使得企業能夠實時掌握業務動態,做出快速而明智的決策。

此外,DuckDB 的內存優化特性進一步提升了實時分析的效率。通過將盡可能多的數據加載到內存中,DuckDB 能夠顯著減少磁盤 I/O 操作,從而加快查詢速度。這種優勢在處理大規模數據集時尤為明顯,讓實時分析變得更加輕松高效。

2.數據倉庫

DuckDB 同樣適用于構建和管理數據倉庫系統。作為輕量級的數據倉庫解決方案,它能夠輕松應對數據整合、清洗和轉換等復雜任務。通過 ETL 過程,DuckDB 能夠將來自不同數據源的數據整合到一起,形成統一的數據視圖。然后,用戶可以利用其強大的查詢和分析能力,深入挖掘數據的價值,發現潛在的商業機會。

相較于傳統的大型關系型數據庫,DuckDB 在數據倉庫場景中具有更低的部署和維護成本。其輕量級特性使得數據倉庫的構建和管理變得更加簡單高效,無需投入大量的人力和物力資源。同時,DuckDB 的高性能和可擴展性也能夠滿足大型數據倉庫的需求,確保數據的快速處理和查詢。

3.嵌入式應用

DuckDB 的嵌入式特性使其成為嵌入式應用的理想選擇。無論是物聯網設備還是移動應用程序,都可以通過集成 DuckDB 實現本地數據分析能力。這意味著設備或應用程序可以直接在本地處理和分析數據,無需依賴遠程服務器或云端資源。

在物聯網設備中,DuckDB 可以幫助實現實時的數據采集和分析,提升設備的智能化水平。在移動應用程序中,它可以用于存儲和分析用戶數據,提供個性化的服務和推薦,提升用戶體驗。

4.大數據預處理

大數據預處理是數據挖掘和機器學習流程中不可或缺的一環。在這一環節中,DuckDB 同樣可以發揮重要作用。它能夠高效地對數據進行清洗、轉換和聚合等操作,為后續的機器學習或數據挖掘任務提供高質量的輸入數據。

DuckDB 支持各種復雜的 SQL 查詢和聚合操作,使得預處理工作變得更加簡單高效。用戶可以通過編寫SQL語句來定義數據轉換規則和處理邏輯,然后讓 DuckDB 自動完成這些任務。這大大減輕了數據科學家的工作負擔,讓他們能夠更專注于數據分析和模型構建等核心任務。

接下來我們就理論聯系實際地使用一下 DuckDB,看看它有什么驚艷的地方。

安裝及簡單使用

# MacOS 安裝
$ brew install duckdb


# Python 安裝
pip install duckdb


# NodeJS 安裝
npm install duckdb


# 或者從源碼安裝,愿意折騰的同學可以自行去安裝

安裝完成后,怎么使用呢?可以打開命令行直接輸入 "duckdb" 即可進入其命令行界面:

(venv311) ?  mypostgres git:(dev) duckdb
v1.0.0 1f98600c2c
Enter ".help" for usage hints.
Connected to a transient in-memory database.
Use ".open FILENAME" to reopen on a persistent database.


-- 查看版本號
D SELECT version();
┌───────────┐
│ version() │
│  varchar  │
├───────────┤
│ v1.0.0    │
└───────────┘


-- 下面的是官方的 Live Demo 中的一個示例,從 S3 存儲上面下載了一個數據文件,并導入到 DuckDB 中
D INSTALL httpfs;
100% ▕████████████████████████████████████████████████████████████▏ 
D CREATE TABLE train_services AS FROM 's3://duckdb-blobs/train_services.parquet';
100% ▕████████████████████████████████████████████████████████████▏ 
D show tables;
┌────────────────┐
│      name      │
│    varchar     │
├────────────────┤
│ train_services │
└────────────────┘
-- 或者執行 .tables 也可以查看有哪些表
D .tables
train_services

如何查看表結構呢?

D DESCRIBE train_services;
+----------------+-------------+------+-----+---------+-------+
|  column_name   | column_type | null | key | default | extra |
+----------------+-------------+------+-----+---------+-------+
| service_id     | BIGINT      | YES  |     |         |       |
| date           | DATE        | YES  |     |         |       |
| type           | VARCHAR     | YES  |     |         |       |
| train_number   | BIGINT      | YES  |     |         |       |
| station_code   | VARCHAR     | YES  |     |         |       |
| station_name   | VARCHAR     | YES  |     |         |       |
| departure_time | TIMESTAMP   | YES  |     |         |       |
| arrival_time   | TIMESTAMP   | YES  |     |         |       |
+----------------+-------------+------+-----+---------+-------+
changes: 380959   total_changes: 380959

查詢 train_services 表的前 10 條數據:

D SELECT * from train_services LIMIT 10;
┌────────────┬────────────┬───────────┬──────────────┬──────────────┬──────────────────────┬─────────────────────┬─────────────────────┐
│ service_id │    date    │   type    │ train_number │ station_code │     station_name     │   departure_time    │    arrival_time     │
│   int64    │    date    │  varchar  │    int64     │   varchar    │       varchar        │      timestamp      │      timestamp      │
├────────────┼────────────┼───────────┼──────────────┼──────────────┼──────────────────────┼─────────────────────┼─────────────────────┤
│   11196117 │ 2023-05-15 │ Intercity │         1410 │ RTD          │ Rotterdam Centraal   │ 2023-05-15 00:00:00 │                     │
│   11196117 │ 2023-05-15 │ Intercity │         1410 │ DT           │ Delft                │ 2023-05-15 00:13:00 │ 2023-05-15 00:13:00 │
│   11196117 │ 2023-05-15 │ Intercity │         1410 │ GV           │ Den Haag HS          │ 2023-05-15 00:29:00 │ 2023-05-15 00:21:00 │
│   11196117 │ 2023-05-15 │ Intercity │         1410 │ LEDN         │ Leiden Centraal      │ 2023-05-15 00:45:00 │ 2023-05-15 00:44:00 │
│   11196117 │ 2023-05-15 │ Intercity │         1410 │ SHL          │ Schiphol Airport     │ 2023-05-15 01:03:00 │ 2023-05-15 01:01:00 │
│   11196117 │ 2023-05-15 │ Intercity │         1410 │ ASD          │ Amsterdam Centraal   │ 2023-05-15 01:19:00 │ 2023-05-15 01:17:00 │
│   11196117 │ 2023-05-15 │ Intercity │         1410 │ UT           │ Utrecht Centraal     │                     │ 2023-05-15 01:48:00 │
│   11196118 │ 2023-05-15 │ Nightjet  │          420 │ NURNB        │ Nürnberg Hbf         │ 2023-05-15 00:01:00 │                     │
│   11196118 │ 2023-05-15 │ Nightjet  │          420 │ FFS          │ Frankfurt (Main) Süd │ 2023-05-15 01:47:00 │ 2023-05-15 01:45:00 │
│   11196118 │ 2023-05-15 │ Nightjet  │          420 │ FFFM         │ Frankfurt (M) Hbf    │                     │                     │
├────────────┴────────────┴───────────┴──────────────┴──────────────┴──────────────────────┴─────────────────────┴─────────────────────┤
│ 10 rows                                                                                                                    8 columns │
└──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘

還可以設置輸出樣式,默認是 duckbox 樣式:

D .help mode
.mode MODE ?TABLE?       Set output mode
   MODE is one of:
     ascii     Columns/rows delimited by 0x1F and 0x1E
     box       Tables using unicode box-drawing characters
     csv       Comma-separated values
     column    Output in columns.  (See .width)
     duckbox   Tables with extensive features
     html      HTML <table> code
     insert    SQL insert statements for TABLE
     json      Results in a JSON array
     jsonlines Results in a NDJSON
     latex     LaTeX tabular environment code
     line      One value per line
     list      Values delimited by "|"
     markdown  Markdown table format
     quote     Escape answers as for SQL
     table     ASCII-art table
     tabs      Tab-separated values
     tcl       TCL list elements
     trash     No output


D .mode table


D SELECT * from train_services LIMIT 10;
+------------+------------+-----------+--------------+--------------+----------------------+---------------------+---------------------+
| service_id |    date    |   type    | train_number | station_code |     station_name     |   departure_time    |    arrival_time     |
+------------+------------+-----------+--------------+--------------+----------------------+---------------------+---------------------+
| 11196117   | 2023-05-15 | Intercity | 1410         | RTD          | Rotterdam Centraal   | 2023-05-15 00:00:00 |                     |
| 11196117   | 2023-05-15 | Intercity | 1410         | DT           | Delft                | 2023-05-15 00:13:00 | 2023-05-15 00:13:00 |
| 11196117   | 2023-05-15 | Intercity | 1410         | GV           | Den Haag HS          | 2023-05-15 00:29:00 | 2023-05-15 00:21:00 |
| 11196117   | 2023-05-15 | Intercity | 1410         | LEDN         | Leiden Centraal      | 2023-05-15 00:45:00 | 2023-05-15 00:44:00 |
| 11196117   | 2023-05-15 | Intercity | 1410         | SHL          | Schiphol Airport     | 2023-05-15 01:03:00 | 2023-05-15 01:01:00 |
| 11196117   | 2023-05-15 | Intercity | 1410         | ASD          | Amsterdam Centraal   | 2023-05-15 01:19:00 | 2023-05-15 01:17:00 |
| 11196117   | 2023-05-15 | Intercity | 1410         | UT           | Utrecht Centraal     |                     | 2023-05-15 01:48:00 |
| 11196118   | 2023-05-15 | Nightjet  | 420          | NURNB        | Nürnberg Hbf         | 2023-05-15 00:01:00 |                     |
| 11196118   | 2023-05-15 | Nightjet  | 420          | FFS          | Frankfurt (Main) Süd | 2023-05-15 01:47:00 | 2023-05-15 01:45:00 |
| 11196118   | 2023-05-15 | Nightjet  | 420          | FFFM         | Frankfurt (M) Hbf    |                     |                     |
+------------+------------+-----------+--------------+--------------+----------------------+---------------------+---------------------+

還可以獲取命令的幫助,進入 DuckDB 后,輸入 `.help` 即可查看幫助手信息:

D .help
.bail on|off             Stop after hitting an error.  Default OFF
.binary on|off           Turn binary output on or off.  Default OFF
.cd DIRECTORY            Change the working directory to DIRECTORY
.changes on|off          Show number of rows changed by SQL
.check GLOB              Fail if output since .testcase does not match
.columns                 Column-wise rendering of query results
.constant ?COLOR?        Sets the syntax highlighting color used for constant values
.constantcode ?CODE?     Sets the syntax highlighting terminal code used for constant values
......
.sha3sum ...             Compute a SHA3 hash of database content
.shell CMD ARGS...       Run CMD ARGS... in a system shell
.show                    Show the current values for various settings
.system CMD ARGS...      Run CMD ARGS... in a system shell
.tables ?TABLE?          List names of tables matching LIKE pattern TABLE
.testcase NAME           Begin redirecting output to 'testcase-out.txt'
.timer on|off            Turn SQL timer on or off
.width NUM1 NUM2 ...     Set minimum column widths for columnar output

導出CSV文件

可以輕松地把數據導出到 CSV 文件:

D COPY train_services TO 'output.csv' (HEADER, DELIMITER ',');


-- 查看文件前 10 行內容
D .shell head /tmp/output.csv
service_id,date,type,train_number,station_code,station_name,departure_time,arrival_time
11196117,2023-05-15,Intercity,1410,RTD,Rotterdam Centraal,2023-05-15 00:00:00,
11196117,2023-05-15,Intercity,1410,DT,Delft,2023-05-15 00:13:00,2023-05-15 00:13:00
11196117,2023-05-15,Intercity,1410,GV,Den Haag HS,2023-05-15 00:29:00,2023-05-15 00:21:00
11196117,2023-05-15,Intercity,1410,LEDN,Leiden Centraal,2023-05-15 00:45:00,2023-05-15 00:44:00
11196117,2023-05-15,Intercity,1410,SHL,Schiphol Airport,2023-05-15 01:03:00,2023-05-15 01:01:00
11196117,2023-05-15,Intercity,1410,ASD,Amsterdam Centraal,2023-05-15 01:19:00,2023-05-15 01:17:00
11196117,2023-05-15,Intercity,1410,UT,Utrecht Centraal,,2023-05-15 01:48:00
11196118,2023-05-15,Nightjet,420,NURNB,Nürnberg Hbf,2023-05-15 00:01:00,
11196118,2023-05-15,Nightjet,420,FFS,Frankfurt (Main) Süd,2023-05-15 01:47:00,2023-05-15 01:45:00

查詢的數據也可以導出到 CSV 文件:

COPY (SELECT * FROM tbl) TO 'output.csv' (HEADER, DELIMITER ',');

導入CSV文件

導入 CSV 文件有多種方式:

-- 通過 read_csv() 函數直接讀取 CSV 文件
D SELECT * FROM read_csv("/tmp/output.csv");
┌────────────┬────────────┬──────────────────────┬──────────────┬──────────────┬───────────────────────────┬─────────────────────┬─────────────────────┐
│ service_id │    date    │         type         │ train_number │ station_code │       station_name        │   departure_time    │    arrival_time     │
│   int64    │    date    │       varchar        │    int64     │   varchar    │          varchar          │      timestamp      │      timestamp      │
├────────────┼────────────┼──────────────────────┼──────────────┼──────────────┼───────────────────────────┼─────────────────────┼─────────────────────┤
│   11196117 │ 2023-05-15 │ Intercity            │         1410 │ RTD          │ Rotterdam Centraal        │ 2023-05-15 00:00:00 │                     │
│   11196117 │ 2023-05-15 │ Intercity            │         1410 │ DT           │ Delft                     │ 2023-05-15 00:13:00 │ 2023-05-15 00:13:00 │
│   11196117 │ 2023-05-15 │ Intercity            │         1410 │ GV           │ Den Haag HS               │ 2023-05-15 00:29:00 │ 2023-05-15 00:21:00 │
│   11196117 │ 2023-05-15 │ Intercity            │         1410 │ LEDN         │ Leiden Centraal           │ 2023-05-15 00:45:00 │ 2023-05-15 00:44:00 │
│   11196117 │ 2023-05-15 │ Intercity            │         1410 │ SHL          │ Schiphol Airport          │ 2023-05-15 01:03:00 │ 2023-05-15 01:01:00 │
......
......
│   11239115 │ 2023-05-21 │ Stoptrein            │        20397 │ RHEINE       │ Rheine                    │ 2023-05-21 11:03:00 │                     │
│   11239115 │ 2023-05-21 │ Stoptrein            │        20397 │ BH           │ Bad Bentheim              │ 2023-05-21 11:16:00 │ 2023-05-21 11:14:00 │
│   11239115 │ 2023-05-21 │ Stoptrein            │        20397 │ HGL          │ Hengelo                   │                     │ 2023-05-21 11:32:00 │
├────────────┴────────────┴──────────────────────┴──────────────┴──────────────┴───────────────────────────┴─────────────────────┴─────────────────────┤
│ 380959 rows (40 shown)                                                                                                                     8 columns │
└──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘


-- 也可以不顯式使用 read_csv() 函數
D SELECT * FROM "/tmp/output.csv";
┌────────────┬────────────┬──────────────────────┬──────────────┬──────────────┬───────────────────────────┬─────────────────────┬─────────────────────┐
│ service_id │    date    │         type         │ train_number │ station_code │       station_name        │   departure_time    │    arrival_time     │
│   int64    │    date    │       varchar        │    int64     │   varchar    │          varchar          │      timestamp      │      timestamp      │
├────────────┼────────────┼──────────────────────┼──────────────┼──────────────┼───────────────────────────┼─────────────────────┼─────────────────────┤
│   11196117 │ 2023-05-15 │ Intercity            │         1410 │ RTD          │ Rotterdam Centraal        │ 2023-05-15 00:00:00 │                     │
│   11196117 │ 2023-05-15 │ Intercity            │         1410 │ DT           │ Delft                     │ 2023-05-15 00:13:00 │ 2023-05-15 00:13:00 │
......
......
│   11239115 │ 2023-05-21 │ Stoptrein            │        20397 │ HGL          │ Hengelo                   │                     │ 2023-05-21 11:32:00 │
├────────────┴────────────┴──────────────────────┴──────────────┴──────────────┴───────────────────────────┴─────────────────────┴─────────────────────┤
│ 380959 rows (40 shown)                                                                                                                     8 columns │
└──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘

     

 關于數據導入可以參閱官方文檔:https://duckdb.org/docs/data/overview。DuckDB 支持非常多的數據庫格式,為我們快速做數據分析提供各種便捷功能。

連接或創建數據庫

前面的操作都是在內存中進行的,也就意味著當我們退出當前的 DuckDB 會話時,數據也會隨之釋放。DuckDB 也支持持久模式運行,這樣數據可以存放在硬盤上面。我們可以看下 DuckDB 程序的命令行幫助:

?  knowledge git:(liucc) ? duckdb --help
Usage: duckdb [OPTIONS] FILENAME [SQL]
FILENAME is the name of an DuckDB database. A new database is created
if the file does not previously exist.
OPTIONS include:
   -append              append the database to the end of the file
   -ascii               set output mode to 'ascii'
   -bail                stop after hitting an error
   -batch               force batch I/O
   -box                 set output mode to 'box'
   -column              set output mode to 'column'
   -cmd COMMAND         run "COMMAND" before reading stdin
   -c COMMAND           run "COMMAND" and exit
   -csv                 set output mode to 'csv'
   -echo                print commands before execution
   -init FILENAME       read/process named file
   -[no]header          turn headers on or off
   -help                show this message
   -html                set output mode to HTML
   -interactive         force interactive I/O
   -json                set output mode to 'json'
   -line                set output mode to 'line'
   -list                set output mode to 'list'
   -markdown            set output mode to 'markdown'
   -newline SEP         set output row separator. Default: '\n'
   -nofollow            refuse to open symbolic links to database files
   -no-stdin            exit after processing options instead of reading stdin
   -nullvalue TEXT      set text string for NULL values. Default ''
   -quote               set output mode to 'quote'
   -readonly            open the database read-only
   -s COMMAND           run "COMMAND" and exit
   -separator SEP       set output column separator. Default: '|'
   -stats               print memory stats before each finalize
   -table               set output mode to 'table'
   -unredacted          allow printing unredacted secrets
   -unsigned            allow loading of unsigned extensions
   -version             show DuckDB version

通過命令行的幫助信息可以知道,我們可以在 duckdb 程序后面提供一個 FILENAME,這個 FILENAME 就是一個數據庫,如果存在就打開(連接)該庫,如果該庫不存在則創建。

接下來我們演示一下,首先我們準備一些測試數據:

$ wget -c -O ~/Downloads/services-2023-10.csv.gz https://opendata.rijdendetreinen.nl/public/services/services-2023-10.csv.gz

下載完成數據之后,我們通過 DuckDB 創建一個空的庫,然后導入該示例數據。如下:

$ duckdb railway.db

[!tip]

該文件可以為任意擴展名,但 .db 或 .duckdb 是兩種常見選擇,有時也會使用 .ddb。

進入數據庫后,我們導入前面已下載的壓縮數據:

D CREATE TABLE services AS FROM '~/Downloads/services-2023.csv.gz';
100% ▕████████████████████████████████████████████████████████████▏ 


-- 查看一下有哪些表
D .tables
services


-- 查看一下當前的庫是什么,以下三種方式都可以
D .data
railway: railway.db
D .database
railway: railway.db
D .databases
railway: railway.db

上面都發生了什么?我們簡單解釋一下:

我們無需顯式定義我們的 services 表的結構,也不需要使用 COPY  FROM 語句。DuckDB 會自動檢測到 'services-2023.csv.gz' 是一個 gzip 壓縮的 CSV 文件,因此它調用 read_csv() 函數,解壓文件并根據其內容使用 CSV 嗅探器推斷其數據結構。

查詢利用了 DuckDB 的 FROM-first 語法,允許用戶省略 SELECT * 子句。因此,SQL 語句 FROM 'services-2023.csv.gz'; 是 SELECT * FROM 'services-2023.csv.gz'; 的簡寫。

D FROM services LIMIT 10;
┌────────────────┬──────────────┬──────────────┬─────────────────┬───┬────────────────────┬──────────────────────┬─────────────────────┬──────────────────────┬──────────────────────┐
│ Service:RDT-ID │ Service:Date │ Service:Type │ Service:Company │ … │ Stop:Arrival delay │ Stop:Arrival cance…  │ Stop:Departure time │ Stop:Departure delay │ Stop:Departure can…  │
│     int64      │     date     │   varchar    │     varchar     │   │       int64        │       boolean        │      timestamp      │        int64         │       boolean        │
├────────────────┼──────────────┼──────────────┼─────────────────┼───┼────────────────────┼──────────────────────┼─────────────────────┼──────────────────────┼──────────────────────┤
│       10367702 │ 2023-01-01   │ Intercity    │ NS              │ … │                    │                      │ 2023-01-01 01:00:00 │                    1 │ false                │
│       10367702 │ 2023-01-01   │ Intercity    │ NS              │ … │                  0 │ false                │ 2023-01-01 01:13:00 │                    0 │ false                │
│       10367702 │ 2023-01-01   │ Intercity    │ NS              │ … │                  0 │ false                │ 2023-01-01 01:22:00 │                    0 │ false                │
│       10367702 │ 2023-01-01   │ Intercity    │ NS              │ … │                  0 │ false                │ 2023-01-01 01:40:00 │                    0 │ false                │
│       10367702 │ 2023-01-01   │ Intercity    │ NS              │ … │                  0 │ false                │ 2023-01-01 02:03:00 │                    0 │ false                │
│       10367702 │ 2023-01-01   │ Intercity    │ NS              │ … │                  2 │ false                │ 2023-01-01 02:12:00 │                    2 │ false                │
│       10367702 │ 2023-01-01   │ Intercity    │ NS              │ … │                  1 │ false                │ 2023-01-01 02:19:00 │                    3 │ false                │
│       10367702 │ 2023-01-01   │ Intercity    │ NS              │ … │                  3 │ false                │ 2023-01-01 02:30:00 │                    3 │ false                │
│       10367702 │ 2023-01-01   │ Intercity    │ NS              │ … │                  2 │ false                │                     │                      │                      │
│       10367703 │ 2023-01-01   │ Nightjet     │ NS Int          │ … │                    │                      │ 2023-01-01 01:01:00 │                    0 │ false                │
├────────────────┴──────────────┴──────────────┴─────────────────┴───┴────────────────────┴──────────────────────┴─────────────────────┴──────────────────────┴──────────────────────┤
│ 10 rows                                                                                                                                                       17 columns (9 shown) │
└────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘
  • 查詢創建一個名為 services 的表,并使用 CSV 讀取器的結果寫入該表。使用 `CREATE TABLE ...AS` 語句。

我們看看 services 表里面有多少行數據:

D SELECT count(*) AS count_services FROM services;
┌────────────────┐
│ count_services │
│     int64      │
├────────────────┤
│       21239393 │
└────────────────┘


D SELECT format('{:,}', count(*)) AS count_services FROM services;
┌────────────────┐
│ count_services │
│    varchar     │
├────────────────┤
│ 21,239,393     │
└────────────────┘

我們現在看下 railway.db 目前占用了多少硬盤空間:

?  softwares ll -h railway.db 
-rw-r--r--  1 liuchuan  staff   394M Jun 17 14:40 railway.db

其他數據庫集成

然 DuckDB 有 ETL 功能,那么它就可以與多個數據庫引擎進行交互。接下來我們看下 DuckDB 與其他數據庫引擎的集成。

1.與 MySQL 集成

要直接在 MySQL 數據庫上運行查詢,需要 mysql 擴展。可以使用 INSTALL SQL 命令安裝擴展。只需要運行一次即可:

D INSTALL mysql;
100% ▕████████████████████████████████████████████████████████████

要想使用 mysql 擴展,需要使用 LOAD SQL 命令:

D LOAD mysql;

mysql 擴展加載完成后,我們可以使用 ATTACH SQL 命令來映射到一個 MySQL 實例上面。語法如下:

ATTACH 'host=localhost user=root port=0 database=mysqlscanner' AS mysql_db (TYPE mysql_scanner, READ_ONLY);
USE mysql_db;

ATTACH 使用的字符串是 PostgreSQL 風格的連接字符串(不是 MySQL 連接字符串!)。這是一個以 {key}={value} 格式提供的連接參數列表。以下是有效參數列表。任何未提供的選項都會被其默認值所取代。

圖片圖片

接下來是一個實際的例子,讓我們連接到本地的一個 MySQL 數據庫:

D ATTACH 'host=localhost user=root password=123456 port=3306 database=world' AS mysql_world_db (TYPE mysql_scanner, READ_ONLY);


-- 接下來就像是使用 MySQL 那樣來使用數據庫了
D use mysql_world_db;
D show tables;
┌─────────────────┐
│      name       │
│     varchar     │
├─────────────────┤
│ city            │
│ country         │
│ countrylanguage │
└─────────────────┘


-- 查詢一下 country 表里面的數據
D SELECT Code, Name, Region FROM country WHERE Code LIKE 'C%%';
┌─────────┬───────────────────────────────────────┬───────────────────────────┐
│  Code   │                 Name                  │          Region           │
│ varchar │                varchar                │          varchar          │
├─────────┼───────────────────────────────────────┼───────────────────────────┤
│ CAF     │ Central African Republic              │ Central Africa            │
│ CAN     │ Canada                                │ North America             │
│ CCK     │ Cocos (Keeling) Islands               │ Australia and New Zealand │
│ CHE     │ Switzerland                           │ Western Europe            │
│ CHL     │ Chile                                 │ South America             │
│ CHN     │ China                                 │ Eastern Asia              │
│ CIV     │ C?te d’Ivoire                         │ Western Africa            │
│ CMR     │ Cameroon                              │ Central Africa            │
│ COD     │ Congo, The Democratic Republic of the │ Central Africa            │
│ COG     │ Congo                                 │ Central Africa            │
│ COK     │ Cook Islands                          │ Polynesia                 │
│ COL     │ Colombia                              │ South America             │
│ COM     │ Comoros                               │ Eastern Africa            │
│ CPV     │ Cape Verde                            │ Western Africa            │
│ CRI     │ Costa Rica                            │ Central America           │
│ CUB     │ Cuba                                  │ Caribbean                 │
│ CXR     │ Christmas Island                      │ Australia and New Zealand │
│ CYM     │ Cayman Islands                        │ Caribbean                 │
│ CYP     │ Cyprus                                │ Middle East               │
│ CZE     │ Czech Republic                        │ Eastern Europe            │
├─────────┴───────────────────────────────────────┴───────────────────────────┤
│ 20 rows                                                           3 columns │
└─────────────────────────────────────────────────────────────────────────────┘

由于我們連接時指定了 READ_ONLY 選項,那么我們是以只讀模式連接過來的,無法進行增刪改的操作。如下:

-- 創建一張表
D CREATE TABLE tbl (id INTEGER, name VARCHAR);
Invalid Input Error: Cannot execute statement of type "CREATE" on database "mysql_world_db" which is attached in read-only mode!


-- 刪除一條數據
D DELETE FROM country WHERE Code = 'USA';
Invalid Input Error: Cannot execute statement of type "DELETE" on database "mysql_world_db" which is attached in read-only mode!

[!tip]

以讀寫模式連接數據庫:只需設置 (TYPE MYSQL) 即可,去掉 READ_ONLY。

關于與 MySQL 集成相關的更詳細信息,還請參閱官方文檔:https://duckdb.org/docs/extensions/mysql.html#supported-operations。

2.與 PostgreSQL 集成

與集成 MySQL 一樣,需要先安裝擴展,然后加載。

D INSTALL postgres;
100% ▕████████████████████████████████████████████████████████████


D LOAD postgres;

安裝 postgres 擴展后,可以使用 postgres_scan 函數從 PostgreSQL 查詢表:

-- scan the table "mytable" from the schema "public" in the database "mydb"
SELECT * FROM postgres_scan('host=localhost port=5432 dbname=mydb', 'public', 'mytable');

“postgres_scan” 函數的第一個參數是 [PostgreSQL 連接字符串](https://www.postgresql.org/docs/current/libpq-connect.html#LIBPQ-CONNSTRING),

這是以 “{key}={value}” 格式提供的連接參數列表。下面是詳細的參數列表。

圖片圖片

接下來我們連接到本地的一個 PostgreSQL 數據庫上面進行一個查詢:

D SELECT * FROM postgres_scan('host=localhost port=5432 user=forum password=forum dbname=forumdb', 'forum', 'categories');
┌───────┬───────────────────────┬──────────────────────────────────┐
│  pk   │         title         │           description            │
│ int32 │        varchar        │             varchar              │
├───────┼───────────────────────┼──────────────────────────────────┤
│     3 │ Programming Languages │ All about programming languages  │
│     5 │ Software engineering  │ Software engineering discussions │
│     1 │ Database Discussions  │ Database discussions             │
│     2 │ Unix/Linux discussion │ Unix and Linux discussions       │
│     4 │ A.I                   │ Machine Learning discussions     │
└───────┴───────────────────────┴──────────────────────────────────┘

或者,可以使用 ATTACH 命令連接整個數據庫。這允許我們像查詢常規數據庫一樣查詢存儲在 PostgreSQL 數據庫中的所有表。語法如下:

-- Attach the Postgres database using the given connection string
ATTACH 'host=localhost port=5432 dbname=mydb' AS test (TYPE postgres);
-- The table "tbl_name" can now be queried as if it is a regular table
SELECT * FROM test.tbl_name;
-- Switch the active database to "test"
USE test;


-- List all tables in the file
SHOW TABLES;

一個實際的例子:

D ATTACH 'host=localhost port=5432 user=forum password=forum dbname=forumdb' AS pg_forum_db (TYPE postgres);
D use pg_forum_db;


-- 查詢數據
D SELECT * from forum.categories;
┌───────┬───────────────────────┬──────────────────────────────────┐
│  pk   │         title         │           description            │
│ int32 │        varchar        │             varchar              │
├───────┼───────────────────────┼──────────────────────────────────┤
│     3 │ Programming Languages │ All about programming languages  │
│     5 │ Software engineering  │ Software engineering discussions │
│     1 │ Database Discussions  │ Database discussions             │
│     2 │ Unix/Linux discussion │ Unix and Linux discussions       │
│     4 │ A.I                   │ Machine Learning discussions     │
└───────┴───────────────────────┴──────────────────────────────────┘

由于我們在映射數據庫時并沒有使用 READ_ONLY 選項,因此可以對 pg_forum_db 進行讀寫操作。如下:

D CREATE TABLE forum.demo (id INTEGER, name VARCHAR);
D DESCRIBE forum.demo;
┌─────────────┬─────────────┬─────────┬─────────┬─────────┬─────────┐
│ column_name │ column_type │  null   │   key   │ default │  extra  │
│   varchar   │   varchar   │ varchar │ varchar │ varchar │ varchar │
├─────────────┼─────────────┼─────────┼─────────┼─────────┼─────────┤
│ id          │ INTEGER     │ YES     │         │         │         │
│ name        │ VARCHAR     │ YES     │         │         │         │
└─────────────┴─────────────┴─────────┴─────────┴─────────┴─────────┘


-- 插入一條數據
D INSERT INTO forum.demo VALUES (42, 'DuckDB');


-- 查看該數據
D FROM forum.demo;
┌───────┬─────────┐
│  id   │  name   │
│ int32 │ varchar │
├───────┼─────────┤
│    42 │ DuckDB  │
└───────┴─────────┘


-- 修改該數據
D UPDATE forum.demo set id=9 WHERE name='DuckDB';
D FROM forum.demo;
┌───────┬─────────┐
│  id   │  name   │
│ int32 │ varchar │
├───────┼─────────┤
│     9 │ DuckDB  │
└───────┴─────────┘


-- 刪除該數據
D DELETE FROM forum.demo WHERE id=9;
D FROM forum.demo;
┌───────┬─────────┐
│  id   │  name   │
│ int32 │ varchar │
├───────┴─────────┤
│     0 rows      │
└─────────────────┘


-- 刪除該表
D DROP TABLE forum.demo;
D DESCRIBE forum.demo;
Catalog Error: Table with name demo does not exist!
Did you mean "mysql_world_db.mysql.db"?

可以檢查下我們目前都連接了哪些數據庫:

D show databases;
┌────────────────┐
│ database_name  │
│    varchar     │
├────────────────┤
│ mysql_world_db │
│ pg_forum_db    │
│ railway        │
└────────────────┘


D .databases
railway: railway.db
mysql_world_db: host=localhost user=root password=123456 port=3306 database=world
pg_forumd_db: host=localhost port=5432 user=forum password=forum dbname=forumdb

關于與 PostgreSQL 集成更詳細的信息可以參閱官方文檔:https://duckdb.org/docs/extensions/postgres.html。

DuckDB 還能與 SQLite 進行集成,這里就不再演示了,可以參閱官方文檔:https://duckdb.org/docs/guides/database_integration/sqlite。

擴展支持

一個產品強或系統不強,關鍵還是要看下擴展多不多。正所謂:“功能不夠,擴展來湊”。我們看下缺省狀態下 DuckDB 支持的擴展:

不同的 DuckDB 客戶端都附帶了一組不同的擴展。我們在下表中進行一個比對:

圖片圖片

關于官方提供的擴展,可以參閱官方文檔:https://duckdb.org/docs/extensions/official_extensions。

可以查看當前 DuckDB 已安裝的擴展:

D .mode line
D SELECT * FROM duckdb_extensions();
   extension_name = arrow
           loaded = false
        installed = false
     install_path = 
      description = A zero-copy data integration between Apache Arrow and DuckDB
          aliases = []
extension_version = 
     install_mode = 
   installed_from = 


   extension_name = autocomplete
           loaded = true
        installed = true
     install_path = (BUILT-IN)
      description = Adds support for autocomplete in the shell
          aliases = []
extension_version = 
     install_mode = STATICALLY_LINKED
   installed_from = 


......
......


   extension_name = vss
           loaded = false
        installed = false
     install_path = 
      description = Adds indexing support to accelerate Vector Similarity Search
          aliases = []
extension_version = 
     install_mode = 
   installed_from =

客戶端API

DuckDB 還支持豐富的客戶端 API,允許我們通過程序來使用 DuckDB。接下來我們以 Golang 為例進行一個演示。代碼如下:

package main


import (
  "database/sql"
  "errors"
  "fmt"
  "log"


  _ "github.com/marcboeker/go-duckdb"
)


func main() {
  db, err := sql.Open("duckdb", "")
  if err != nil {
    log.Fatal(err)
  }
  defer db.Close()


  _, err = db.Exec(`CREATE TABLE people (id INTEGER, name VARCHAR)`)
  if err != nil {
    log.Fatal(err)
  }
  _, err = db.Exec(`INSERT INTO people VALUES (42, 'John')`)
  if err != nil {
    log.Fatal(err)
  }


  var (
    id   int
    name string
  )
  row := db.QueryRow(`SELECT id, name FROM people`)
  err = row.Scan(&id, &name)
  if errors.Is(err, sql.ErrNoRows) {
    log.Println("no rows")
  } else if err != nil {
    log.Fatal(err)
  }


  fmt.Printf("id: %d, name: %s\n", id, name)
}

接下來我們進行編譯:

$ mkdir myduck
$ mv main.go myduck/
$ go mod init
$ go mod tidy
go: finding module for package github.com/marcboeker/go-duckdb
go: downloading github.com/marcboeker/go-duckdb v1.7.0
go: found github.com/marcboeker/go-duckdb in github.com/marcboeker/go-duckdb v1.7.0
go: downloading github.com/apache/arrow/go/v14 v14.0.2
go: downloading github.com/google/uuid v1.3.1
go: downloading golang.org/x/tools v0.14.0
go: downloading github.com/google/flatbuffers v23.5.26+incompatible
go: downloading github.com/klauspost/compress v1.16.7
go: downloading github.com/zeebo/xxh3 v1.0.2
go: downloading github.com/pierrec/lz4/v4 v4.1.18
go: downloading golang.org/x/mod v0.13.0
go: downloading github.com/klauspost/cpuid/v2 v2.2.5
go: downloading golang.org/x/exp v0.0.0-20231006140011-7918f672742d
go: downloading gonum.org/v1/gonum v0.12.0
go: downloading github.com/zeebo/assert v1.3.0


$ go build main.go 
$ ll -h
total 81496
-rw-r--r--  1 liuchuan  staff   678B Jun 17 16:53 go.mod
-rw-r--r--  1 liuchuan  staff   3.8K Jun 17 16:53 go.sum
-rwxr-xr-x  1 liuchuan  staff    40M Jun 17 16:54 main   # 編譯出來的文件還是挺大的
-rw-r--r--  1 liuchuan  staff   678B Jun 17 16:52 main.go

我們運行一下代碼:

$ ./main 
id: 42, name: John

關于更詳細的客戶端 API 信息,可以參閱官方文檔:https://duckdb.org/docs/api/overview。

總結

另外,官方文檔就是一個寶庫,有著非常豐富的說明及示例,網址為:https://duckdb.org/docs/index。要想深入理解及掌握 DuckDB,需要多讀讀官方文檔。

綜上所述,DuckDB 作為一款集輕量級、高性能于一體的嵌入式分析型數據庫,在實時分析、數據倉庫、嵌入式應用和大數據預處理等領域都展現出了其獨特的優勢。其內存優化特性、低延遲性能和靈活的集成方式使得它成為各類應用系統中的理想選擇。隨著數據分析和處理需求的不斷增長,相信 DuckDB 將在未來繼續發揮重要作用,為各行各業提供更高效、更可靠的數據支持。

如有相關問題,請在文章后面給小編留言,小編安排作者第一時間和您聯系,為您答疑解惑。

責任編輯:武曉燕 來源: 新鈦云服
相關推薦

2023-03-29 08:26:06

2022-02-23 08:41:58

NATIPv4IPv6

2022-08-01 07:57:03

數組操作內存

2023-06-30 08:18:51

敏捷開發模式

2023-08-10 08:28:46

網絡編程通信

2023-08-04 08:20:56

DockerfileDocker工具

2022-05-24 08:21:16

數據安全API

2023-09-10 21:42:31

2024-02-20 21:34:16

循環GolangGo

2021-08-27 07:06:10

IOJava抽象

2024-09-27 09:56:43

2022-05-26 00:19:29

通信信息5G

2024-07-26 09:47:28

2022-10-08 00:00:05

SQL機制結構

2022-09-22 08:06:29

計算機平板微信

2024-11-28 09:57:50

C#事件發布器

2021-08-12 07:49:24

mysql

2023-07-24 09:41:08

自動駕駛技術交通

2023-03-26 23:47:32

Go內存模型

2023-07-27 07:46:51

SAFe團隊測試
點贊
收藏

51CTO技術棧公眾號

亚洲女同一区二区| 久久精品女人| 亚洲成人av片| 国产主播在线看| 成年人在线观看视频| 久草热8精品视频在线观看| 色综合视频一区中文字幕| 玖玖爱在线观看| 在线观看亚洲精品福利片| 亚洲午夜激情网站| 日韩和欧美的一区二区| 午夜精品久久久久久久96蜜桃| 亚洲经典在线| www.亚洲一区| free性中国hd国语露脸| 日韩久久99| 欧美日韩国产综合新一区| 中文字幕久久综合| 日韩在线免费看| 国产又黄又大久久| 国产成人涩涩涩视频在线观看| 久久久久亚洲AV成人| 久9久9色综合| 欧美草草影院在线视频| 久热精品在线播放| 亚洲一级少妇| 亚洲国产一区二区三区| 亚洲砖区区免费| 可以免费看污视频的网站在线| 懂色av一区二区夜夜嗨| 国产精品入口免费视| 日产精品久久久久| 国产精品久久| 久久亚洲精品成人| 精品一区二区三孕妇视频| 日韩一级电影| 亚洲成人激情在线观看| 欧美污在线观看| 欧美美女被草| 欧洲国内综合视频| 亚洲中文字幕无码不卡电影| 三级网站视频在在线播放| 国产精品久久久久久户外露出 | 影音先锋亚洲视频| 欧洲免费在线视频| 97国产一区二区| 粉嫩av免费一区二区三区| 99在线观看精品视频| 久久成人精品无人区| 国产精品日韩欧美| 在线观看中文字幕2021| 奇米精品一区二区三区在线观看一 | 国产精品不卡| 视频直播国产精品| 日韩av片在线免费观看| 欧美色女视频| 原创国产精品91| 波多野在线播放| 精品在线99| 亚洲视频在线免费观看| 精品无码国产污污污免费网站| 免费国产自久久久久三四区久久| 亚洲美女视频网| 久久丫精品国产亚洲av不卡| 日韩欧美中文字幕电影| 亚洲午夜久久久久久久| 欧美老女人性生活视频| 日韩久久精品网| 久久久国产精品x99av| 无码黑人精品一区二区| 欧美日韩专区| 欧美亚洲国产精品| 亚洲无码精品一区二区三区| 日本不卡一区二区三区高清视频| 国产精品一区二区3区| 97在线视频人妻无码| 国产精品亚洲а∨天堂免在线| 成人h视频在线观看| 天堂在线观看视频| 国产婷婷色一区二区三区四区| 亚洲成人午夜在线| 污污片在线免费视频| 午夜伦理一区二区| 黄色成人免费看| 国产在线不卡一区二区三区| 精品成人免费观看| 国产精品无码久久久久久| 久久国产电影| 欧美精品电影免费在线观看| 免费的毛片视频| 精品一区二区影视| 国内一区在线| av网页在线| 亚洲丶国产丶欧美一区二区三区| 337p粉嫩大胆噜噜噜鲁| 中文成人在线| 欧美一区二区免费视频| 国产精品无码网站| 99久久久久久中文字幕一区| 午夜精品一区二区三区在线播放| 成人黄色免费网| 粉嫩av一区二区三区在线播放| 久久精品丝袜高跟鞋| 老司机午夜在线视频| 精品国产乱码久久久久酒店| 欧美第一页浮力影院| 精品欧美午夜寂寞影院| 少妇高潮 亚洲精品| 日韩字幕在线观看| 久久99久久99| 久久精品二区| av网站免费在线观看| 一本在线高清不卡dvd| 国产成人精品一区二区三区在线观看| 免费av一区二区三区四区| 欧美成人激情视频| 中文天堂在线视频| 91亚洲精品久久久蜜桃网站 | 香蕉久久一区二区不卡无毒影院| 污视频网站观看| 日韩欧美黄色| 国自产精品手机在线观看视频| 一级黄色片视频| 久久九九99视频| 国产一区二区三区小说| 四虎国产精品免费久久| 国产亚洲人成网站在线观看| 天海翼一区二区| 国产成人免费高清| 中文字幕在线亚洲三区| 日本欧美一区| 亚洲男人第一网站| 国产女同在线观看| 高清在线成人网| 91麻豆天美传媒在线| 国产精成人品2018| 国产一区二区三区丝袜| 国产区一区二区三| 99久久精品费精品国产一区二区| 伊人久久在线观看| 精品中文字幕一区二区三区| 色噜噜国产精品视频一区二区| 999视频在线| 久久这里只有精品视频网| 久色视频在线播放| 欧美男男freegayvideosroom| 欧美激情xxxxx| 亚洲精品久久久久久无码色欲四季 | 91九色精品视频| 91电影在线播放| 欧美伊人精品成人久久综合97 | 可以免费在线看黄的网站| 中文字幕乱码一区二区三区| 欧美videossex| 欧美成人高清电影在线| 欧美日韩激情在线观看| 国产精品18久久久| 国产爆乳无码一区二区麻豆| 丁香综合av| 久久久女女女女999久久| 天堂中文字幕av| 欧美午夜片欧美片在线观看| 欧美丰满少妇人妻精品| 羞羞答答国产精品www一本| 欧美亚洲国产免费| 国产精成人品2018| 久久亚洲国产精品成人av秋霞| 国产超碰人人模人人爽人人添| 一区二区三区毛片| v天堂中文在线| 久久精品一区二区国产| 五月天亚洲综合小说网| 99er精品视频| 久久久久中文字幕| 极品白浆推特女神在线观看 | 97在线国产视频| 久久久久观看| 国产精品99蜜臀久久不卡二区| 在线免费av电影| 精品日本一线二线三线不卡| 日本天堂网在线| 国产精品久久影院| 不卡的一区二区| 午夜一区二区三区不卡视频| 日韩在线导航| 成人av激情人伦小说| 国产成人精品久久亚洲高清不卡| 午夜免费视频在线国产| 精品国产网站在线观看| 亚洲大尺度在线观看| 亚洲人成人一区二区在线观看 | 最近中文字幕av| 亚洲欧美电影院| 久久99精品久久久久久三级| 国产小视频你懂的| 青青草精品视频| 欧美日韩午夜爽爽| 免费av一区二区三区四区| 91精品视频在线免费观看| 精精国产xxxx视频在线野外| 丝袜亚洲欧美日韩综合| 好吊色一区二区三区| 欧美日韩中文另类| 国产精品第9页| 亚洲丝袜自拍清纯另类| 国产亚洲无码精品| 国产精品一区专区| 精品久久久久久中文字幕2017| 欧美日韩国产综合网| 色婷婷精品国产一区二区三区| 日本免费一区二区视频| 国产精品大陆在线观看| 午夜成年人在线免费视频| 国产一区二区三区免费视频| 精品人妻伦一二三区久久| 在线一区二区观看| 国产真实乱人偷精品视频| 中文字幕中文字幕中文字幕亚洲无线| 久久精品综合视频| 成人性生交大片免费看视频在线| 第四色婷婷基地| 久久欧美肥婆一二区| 欧洲精品一区二区三区久久| 亚洲综合色站| 亚洲精品在线免费| 亚洲国产合集| 狠狠综合久久av| 一区二区三区亚洲变态调教大结局| 国产精品普通话| 日日夜夜天天综合| 777午夜精品福利在线观看| 免费在线国产视频| 欧美成人精品一区二区| 欧美18一19xxx性| 色黄久久久久久| 91在线看片| 伊人伊成久久人综合网站| 日本韩国精品一区二区| 日韩av在线网页| 天堂中文网在线| 亚洲韩国欧洲国产日产av| 亚洲产国偷v产偷v自拍涩爱| 欧美一级欧美三级在线观看| 99在线小视频| 日韩丝袜美女视频| av一区二区三| 国色天香久久精品国产一区| 午夜精品福利在线观看| 黄页网站在线观看免费| 欧美激情一区二区三区成人| 日本资源在线| 久久久久久久成人| 电影在线观看一区| 777777777亚洲妇女| 波多视频一区| 国产精品日本精品| 亚洲日本中文| 成人性色av| 欧美美女黄色| 日本精品一区二区三区高清 久久| 蜜桃一区二区| 亚洲一区免费看| 91精品国产麻豆国产在线观看| 400部精品国偷自产在线观看| 亚洲激情中文| 人人妻人人做人人爽| 欧美一级视频| 伊人国产在线视频| 国产盗摄女厕一区二区三区| 天天躁日日躁狠狠躁av麻豆男男| 91丨九色丨蝌蚪丨老版| av电影网站在线观看| 中文字幕日本不卡| 欧美日韩人妻精品一区二区三区 | 免费又黄又爽又色的视频| 亚洲高清免费视频| 国产精品免费精品一区| 欧美三级电影在线看| 精品人妻少妇AV无码专区| 亚洲精品国精品久久99热 | 国产在线看片免费视频在线观看| 日韩在线观看免费| 七七久久电影网| 清纯唯美亚洲激情| 亚洲三级在线| 国产精品免费视频一区二区 | 亚洲大尺度美女在线| 欧美偷拍视频| 久久香蕉国产线看观看av| 乱人伦视频在线| 国产日韩精品视频| 国产精品99久久免费观看| 日韩国产欧美一区| 韩日成人av| 校园春色 亚洲色图| 国产不卡视频在线播放| 欧美18—19性高清hd4k| 亚洲精品高清视频在线观看| 波多野结衣一二区| 欧美电影免费观看完整版| 国产午夜视频在线观看| 久操成人在线视频| 欧美日韩视频免费观看| av资源一区二区| av亚洲在线观看| 国产二区视频在线| 麻豆久久久久久久| 日本黄色特级片| 一区二区三区四区蜜桃| 中文字幕人妻互换av久久| 欧美精品一区二区在线观看| 麻豆网站在线观看| 日本精品中文字幕| 久久香蕉网站| 亚洲五码在线观看视频| 男女视频一区二区| 人妻少妇一区二区| 亚洲一区二区高清| 国产精品久久久久久久成人午夜| 精品呦交小u女在线| 黄色影院在线看| 91久久在线视频| 成人午夜国产| 男人亚洲天堂网| 99免费精品视频| 五月婷婷一区二区| 91精品国产福利在线观看| 成年人视频免费在线观看| 欧美在线激情网| 农村少妇一区二区三区四区五区| 特色特色大片在线| 久久97超碰国产精品超碰| 精品无人区无码乱码毛片国产 | 日韩中文字幕网| 影音成人av| 精品奇米国产一区二区三区| 中文视频在线观看| 亚洲国产高清在线| 三级网站在线播放 | 撸视在线观看免费视频| 97国产在线视频| 国产图片一区| 成人午夜精品久久久久久久蜜臀| 懂色av噜噜一区二区三区av| 欧美精品一区二区蜜桃| 欧美一级爆毛片| 免费看电影在线| 粉嫩av免费一区二区三区| 国产一区激情| 日本五十肥熟交尾| 性感美女极品91精品| 亚洲欧洲国产综合| 日本精品一区二区三区在线播放视频| 亚洲综合小说图片| www.日日操| 国产精品久久免费看| 国产一区二区三区成人| 久久夜色精品国产| 欧美专区视频| 美女扒开大腿让男人桶| 成人av在线资源网| 国产99久久久| 国产亚洲综合久久| 亚洲男人在线| 亚洲国产精品无码观看久久| a在线播放不卡| 欧美超碰在线观看| www.日本久久久久com.| 韩国一区二区三区视频| 日韩精品视频在线观看视频| 久久亚洲综合色一区二区三区| 无码人妻丰满熟妇精品区| 社区色欧美激情 | 99久久人爽人人添人人澡| 无码人妻丰满熟妇区96| 国产蜜臀97一区二区三区 | 欧美精品一区二区久久婷婷| 色一区二区三区| 亚洲精品久久久久久一区二区| 国产在线播放一区| 天天综合网久久综合网| 在线精品91av| 午夜精品在线| 免费观看日韩毛片| 国产精品成人免费在线| 成人国产一区二区三区| 免费精品视频| 国产日产精品一区二区三区的介绍| 精品美女一区二区| 都市激情亚洲一区| 欧美aaa在线观看| 99re这里只有精品首页| 一级片在线免费观看视频| 午夜精品久久久久久99热软件| 国产精品欧美三级在线观看| 人妻换人妻仑乱| 91成人免费在线| 国产啊啊啊视频在线观看| 亚洲国产精品www| 不卡一卡二卡三乱码免费网站|