Notebook

これは日々の作業を通して学んだことや毎日の生活で気づいたことをを記録しておく備忘録である。

HTML ファイル生成日時: 2026/01/10 09:34:17.487 (台灣標準時)

duckdb の使い方

duckdb という database management system があると知ったので、試してみたでござる。 duckdb を Python から 使う方法を学んでみたので、その使い方を記録しておくでござる。

duckdb は pkgsrc に含まれているので、簡単にインストールすることができ るでござる。


# cd /usr/pkgsrc/databases/duckdb
# make install
# cd /usr/pkgsrc/databases/py-duckdb
# make install
# pkgclean

Python から duckdb を使う方法については、以下を参照すればよいようでご ざる。

まずは、新たなテーブルを作るプログラムを書いてみるでござる。


#!/usr/pkg/bin/python3

#
# Time-stamp: <2026/01/09 16:39:00 (UT+08:00) daisuke>
#

# importing duckdb module
import duckdb

# database file
file_db = 'solsys.db'

# SQL comand to create a table
sql_maketable = "CREATE TABLE solarsystem (name TEXT PRIMARY KEY, class TEXT, radius DOUBLE, mass DOUBLE, mean_density DOUBLE, atmosphere BOOLEAN, magnetic_field BOOLEAN);"

# connecting to a new database
with duckdb.connect (file_db) as connection:
    connection.sql (sql_maketable)

このプログラムを実行してみるでござる。


% python3 test_duckdb_00_create_table.py
% ls -lF *.db
-rw-r--r--  1 daisuke  taiwan  274432 Jan  9 21:29 solsys.db
%  file solsys.db 
solsys.db: data

fig_202601/xterm_duckdb_00.png

次に、作ったテーブルの構造を確認するプログラムを作ってみるでござる。


#!/usr/pkg/bin/python3

#
# Time-stamp: <2026/01/09 16:44:51 (UT+08:00) daisuke>
#

# importing duckdb module
import duckdb

# database file
file_db = 'solsys.db'

# connecting to a new database
with duckdb.connect (file_db) as connection:
    table_info = connection.table ("solarsystem")
    print (table_info)

実行してみるでござる。


% python3 test_duckdb_01_check_table.py
┌─────────┬─────────┬────────┬────────┬──────────────┬────────────┬────────────────┐
│  name   │  class  │ radius │  mass  │ mean_density │ atmosphere │ magnetic_field │
│ varchar │ varchar │ double │ double │    double    │  boolean   │    boolean     │
├─────────┴─────────┴────────┴────────┴──────────────┴────────────┴────────────────┤
│                                      0 rows                                      │
└──────────────────────────────────────────────────────────────────────────────────┘


fig_202601/xterm_duckdb_01.png

作ったテーブルにデータを追加するプログラムを作ってみるでござる。


#!/usr/pkg/bin/python3

#
# Time-stamp: <2026/01/09 16:39:36 (UT+08:00) daisuke>
#

# importing duckdb module
import duckdb

# database file
file_db = 'solsys.db'

