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:
duckdb pretty_print_integer_macro.duckdbCREATE 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:
duckdbStellen 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:
duckdb compute_table_checksum.duckdbCREATE 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 lineFROM compute_table_checksum_db.checksum('stations'); id = -132780776949939723506211681506129908318 code = 126327004005066229305810236187733612209 uic = -145623335062491121476006068124745817380 name_short = -114540917565721687000878144381189869683name_medium = -568264780518431562127359918655305384 name_long = 126079956280724674884063510870679874110 slug = -53458800462031706622213217090663245511 country = 143068442936912051858689770843609587944 type = 5665662315470785456147400604088879751 geo_lat = 160608116135251821259126521573759502306 geo_lng = -138297281072655463682926723171691547732