これは日々の作業を通して学んだことや毎日の生活で気づいたことをを記録しておく備忘録である。
HTML ファイル生成日時: 2026/01/10 09:34:17.487 (台灣標準時)
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
|
|---|
次に、作ったテーブルの構造を確認するプログラムを作ってみるでござる。
#!/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 │ └──────────────────────────────────────────────────────────────────────────────────┘
|
|---|
作ったテーブルにデータを追加するプログラムを作ってみるでござる。
#!/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 │ └───────────────────────────────────────────────────────────────────────────────────────────────┘
どうやらテーブルにデータが追加されたようでござる。
|
|---|
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
|
|---|
もう一つ、 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
|
|---|
更にもう一つ、 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
|
|---|
sqlite よりも duckdb の方が、よりスッキリとプログラムを書けるように思っ たでござる。