# connecting to a new database
with duckdb.connect (file_db) as connection:
    sql_add_sun = "INSERT INTO solarsystem VALUES ('Sun', 'star', 6.96E8, 1.99E30, 1400, 'true', 'true');"
    connection.sql (sql_add_sun)
    sql_add_mercury = "INSERT INTO solarsystem VALUES ('Mercury', 'planet', 2.44E6, 3.30E23, 5430, 'false', 'true');"
    connection.sql (sql_add_mercury)
    sql_add_venus = "INSERT INTO solarsystem VALUES ('Venus', 'planet', 6.05E6, 4.87E24, 5240, 'true', 'false');"
    connection.sql (sql_add_venus)
    sql_add_earth = "INSERT INTO solarsystem VALUES ('Earth', 'planet', 6.37E6, 5.97E24, 5510, 'true', 'true');"
    connection.sql (sql_add_earth)
    sql_add_mars = "INSERT INTO solarsystem VALUES ('Mars', 'planet', 3.39E6, 6.42E23, 3930, 'true', 'false');"
    connection.sql (sql_add_mars)
    sql_add_jupiter = "INSERT INTO solarsystem VALUES ('Jupiter', 'planet', 6.99E7, 1.90E27, 1330, 'true', 'true');"
    connection.sql (sql_add_jupiter)
    sql_add_saturn = "INSERT INTO solarsystem VALUES ('Saturn', 'planet', 5.82E7, 5.68E26, 687, 'true', 'true');"
    connection.sql (sql_add_saturn)
    sql_add_uranus = "INSERT INTO solarsystem VALUES ('Uranus', 'planet', 2.54E7, 8.68E25, 1270, 'true', 'true');"
    connection.sql (sql_add_uranus)
    sql_add_neptune = "INSERT INTO solarsystem VALUES ('Neptune', 'planet', 2.46E7, 1.02E26, 1640, 'true', 'true');"
    connection.sql (sql_add_neptune)
    sql_add_ceres = "INSERT INTO solarsystem VALUES ('Ceres', 'dwarf_planet', 4.70E5, 9.38E20, 2160, 'false', 'false');"
    connection.sql (sql_add_ceres)
    sql_add_pluto = "INSERT INTO solarsystem VALUES ('Pluto', 'dwarf_planet', 1.19E6, 1.30E22, 1850, 'true', 'false');"
    connection.sql (sql_add_pluto)
    sql_add_eris = "INSERT INTO solarsystem VALUES ('Eris', 'dwarf_planet', 1.20E6, 1.66E22, 2300, 'false', 'false');"
    connection.sql (sql_add_eris)
    sql_add_makemake = "INSERT INTO solarsystem VALUES ('Makemake', 'dwarf_planet', 7.14E5, 3.10E21, 2100, 'true', 'false');"
    connection.sql (sql_add_makemake)
    sql_add_haumea = "INSERT INTO solarsystem VALUES ('Haumea', 'dwarf_planet', 7.15E5, 4.01E21, 2600, 'false', 'false');"
    connection.sql (sql_add_haumea)

プログラムを実行してデータを追加するでござる。


% python3 test_duckdb_02_add_data.py

データが追加されたかどうか確認してみるでござる。


% python3 test_duckdb_01_check_table.py
┌──────────┬──────────────┬─────────────┬──────────┬──────────────┬────────────┬────────────────┐
│   name   │    class     │   radius    │   mass   │ mean_density │ atmosphere │ magnetic_field │
│ varchar  │   varchar    │   double    │  double  │    double    │  boolean   │    boolean     │
├──────────┼──────────────┼─────────────┼──────────┼──────────────┼────────────┼────────────────┤
│ Sun      │ star         │ 696000000.0 │ 1.99e+30 │       1400.0 │ true       │ true           │
│ Mercury  │ planet       │   2440000.0 │  3.3e+23 │       5430.0 │ false      │ true           │
│ Venus    │ planet       │   6050000.0 │ 4.87e+24 │       5240.0 │ true       │ false          │
│ Earth    │ planet       │   6370000.0 │ 5.97e+24 │       5510.0 │ true       │ true           │
│ Mars     │ planet       │   3390000.0 │ 6.42e+23 │       3930.0 │ true       │ false          │
│ Jupiter  │ planet       │  69900000.0 │  1.9e+27 │       1330.0 │ true       │ true           │
│ Saturn   │ planet       │  58200000.0 │ 5.68e+26 │        687.0 │ true       │ true           │
│ Uranus   │ planet       │  25400000.0 │ 8.68e+25 │       1270.0 │ true       │ true           │
│ Neptune  │ planet       │  24600000.0 │ 1.02e+26 │       1640.0 │ true       │ true           │
│ Ceres    │ dwarf_planet │    470000.0 │ 9.38e+20 │       2160.0 │ false      │ false          │
│ Pluto    │ dwarf_planet │   1190000.0 │  1.3e+22 │       1850.0 │ true       │ false          │
│ Eris     │ dwarf_planet │   1200000.0 │ 1.66e+22 │       2300.0 │ false      │ false          │
│ Makemake │ dwarf_planet │    714000.0 │  3.1e+21 │       2100.0 │ true       │ false          │
│ Haumea   │ dwarf_planet │    715000.0 │ 4.01e+21 │       2600.0 │ false      │ false          │
├──────────┴──────────────┴─────────────┴──────────┴──────────────┴────────────┴────────────────┤
│ 14 rows                                                                             7 columns │
└───────────────────────────────────────────────────────────────────────────────────────────────┘


どうやらテーブルにデータが追加されたようでござる。

