Zum Inhalt springen

Makros teilen

DuckDB verfügt über einen leistungsstarken Makro-Mechanismus, mit dem sich Kurzformen für häufige Aufgaben anlegen lassen.

Ein Skalarmakro teilen

Zuerst definieren wir ein Makro, das eine nichtnegative Ganzzahl als kurze Zeichenkette mit Tausendern, Millionen und Milliarden (ohne Rundung) formatiert:

Terminal window
duckdb pretty_print_integer_macro.duckdb
CREATE MACRO pretty_print_integer(n) AS
CASE
WHEN n >= 1_000_000_000 THEN printf('%dB', n // 1_000_000_000)
WHEN n >= 1_000_000 THEN printf('%dM', n // 1_000_000)
WHEN n >= 1_000 THEN printf('%dk', n // 1_000)
ELSE printf('%d', n)
END;
SELECT pretty_print_integer(25_500_000) AS x;
┌─────────┐
│ x │
│ varchar │
├─────────┤
│ 25M │
└─────────┘

Wie zu erwarten, wird das Makro in der Datenbank persistiert. Das bedeutet aber auch, dass wir es auf einem HTTPS-Endpunkt hosten und mit jedem teilen können! Wir haben dieses Makro auf blobs.duckdb.org veröffentlicht.

Sie können es in DuckDB ausprobieren:

Terminal window
duckdb

Stellen Sie sicher, dass die Erweiterung httpfs installiert ist:

INSTALL httpfs;

Sie können sich nun mit dem Remote-Endpunkt verbinden und das Makro verwenden:

ATTACH 'https://blobs.duckdb.org/data/pretty_print_integer_macro.duckdb'
AS pretty_print_macro_db;
SELECT pretty_print_macro_db.pretty_print_integer(42_123) AS x;
┌─────────┐
│ x │
│ varchar │
├─────────┤
│ 42k │
└─────────┘

Ein Tabellenmakro teilen

Es ist auch möglich, Tabellenmakros zu teilen. Zum Beispiel haben wir das checksum-Makro wie folgt erstellt:

Terminal window
duckdb compute_table_checksum.duckdb
CREATE MACRO checksum(table_name) AS TABLE
SELECT bit_xor(md5_number(COLUMNS(*)::VARCHAR))
FROM query_table(table_name);

Um es zu verwenden, stellen Sie sicher, dass die Erweiterung httpfs installiert ist:

INSTALL httpfs;

Sie können sich mit dem Remote-Endpunkt verbinden und das Makro verwenden:

ATTACH 'https://blobs.duckdb.org/data/compute_table_checksum.duckdb'
AS compute_table_checksum_db;
CREATE TABLE stations AS
FROM 'https://blobs.duckdb.org/stations.parquet';
.mode line
FROM compute_table_checksum_db.checksum('stations');
id = -132780776949939723506211681506129908318
code = 126327004005066229305810236187733612209
uic = -145623335062491121476006068124745817380
name_short = -114540917565721687000878144381189869683
name_medium = -568264780518431562127359918655305384
name_long = 126079956280724674884063510870679874110
slug = -53458800462031706622213217090663245511
country = 143068442936912051858689770843609587944
type = 5665662315470785456147400604088879751
geo_lat = 160608116135251821259126521573759502306
geo_lng = -138297281072655463682926723171691547732