Blog
dbt Quicktip: Globale Makros und Paketmakros außer Kraft setzen

dbt bietet Entwicklern unter anderem die Möglichkeit, Pakete zu erstellen, die eine strukturierte Möglichkeit bieten, Code, Modelle, Tests und Makros zu organisieren und gemeinsam zu nutzen. Sie verbessern die Codeorganisation, fördern die Zusammenarbeit und ermöglichen die Wiederverwendung von vorgefertigtem und getesteten Code aus der dbt-Community, wodurch Datenumwandlungsprojekte effizienter und wartbarer werden.
Es gibt jedoch Fälle, in denen ein Paket in Ihrem Projekt perfekt funktioniert, mit Ausnahme eines kleinen Teils, der vielleicht einen Fehler aufweist oder ein Verhalten zeigt, das Sie gerne anders hätten. Manchmal verhindern solche Szenarien die Entwicklung und Bereitstellung des gesamten Projekts, und das Warten auf eine neue Paketversion kann länger dauern, als Sie sich leisten können.
An dieser Stelle kommt das Überschreiben von globalen und Paketmakros ins Spiel. Mit dieser Funktion können Sie das Verhalten von Makros anpassen und so schnelle Korrekturen und Feinabstimmungen für Ihre speziellen Bedürfnisse vornehmen.
Wie funktioniert das?
Das Konzept dieser Funktion ist recht einfach: Sie erstellen Ihr eigenes Makro und weisen dbt an, zunächst in Ihrem Projekt nach dem Makro zu suchen, bevor Sie das Paket (oder das globale Makro) mit dispatch durchsuchen.
Dasselbe gilt für Pakete: Wenn Sie einen anderen Adapter als die eingebauten verwenden, müssen Sie möglicherweise ein Paket verwenden, um die Makros 'kompatibel' zu machen - tsql-utils zum Beispiel.
Alle Einzelheiten können Sie in der offiziellen Dokumentation nachlesen.
Praktische Übungen
Dies ist ein echtes Beispiel, das mir kürzlich passiert ist.
In einem Projekt, an dem ich derzeit arbeite, verwende ich die dbt-sqlserver Adapter, um dbt mit SQL Server zu verbinden. Ich verwende auch tsql-utils um die Makros kompatibel zu machen. Es hat einige Monate lang gut funktioniert, aber dann habe ich den folgenden Fehler in meiner Pipeline erhalten.
Nach weiteren Untersuchungen fand ich heraus, dass das Makro, das diesen Fehler verursachte, generate_surrogate_key war - das ich in einigen der Modelle verwendete.
Dieses Makro ist im tsql-utils-Paket nicht verfügbar, also war die nächste Stelle, an der ich suchen musste dbt-utils . Dort habe ich es gefunden(hier).
Wie Sie in der Abbildung unten sehen können, ist der letzte Schritt des Makros eine concat-Funktion. Leider wirft SQL Server einen Fehler aus, wenn Sie concat mit nur einer Spalte verwenden (jetzt sollte die Bedeutung der Kompatibilitätspakete klar sein).
Die schnelle Lösung für dieses Problem besteht darin, eine if-Anweisung hinzuzufügen, die prüft, ob es eine oder mehrere Spalten gibt. Um dies schnell zu implementieren, habe ich eine Datei namens generate_surrogate_key.sql erstellt, in der das Makro definiert ist.
Wie Sie in der Abbildung unten sehen können, habe ich dem Makro den Zusatz sqlserver__ vorangestellt. Damit soll dieses Makro
Schließlich habe ich den folgenden Code zu meiner dbt_project.yml Datei hinzugefügt, um sicherzustellen, dass dbt an der richtigen Stelle und in der richtigen Reihenfolge nach dem Makro sucht (vergessen Sie nicht, das erste Element durch den Namen Ihres Projekts zu ersetzen).
dispatch:
- macro_namespace: dbt_utils
search_order: ['my_project', 'tsql_utils', 'dbt_utils']
Das war's! Nachdem ich die Pipeline bestätigt, verschoben und erneut ausgeführt hatte, funktionierte alles reibungslos!
Jetzt kann ich in aller Ruhe warten, bis das tsql_utils-Paket aktualisiert wird, dann mein eigenes Makro löschen und nur das des Pakets verwenden.
Fazit
Indem Sie die Funktion zum Überschreiben von globalen und Paketmakros nutzen, können Sie stundenlanges Debugging einsparen und Quick-Fixes implementieren, wodurch Sie weniger abhängig von der Veröffentlichung neuer Paketversionen sind.
Wenn Sie einen Fehler finden und ihn selbst beheben können, indem Sie ein Paketmakro überschreiben, möchte ich Sie natürlich dazu ermutigen, einen Beitrag für die Gemeinschaft zu leisten, indem Sie den Fehler im entsprechenden Paket beheben und einen Pull Request erstellen. Ich habe dies vor kurzem für den dbt-sqlserver-Adapter und das tsql-utils-Paket getan, und es war eine großartige Erfahrung.
Verfasst von
Lucas Ortiz
I've always been fascinated by technology and problem-solving. Great challenges are what keep me motivated, I rarely accept that a task can’t be done, it’s only a matter of finding new paths to solve the puzzle.
Unsere Ideen
Weitere Blogs
Contact