fig_202601/xterm_duckdb_02.png

query を行うプログラムを作ってみるでござる。


#!/usr/pkg/bin/python3

#
# Time-stamp: <2026/01/09 16:45:48 (UT+08:00) daisuke>
#

# importing duckdb module
import duckdb

# database file
file_db = 'solsys.db'

# SQL command to carry out a query
sql_query = "SELECT * FROM solarsystem;"

# connecting to a new database
with duckdb.connect (file_db) as connection:
    query_result = connection.sql (sql_query).show ()
    print (query_result)

プログラムを実行してみるでござる。


% python3 test_duckdb_03_query.py
┌──────────┬──────────────┬─────────────┬──────────┬──────────────┬────────────┬────────────────┐
│   name   │    class     │   radius    │   mass   │ mean_density │ atmosphere │ magnetic_field │
│ varchar  │   varchar    │   double    │  double  │    double    │  boolean   │    boolean     │
├──────────┼──────────────┼─────────────┼──────────┼──────────────┼────────────┼────────────────┤
│ Sun      │ star         │ 696000000.0 │ 1.99e+30 │       1400.0 │ true       │ true           │
│ Mercury  │ planet       │   2440000.0 │  3.3e+23 │       5430.0 │ false      │ true           │
│ Venus    │ planet       │   6050000.0 │ 4.87e+24 │       5240.0 │ true       │ false          │
│ Earth    │ planet       │   6370000.0 │ 5.97e+24 │       5510.0 │ true       │ true           │
│ Mars     │ planet       │   3390000.0 │ 6.42e+23 │       3930.0 │ true       │ false          │
│ Jupiter  │ planet       │  69900000.0 │  1.9e+27 │       1330.0 │ true       │ true           │
│ Saturn   │ planet       │  58200000.0 │ 5.68e+26 │        687.0 │ true       │ true           │
│ Uranus   │ planet       │  25400000.0 │ 8.68e+25 │       1270.0 │ true       │ true           │
│ Neptune  │ planet       │  24600000.0 │ 1.02e+26 │       1640.0 │ true       │ true           │
│ Ceres    │ dwarf_planet │    470000.0 │ 9.38e+20 │       2160.0 │ false      │ false          │
│ Pluto    │ dwarf_planet │   1190000.0 │  1.3e+22 │       1850.0 │ true       │ false          │
│ Eris     │ dwarf_planet │   1200000.0 │ 1.66e+22 │       2300.0 │ false      │ false          │
│ Makemake │ dwarf_planet │    714000.0 │  3.1e+21 │       2100.0 │ true       │ false          │
│ Haumea   │ dwarf_planet │    715000.0 │ 4.01e+21 │       2600.0 │ false      │ false          │
├──────────┴──────────────┴─────────────┴──────────┴──────────────┴────────────┴────────────────┤
│ 14 rows                                                                             7 columns │
└───────────────────────────────────────────────────────────────────────────────────────────────┘

None

fig_202601/xterm_duckdb_03.png

もう一つ、 SQL query を行うプログラムを作ってみるでござる。


#!/usr/pkg/bin/python3

#
# Time-stamp: <2026/01/09 16:46:41 (UT+08:00) daisuke>
#

# importing duckdb module
import duckdb

# database file
file_db = 'solsys.db'

# SQL command to carry out a query
sql_query = "SELECT * FROM solarsystem WHERE mean_density > 2000.0;"

# connecting to a new database
with duckdb.connect (file_db) as connection:
    query_result = connection.sql (sql_query).show ()
    print (query_result)

実行してみるでござる。


% python3 test_duckdb_04_query.py
┌──────────┬──────────────┬───────────┬──────────┬──────────────┬────────────┬────────────────┐
│   name   │    class     │  radius   │   mass   │ mean_density │ atmosphere │ magnetic_field │
│ varchar  │   varchar    │  double   │  double  │    double    │  boolean   │    boolean     │
├──────────┼──────────────┼───────────┼──────────┼──────────────┼────────────┼────────────────┤
│ Mercury  │ planet       │ 2440000.0 │  3.3e+23 │       5430.0 │ false      │ true           │
│ Venus    │ planet       │ 6050000.0 │ 4.87e+24 │       5240.0 │ true       │ false          │
│ Earth    │ planet       │ 6370000.0 │ 5.97e+24 │       5510.0 │ true       │ true           │
│ Mars     │ planet       │ 3390000.0 │ 6.42e+23 │       3930.0 │ true       │ false          │
│ Ceres    │ dwarf_planet │  470000.0 │ 9.38e+20 │       2160.0 │ false      │ false          │
│ Eris     │ dwarf_planet │ 1200000.0 │ 1.66e+22 │       2300.0 │ false      │ false          │
│ Makemake │ dwarf_planet │  714000.0 │  3.1e+21 │       2100.0 │ true       │ false          │
│ Haumea   │ dwarf_planet │  715000.0 │ 4.01e+21 │       2600.0 │ false      │ false          │
└──────────┴──────────────┴───────────┴──────────┴──────────────┴────────────┴────────────────┘

None

fig_202601/xterm_duckdb_04.png

更にもう一つ、 SQL query を行うプログラムを書いてみるでござる。


#!/usr/pkg/bin/python3

#
# Time-stamp: <2026/01/09 16:46:06 (UT+08:00) daisuke>
#

# importing duckdb module
import duckdb

# database file
file_db = 'solsys.db'

# SQL command to carry out a query
sql_query = "SELECT * FROM solarsystem WHERE class = 'planet' and atmosphere = 'true' and magnetic_field = 'true';"

# connecting to a new database
with duckdb.connect (file_db) as connection:
    query_result = connection.sql (sql_query).show ()
    print (query_result)

実行してみるでござる。


% python3 test_duckdb_05_query.py 
┌─────────┬─────────┬────────────┬──────────┬──────────────┬────────────┬────────────────┐
│  name   │  class  │   radius   │   mass   │ mean_density │ atmosphere │ magnetic_field │
│ varchar │ varchar │   double   │  double  │    double    │  boolean   │    boolean     │
├─────────┼─────────┼────────────┼──────────┼──────────────┼────────────┼────────────────┤
│ Earth   │ planet  │  6370000.0 │ 5.97e+24 │       5510.0 │ true       │ true           │
│ Jupiter │ planet  │ 69900000.0 │  1.9e+27 │       1330.0 │ true       │ true           │
│ Saturn  │ planet  │ 58200000.0 │ 5.68e+26 │        687.0 │ true       │ true           │
│ Uranus  │ planet  │ 25400000.0 │ 8.68e+25 │       1270.0 │ true       │ true           │
│ Neptune │ planet  │ 24600000.0 │ 1.02e+26 │       1640.0 │ true       │ true           │
└─────────┴─────────┴────────────┴──────────┴──────────────┴────────────┴────────────────┘

None

fig_202601/xterm_duckdb_05.png

sqlite よりも duckdb の方が、よりスッキリとプログラムを書けるように思っ たでござる。



Frequently accessed files

  1. Misc___Taiwan/20240207_00.html
  2. Computer___TeX/20231107_00.html
  3. Misc___Taiwan/20240819_00.html
  4. Book___Chinese/20240424_00.html
  5. Computer___TeX/20240410_00.html
  6. Computer___TeX/20240411_00.html
  7. Computer___TeX/20230726_01.html
  8. Misc___Taiwan/20240903_01.html
  9. Computer___NetBSD/20250301_01.html
  10. Computer___Network/20230516_00.html
  11. Computer___TeX/20240414_01.html
  12. Computer___Network/20241214_00.html
  13. Computer___FreeBSD/20220621_0.html
  14. Computer___Network/20240130_00.html
  15. Computer___NetBSD/20230119_00.html
  16. Computer___TeX/20240414_00.html
  17. Computer___Python/20250330_00.html
  18. Misc___Japan/20240718_00.html
  19. Misc___Japan/20240610_00.html
  20. Computer___NetBSD/20250113_00.html
  21. Computer___Python/20220518_0.html
  22. Computer___NetBSD/20240805_03.html
  23. Computer___Python/20220715_0.html
  24. Computer___Python/20240101_00.html
  25. Computer___NetBSD/20220818_1.html
  26. Computer___Network/20220413_1.html
  27. Computer___NetBSD/20240810_00.html
  28. Computer___NetBSD/20250409_00.html
  29. Computer___Hardware/20240820_00.html
  30. Computer___NetBSD/20241102_00.html


HTML file generated by Kinoshita Daisuke.