{"id":32332,"date":"2025-10-24T05:00:00","date_gmt":"2025-10-24T03:00:00","guid":{"rendered":"https:\/\/sii.pl\/blog\/?p=32332"},"modified":"2025-10-20T16:22:35","modified_gmt":"2025-10-20T14:22:35","slug":"matillion-api-query-na-przykladzie-jira-api","status":"publish","type":"post","link":"https:\/\/sii.pl\/blog\/matillion-api-query-na-przykladzie-jira-api\/","title":{"rendered":"Matillion API Query na przyk\u0142adzie Jira API"},"content":{"rendered":"\n<p>Integracja r\u00f3\u017cnych \u017ar\u00f3de\u0142 informacji jest kluczowa dla efektywnego zarz\u0105dzania i analizy danych. Jednym z narz\u0119dzi, kt\u00f3re znacz\u0105co u\u0142atwia ten proces, jest Matillion \u2013 platforma ETL\/ELT zaprojektowana do pracy z chmur\u0105.<\/p>\n\n\n\n<p>Matillion&nbsp;to nowoczesne rozwi\u0105zanie umo\u017cliwiaj\u0105ce \u0142atwe przetwarzanie, transformacj\u0119 i \u0142adowanie danych do hurtowni danych takich jak Snowflake, BigQuery czy Redshift. Dzi\u0119ki intuicyjnemu interfejsowi i bogatemu zestawowi komponent\u00f3w, <strong>Matillion pozwala na szybkie budowanie przep\u0142yw\u00f3w danych bez konieczno\u015bci pisania du\u017cej ilo\u015bci kodu.<\/strong><\/p>\n\n\n\n<p>W tym artykule skupi\u0119 si\u0119 w szczeg\u00f3lno\u015bci na&nbsp;<strong>opisaniu procesu pozyskania danych poprzez API<\/strong> (Application Programming Interface) <strong>na przyk\u0142adzie danych o zadaniach zaraportowanych w systemie Jira.<\/strong><\/p>\n\n\n\n<p>W tym przypadku wykorzystanie API jest przydatne do uzyskania aktualnych informacji o zadaniach, statusach, przypisanych osobach i innych kluczowych danych projektowych. Do\u015b\u0107 cz\u0119sto API jest jedynym interfejsem pozyskania danych, gdy\u017c bezpo\u015bredni dost\u0119p do bazy danych systemu \u017ar\u00f3d\u0142owego nie zawsze le\u017cy w zasadach bezpiecze\u0144stwa, licencji i administracji w korporacji, a dost\u0119p po\u015bredni poprzez wyeksportowane pliki wi\u0105\u017ce si\u0119 z pewnymi op\u00f3\u017anieniami i innymi problemami.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Integracja z API<\/strong><\/h2>\n\n\n\n<p>Matillion oferuje kilka komponent\u00f3w do integracji z API:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>API Query Component<\/strong>&nbsp;\u2013 komponent zaprojektowany do pobierania danych z API opartych na JSON\/XML. Umo\u017cliwia tworzenie profili API i mapowanie danych na struktur\u0119 tabelaryczn\u0105. Jest idealny do wykonywania zapyta\u0144 i pobierania danych w strukturze tabelarycznej z mo\u017cliwo\u015bci\u0105 filtrowania i sortowania.<\/li>\n\n\n\n<li><strong>Python Script Component<\/strong>&nbsp;\u2013 pozwala na pisanie w\u0142asnych skrypt\u00f3w w Pythonie, np. z u\u017cyciem biblioteki&nbsp;<em>requests<\/em>, co daje pe\u0142n\u0105 kontrol\u0119 nad zapytaniami i odpowiedziami API. Do transformacji danych w formacie JSON do formatu tabelarycznego nale\u017cy u\u017cy\u0107 innych dost\u0119pnych bibliotek.<\/li>\n\n\n\n<li><strong>API Extract&nbsp;Component<\/strong> \u2013 kuzyn API Query komponent, jest zoptymalizowany do pobierania du\u017cych ilo\u015bci danych i ich \u0142adowania do bazy danych, co jest bardziej efektywne w przypadku masowych operacji.<\/li>\n<\/ol>\n\n\n\n<p>R\u00f3\u017cnice mi\u0119dzy API Query a Python z bibliotek\u0105 requests:<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><td class=\"has-text-align-center\" data-align=\"center\"><strong>Cecha<\/strong><strong><\/strong><\/td><td class=\"has-text-align-center\" data-align=\"center\"><strong>API Query <\/strong><strong><\/strong><\/td><td class=\"has-text-align-center\" data-align=\"center\"><strong>Python Script (requests)<\/strong><strong><\/strong><\/td><\/tr><\/thead><tbody><tr><td class=\"has-text-align-center\" data-align=\"center\">\u0141atwo\u015b\u0107 u\u017cycia<\/td><td class=\"has-text-align-center\" data-align=\"center\">Wysoka \u2013 interfejs graficzny<\/td><td class=\"has-text-align-center\" data-align=\"center\">\u015arednia \u2013 wymaga znajomo\u015bci Pythona<\/td><\/tr><tr><td class=\"has-text-align-center\" data-align=\"center\">Elastyczno\u015b\u0107<\/td><td class=\"has-text-align-center\" data-align=\"center\">Ograniczona do struktury JSON\/XML<\/td><td class=\"has-text-align-center\" data-align=\"center\">Bardzo wysoka \u2013 pe\u0142na kontrola<\/td><\/tr><tr><td class=\"has-text-align-center\" data-align=\"center\">Obs\u0142uga b\u0142\u0119d\u00f3w<\/td><td class=\"has-text-align-center\" data-align=\"center\">Podstawowa<\/td><td class=\"has-text-align-center\" data-align=\"center\">Mo\u017cliwo\u015b\u0107 zaawansowanej obs\u0142ugi b\u0142\u0119d\u00f3w<\/td><\/tr><tr><td class=\"has-text-align-center\" data-align=\"center\">Integracja z Matillion<\/td><td class=\"has-text-align-center\" data-align=\"center\">Bezpo\u015brednia<\/td><td class=\"has-text-align-center\" data-align=\"center\">Wymaga r\u0119cznego mapowania danych<\/td><\/tr><tr><td class=\"has-text-align-center\" data-align=\"center\">Wydajno\u015b\u0107<\/td><td class=\"has-text-align-center\" data-align=\"center\">Optymalna dla prostych zapyta\u0144<\/td><td class=\"has-text-align-center\" data-align=\"center\">Lepsza dla niestandardowych API<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>Ograniczenia API Query component w Matillion<\/strong><\/h3>\n\n\n\n<p>API Query component w Matillion ma kilka ogranicze\u0144, kt\u00f3re warto wzi\u0105\u0107 pod uwag\u0119:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Struktura danych\n<ul class=\"wp-block-list\">\n<li>Profile API: API Query component wymaga zdefiniowania profilu API, kt\u00f3ry opisuje struktur\u0119 API i mapuje dane na tabele, wiersze i kolumny. Proces ten mo\u017ce by\u0107 skomplikowany, szczeg\u00f3lnie dla bardziej z\u0142o\u017conych API.<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li>Wydajno\u015b\u0107\n<ul class=\"wp-block-list\">\n<li><span style=\"color: initial;\">Du\u017ce zbiory danych: Pobieranie du\u017cych ilo\u015bci danych mo\u017ce wp\u0142ywa\u0107 na wydajno\u015b\u0107. Optymalizacja zapyta\u0144 (filtry) i u\u017cycie paginacji s\u0105 kluczowe dla utrzymania efektywno\u015bci.<\/span><\/li>\n\n\n\n<li>Z\u0142o\u017cono\u015b\u0107 zapyta\u0144: Bardziej skomplikowane zapytania mog\u0105 wymaga\u0107 wi\u0119cej czasu na przetworzenie, co mo\u017ce wp\u0142ywa\u0107 na czas odpowiedzi.<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li>Uwierzytelnianie\n<ul class=\"wp-block-list\">\n<li>Metody uwierzytelniania: API Query component obs\u0142uguje r\u00f3\u017cne metody uwierzytelniania, takie jak klucze API, tokeny Bearer, OAuth i inne. Konfiguracja tych metod mo\u017ce by\u0107 czasoch\u0142onna i wymaga\u0107 dodatkowej uwagi.<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li>Bezpiecze\u0144stwo\n<ul class=\"wp-block-list\">\n<li>Przechowywanie kluczy: Klucze API i tokeny uwierzytelniaj\u0105ce musz\u0105 by\u0107 przechowywane w bezpieczny spos\u00f3b, aby zapobiec nieautoryzowanemu dost\u0119powi.<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li>Zmiany w strukturze tabel\n<ul class=\"wp-block-list\">\n<li>Potencjalne zmiany: Je\u015bli struktura docelowej tabeli ulegnie zmianie, tabela mo\u017ce zosta\u0107 ponownie utworzona lub wyczyszczona. Wa\u017cne jest, aby nie modyfikowa\u0107 struktury tabeli r\u0119cznie.<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li>Certyfikaty SSL\n<ul class=\"wp-block-list\">\n<li>API Query component mo\u017ce mie\u0107 problemy z certyfikatami SSL, szczeg\u00f3lnie je\u015bli serwer API u\u017cywa samopodpisanych lub nieweryfikowalnych certyfikat\u00f3w. Konfiguracja akceptacji wszystkich certyfikat\u00f3w mo\u017ce by\u0107 konieczna.<\/li>\n<\/ul>\n<\/li>\n<\/ol>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Przyk\u0142ad: Pobieranie danych z Jira API przy u\u017cyciu API Query<\/strong><\/h2>\n\n\n\n<p><strong>Wa\u017cne:<\/strong> Dla cel\u00f3w artyku\u0142u kilka temat\u00f3w zosta\u0142o uproszczonych. Dla bezpieczenstwa i zgodno\u015bci z polityk\u0105 firmy skontaktuj sie z lokalnym dzialem IT.<\/p>\n\n\n\n<p><strong>Scenariusz:<\/strong> Sprawd\u017a, jakie zadania Jira s\u0105 zakomitowane do brancha QA. Nast\u0119pnie pobierz dla nich: numer (key), nazw\u0119 (summary), status oraz przypisan\u0105 osob\u0119 (assignee). Je\u015bli wszystkie zadania maj\u0105 status \u201eDone\u201d, wykonaj operacj\u0119 Merge z QA do PROD, a nast\u0119pnie, wykorzystuj\u0105c numer oraz nazw\u0119, uzupe\u0142nij \u201eRelease Notes\u201d.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>Krok 1: Token API<\/strong><\/h3>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Przejd\u017a do Jira.<\/li>\n\n\n\n<li>My API tokens (API Token Authentication).<\/li>\n\n\n\n<li>New API token\n<ul class=\"wp-block-list\">\n<li><span style=\"color: initial;\">Read (jest wystarczaj\u0105cy dla naszych cel\u00f3w),<\/span><\/li>\n\n\n\n<li>Expiration (zale\u017cy od security policy).<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li>Po klikni\u0119ciu \u201eCreate\u201d skopiuj token w bezpieczne miejsce. Jest on dost\u0119pny w Jira do podgl\u0105du i skopiowania <strong>tylko raz.<\/strong><\/li>\n<\/ol>\n\n\n\n<figure class=\"wp-block-image aligncenter size-full\"><img decoding=\"async\" width=\"625\" height=\"615\" src=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2025\/10\/image1-3.png\" alt=\"New API token\" class=\"wp-image-32334\" srcset=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2025\/10\/image1-3.png 625w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2025\/10\/image1-3-300x295.png 300w\" sizes=\"(max-width: 625px) 100vw, 625px\" \/><figcaption class=\"wp-element-caption\">Ryc. 1 New API token<\/figcaption><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>Krok 2: Query Profile<\/strong><\/h3>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Przejd\u017a do \u201eManage API Profiles\u201d &nbsp;i utw\u00f3rz nowy profil \u201eAPI_Jira\u201d.<\/li>\n\n\n\n<li>Nast\u0119pnie wybierz Configure Query Profile.&nbsp;<\/li>\n\n\n\n<li>Kliknij \u201eNew Endpoint\u201d i nadaj nazw\u0119 jira_tickets_enpoint.<\/li>\n\n\n\n<li>Skonfiguruj:\n<ul class=\"wp-block-list\">\n<li>URI -&gt; https:\/\/jira.domain.com\/rest\/api\/2\/issue\/XYZ-321<\/li>\n\n\n\n<li><span style=\"color: initial;\">Method: GET<\/span><\/li>\n\n\n\n<li><span style=\"color: initial;\">Auth -&gt; ustaw Bearer Token i wklej Jira API Token (z kroku 1.)<\/span><\/li>\n\n\n\n<li><span style=\"color: initial;\">Params -&gt; puste (Content-Type: application\/json jest niewymagany)<\/span><\/li>\n\n\n\n<li>Body -&gt; puste<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li>Po klikni\u0119ciu \u201eSend\u201d w zak\u0142adce \u201eResponse\u201d powinny by\u0107 widoczne dane o tym zadaniu w formacie JSON. Je\u015bli nie, to sprawd\u017a w zak\u0142adce Log, jaki jest kod b\u0142edu.<\/li>\n\n\n\n<li>Kliknij \u201eNext\u201d.<\/li>\n\n\n\n<li>Pozostaw \u201eRepeating element\u201d jako domy\u015blny -&gt; \/<\/li>\n\n\n\n<li>W oknie \u201eSelect fields\u201d wybierz pola:\n<ul class=\"wp-block-list\">\n<li>\/json\/key<\/li>\n\n\n\n<li><span style=\"color: initial;\">\/json\/fields\/summary<\/span><\/li>\n\n\n\n<li><span style=\"color: initial;\">\/json\/fields\/status\/name<\/span><\/li>\n\n\n\n<li>\/json\/fields\/assignee\/displayName<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li>Paging -&gt; disabled (w tym scenariuszu nie potrzebujemy, gdy\u017c iterator za\u0142atwia spraw\u0119).<\/li>\n\n\n\n<li>Po klikni\u0119ciu \u201eNext\u201d w panelu Data Preview powinien by\u0107 widoczny 1 wiersz z wype\u0142nionymi 4 kolumnami dla tego zadania.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/li>\n\n\n\n<li>Kliknij \u201eFinish\u201d.<\/li>\n\n\n\n<li>W g\u0142\u00f3wnym oknie kliknij \u201eTest\u201d, nast\u0119pnie: jira_tickets_enpoint i podobnie jak na Data Preview powinna byc widoczna tabela z 1 wierszem.<\/li>\n\n\n\n<li>Kliknij \u201eAdvanced Mode\u201d, aby zmodyfikowa\u0107 endpoint i doda\u0107 parametr URI.\n<ul class=\"wp-block-list\">\n<li>Najpierw wyczy\u015b\u0107 warto\u015b\u0107 URI:<br>&lt;api:set attr=&#8221;uri&#8221; value=&#8221;&#8221; \/&gt;<\/li>\n\n\n\n<li>Nast\u0119pnie dodaj parametr:<br>&lt;api:set attr=&#8221;paramname#1&#8243; value=&#8221;uri&#8221; \/&gt;<br>&lt;api:set attr=&#8221;paramvalue#1&#8243; value=&#8221;[_connection.uri]&#8221; \/&gt;<br>Chcemy, \u017ceby URI by\u0142o przekazywane przez zmienn\u0105, kt\u00f3ra b\u0119dzie si\u0119 aktualizowa\u0107 z ka\u017cdym wierszem z tabeli (pobieranym iteratorem).<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li>Docelowo, chcemy mie\u0107 tak\u0105 konfiguracj\u0119 dla naszego endpointa:<\/li>\n<\/ol>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: xml; title: ; notranslate\" title=\"\">\n&lt;api:script xmlns:api=&quot;http:\/\/apiscript.com\/ns?v1&quot; xmlns:xs=&quot;http:\/\/www.w3.org\/2001\/XMLSchema&quot;&gt;\n\n &lt;api:info title=&quot;jira_tickets_endpoint&quot; desc=&quot;Generated schema file.&quot; xmlns:other=&quot;http:\/\/apiscript.com\/ns?v1&quot;&gt;\n &lt;attr name=&quot;key&quot; xs:type=&quot;string&quot; readonly=&quot;false&quot; other:xPath=&quot;\/json\/key&quot; \/&gt;\n &lt;attr name=&quot;fields.summary&quot; xs:type=&quot;string&quot; readonly=&quot;false&quot; other:xPath=&quot;\/json\/fields\/summary&quot; \/&gt;\n &lt;attr name=&quot;fields.status.name&quot; xs:type=&quot;string&quot; readonly=&quot;false&quot; other:xPath=&quot;\/json\/fields\/status\/name&quot; \/&gt;\n &lt;attr name=&quot;fields.assignee.displayName&quot; xs:type=&quot;string&quot; readonly=&quot;false&quot; other:xPath=&quot;\/json\/fields\/assignee\/displayName&quot; \/&gt;\n &lt;\/api:info&gt;\n\n &lt;api:set attr=&quot;DataModel&quot; value=&quot;DOCUMENT&quot; \/&gt;\n &lt;api:set attr=&quot;uri&quot; value=&quot;&quot; \/&gt;\n\n &lt;api:set attr=&quot;JSONPath&quot; value=&quot;\/&quot; \/&gt;\n \n &lt;api:set attr=&quot;paramname#1&quot; value=&quot;uri&quot; \/&gt;\n &lt;api:set attr=&quot;paramvalue#1&quot; value=&quot;&#x5B;_connection.uri]&quot; \/&gt;\n \n &lt;api:script method=&quot;GET&quot;&gt;\n &lt;api:set attr=&quot;method&quot; value=&quot;GET&quot;\/&gt; \n &lt;api:call op=&quot;jsonproviderGet&quot;&gt;\n &lt;api:push\/&gt;\n &lt;\/api:call&gt;\n &lt;\/api:script&gt;\n\n&lt;\/api:script&gt;\n<\/pre><\/div>\n\n\n<ol start=\"15\" class=\"wp-block-list\">\n<li>Na koniec warto usun\u0105\u0107 w oknie \u201eManage Connection Options\u201d parametr z Bearer Token.<\/li>\n<\/ol>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>Krok 3: Orchestration Job<\/strong><\/h3>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Utw\u00f3rz zmienn\u0105 (Job Variable): jv_jira_task z domy\u015blnymi ustawieniami Text, Shared, Public.<\/li>\n\n\n\n<li>Stw\u00f3rz dwie tabele (w bazie danych):\n<ul class=\"wp-block-list\">\n<li>tabela wej\u015bciowa: [Jira_tickets_input]\n<ul class=\"wp-block-list\">\n<li>Kolumna JIRA_TASK typu varchar<\/li>\n\n\n\n<li><span style=\"color: initial;\">Dane s\u0105 w postaci: <\/span>https:\/\/jira.domain.com\/rest\/api\/2\/issue\/XYZ-321<br><span style=\"color: initial;\">Poprawno\u015b\u0107 URL mo\u017cna przetestowa\u0107 w przegl\u0105darce internetowej.<\/span><\/li>\n\n\n\n<li>Komendy insert SQL dla wielu wierszy mo\u017cna zbudowa\u0107 przy pomocy Excela albo Copilota i innych.<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li>tabela wyj\u015bciowa: [Jira_tickets_output]\n<ul class=\"wp-block-list\">\n<li>kolumny odpowiednie dla zestawu danych pobranego z API. W naszym uproszczonym przypadku (bez zmiany nazw kolumn) jako varchar:\n<ul class=\"wp-block-list\">\n<li>key<\/li>\n\n\n\n<li>fields.summary<\/li>\n\n\n\n<li>fields.status.name<\/li>\n\n\n\n<li>fields.assignee.displayName<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li>Skonfiguruj komponent [Truncate Table]:\n<ul class=\"wp-block-list\">\n<li>Target Table \u2013&gt; Jira_tickets_output (za kazdym uruchomieniem chcemy mie\u0107 pust\u0105 tabel\u0119 wyj\u015bciow\u0105)<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li>Skonfiguruj komponent [Table iterator]:\n<ul class=\"wp-block-list\">\n<li>Target Table \u2013&gt; Jira_tickets_input<\/li>\n\n\n\n<li>Column Mapping -&gt; JIRA_TASK, jv_jira_task<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li>Skonfiguruj komponent [API Query]\n<ul class=\"wp-block-list\">\n<li>Authentication Method -&gt; Bearer Token<\/li>\n\n\n\n<li>Bearer Token -&gt; &nbsp;{API Token z kroku 1.}\n<ul class=\"wp-block-list\">\n<li>Bearer Token najlepiej przechowywa\u0107 w \u201ePassword Manager\u201d<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li>Connection Options -&gt; wybierz parametr URI (b\u0119dzie przekazywany do Query Profile), kt\u00f3remu przypisz warto\u015b\u0107: ${jv_jira_task}<\/li>\n\n\n\n<li>Profile -&gt; API_Jira<\/li>\n\n\n\n<li>Data Source -&gt; jira_tickets_enpoint<\/li>\n\n\n\n<li>Data Selection -&gt;wybierz wszystkie pola, czyli: key, fields.summary, fields.status.name, fields.assignee.displayName<\/li>\n\n\n\n<li>Target Table -&gt; Jira_tickets<\/li>\n\n\n\n<li>Load Options -&gt; On, Off, Off, On, Gzip (nie chcemy robi\u0107 \u201erecreate table\u201d za ka\u017cdym razem)<\/li>\n\n\n\n<li>Je\u015bli chcesz mie\u0107 dok\u0142adniejsze informacje o procesie po\u0142\u0105czenia z API i ewentualnych b\u0142\u0119dach, ustaw Auto Debug -&gt; On oraz Debug Level -&gt; 5. Po testach, mo\u017cna ustawic Auto Debug -&gt; Off<\/li>\n<\/ul>\n<\/li>\n<\/ol>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>Rezultat<\/strong><\/h3>\n\n\n\n<figure class=\"wp-block-image aligncenter size-full\"><img decoding=\"async\" width=\"381\" height=\"146\" src=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2025\/10\/image2.png\" alt=\"Wynik \" class=\"wp-image-32338\" srcset=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2025\/10\/image2.png 381w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2025\/10\/image2-300x115.png 300w\" sizes=\"(max-width: 381px) 100vw, 381px\" \/><figcaption class=\"wp-element-caption\">Ryc. 2 Wynik<\/figcaption><\/figure>\n\n\n\n<p>Po uruchomieniu, w tabeli Jira_tickets_output powinny znale\u017a\u0107 si\u0119 wszystkie wiersze z tabeli Jira_tickets_input z dodatkowymi informacjami takimi jak:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>numer,<\/li>\n\n\n\n<li>nazwa,<\/li>\n\n\n\n<li>status,<\/li>\n\n\n\n<li>przypisana osoba.<\/li>\n<\/ul>\n\n\n\n<p>Dla por\u00f3wnania, skrypt Python z bibliotek\u0105 request, r\u00f3wnie\u017c z wykorzystaniem komponentu [Table Iterator], m\u00f3g\u0142by wygl\u0105da\u0107 mniej wi\u0119cej tak:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: python; title: ; notranslate\" title=\"\">\nimport requests\nissue_key = jv_jira_task \nbase_url = &quot;https:\/\/jira.domain.com&quot;\nendpoint = f&quot;{base_url}\/rest\/api\/2\/issue\/{issue_key}&quot;\nheaders = {\n    &quot;Authorization&quot;: &quot;Bearer API_TOKEN&quot;,\n    &quot;Accept&quot;: &quot;application\/json&quot;\n}\nresponse = requests.get(endpoint, headers=headers)\nif response.status_code == 200:\n    data = response.json()\n    issue_data = {\n        &quot;key&quot;: data&#x5B;&quot;key&quot;],\n        &quot;summary&quot;: data&#x5B;&quot;fields&quot;]&#x5B;&quot;summary&quot;],\n        &quot;status&quot;: data&#x5B;&quot;fields&quot;]&#x5B;&quot;status&quot;]&#x5B;&quot;name&quot;],\n        &quot;assignee&quot;: data&#x5B;&quot;fields&quot;]&#x5B;&quot;assignee&quot;]&#x5B;&quot;displayName&quot;] if data&#x5B;&quot;fields&quot;]&#x5B;&quot;assignee&quot;] else &quot;Nieprzypisane&quot;\n    }\n    print(&quot;Dane zadania Jira:&quot;)\n    for k, v in issue_data.items():\n        print(f&quot;{k}: {v}&quot;)\nelse:\n    print(f&quot;B\u0142\u0105d: {response.status_code} - {response.text}&quot;)\n<\/pre><\/div>\n\n\n<figure class=\"wp-block-image aligncenter size-full\"><a href=\"https:\/\/sii.pl\/oferty-pracy\/\" target=\"_blank\" rel=\"noreferrer noopener\"><img decoding=\"async\" width=\"737\" height=\"170\" src=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2025\/10\/praca-m.jpg\" alt=\"oferty pracy\" class=\"wp-image-32340\" srcset=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2025\/10\/praca-m.jpg 737w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2025\/10\/praca-m-300x69.jpg 300w\" sizes=\"(max-width: 737px) 100vw, 737px\" \/><\/a><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Podsumowanie<\/strong><\/h2>\n\n\n\n<p>W artykule przedstawi\u0142em, jak wykorzysta\u0107 komponent&nbsp;<strong>API Query<\/strong>&nbsp;w Matillion do integracji z&nbsp;<strong>Jira API<\/strong>, pokazuj\u0105c krok po kroku, w jaki spos\u00f3b pobra\u0107 dane o zadaniach \u2013 ich numer, nazw\u0119, status oraz przypisan\u0105 osob\u0119.<\/p>\n\n\n\n<p><strong>API Query<\/strong>&nbsp;okaza\u0142 si\u0119 narz\u0119dziem:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>\u0142atwym w konfiguracji<\/strong>, dzi\u0119ki graficznemu interfejsowi,<\/li>\n\n\n\n<li><strong>skutecznym<\/strong>&nbsp;w pobieraniu danych opartych na JSON z API,<\/li>\n\n\n\n<li><strong>z dobrze zintegrowanym<\/strong> przep\u0142ywami ETL w Matillion.<\/li>\n<\/ul>\n\n\n\n<p>Dzi\u0119ki zastosowaniu profilu API i komponentu API Query mo\u017cliwa jest szybka automatyzacja pobierania danych projektowych z Jira, bez konieczno\u015bci pisania kodu. To <strong>rozwi\u0105zanie sprawdza si\u0119 szczeg\u00f3lnie dobrze<\/strong> w przypadku standardowych zapyta\u0144, gdzie <strong>liczy si\u0119 prostota i szybko\u015b\u0107 wdro\u017cenia.<\/strong><\/p>\n\n\n\n<p>Dla bardziej z\u0142o\u017conych scenariuszy, np. dynamicznych zapyta\u0144, niestandardowej paginacji czy zaawansowanej obs\u0142ugi b\u0142\u0119d\u00f3w, <strong>warto rozwa\u017cy\u0107 u\u017cycie komponentu<\/strong>&nbsp;<strong>Python Script<\/strong>&nbsp;z bibliotek\u0105&nbsp;requests.<\/p>\n\n\n\n<p>Integracja Matillion z Jira to \u015bwietny przyk\u0142ad, <strong>jak po\u0142\u0105czy\u0107 \u015bwiat zarz\u0105dzania projektami z analiz\u0105 danych,<\/strong> umo\u017cliwiaj\u0105c tworzenie raport\u00f3w, dashboard\u00f3w i automatycznych alert\u00f3w w oparciu o dane z codziennej pracy zespo\u0142\u00f3w.<\/p>\n\n\n<div class=\"kk-star-ratings kksr-auto kksr-align-left kksr-valign-bottom\"\n    data-payload='{&quot;align&quot;:&quot;left&quot;,&quot;id&quot;:&quot;32332&quot;,&quot;slug&quot;:&quot;default&quot;,&quot;valign&quot;:&quot;bottom&quot;,&quot;ignore&quot;:&quot;&quot;,&quot;reference&quot;:&quot;auto&quot;,&quot;class&quot;:&quot;&quot;,&quot;count&quot;:&quot;2&quot;,&quot;legendonly&quot;:&quot;&quot;,&quot;readonly&quot;:&quot;&quot;,&quot;score&quot;:&quot;5&quot;,&quot;starsonly&quot;:&quot;&quot;,&quot;best&quot;:&quot;5&quot;,&quot;gap&quot;:&quot;11&quot;,&quot;greet&quot;:&quot;&quot;,&quot;legend&quot;:&quot;5\\\/5 ( votes: 2)&quot;,&quot;size&quot;:&quot;18&quot;,&quot;title&quot;:&quot;Matillion API Query na przyk\u0142adzie Jira API&quot;,&quot;width&quot;:&quot;139.5&quot;,&quot;_legend&quot;:&quot;{score}\\\/{best} ( {votes}: {count})&quot;,&quot;font_factor&quot;:&quot;1.25&quot;}'>\n            \n<div class=\"kksr-stars\">\n    \n<div class=\"kksr-stars-inactive\">\n            <div class=\"kksr-star\" data-star=\"1\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" data-star=\"2\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" data-star=\"3\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" data-star=\"4\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" data-star=\"5\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n    <\/div>\n    \n<div class=\"kksr-stars-active\" style=\"width: 139.5px;\">\n            <div class=\"kksr-star\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n    <\/div>\n<\/div>\n                \n\n<div class=\"kksr-legend\" style=\"font-size: 14.4px;\">\n            5\/5 ( votes: 2)    <\/div>\n    <\/div>\n","protected":false},"excerpt":{"rendered":"<p>Integracja r\u00f3\u017cnych \u017ar\u00f3de\u0142 informacji jest kluczowa dla efektywnego zarz\u0105dzania i analizy danych. Jednym z narz\u0119dzi, kt\u00f3re znacz\u0105co u\u0142atwia ten proces, &hellip; <a class=\"continued-btn\" href=\"https:\/\/sii.pl\/blog\/matillion-api-query-na-przykladzie-jira-api\/\">Continued<\/a><\/p>\n","protected":false},"author":747,"featured_media":32343,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"_editorskit_title_hidden":false,"_editorskit_reading_time":0,"_editorskit_is_block_options_detached":false,"_editorskit_block_options_position":"{}","inline_featured_image":false,"footnotes":""},"categories":[1314],"tags":[2794,1546,1026,1284,584],"class_list":["post-32332","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-development-na-twardo","tag-da","tag-przeglad-narzedzi","tag-api","tag-json","tag-python"],"acf":[],"aioseo_notices":[],"republish_history":[],"featured_media_url":"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2025\/10\/Computer-3.jpg","category_names":["Development na twardo"],"_links":{"self":[{"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/posts\/32332"}],"collection":[{"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/users\/747"}],"replies":[{"embeddable":true,"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/comments?post=32332"}],"version-history":[{"count":3,"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/posts\/32332\/revisions"}],"predecessor-version":[{"id":32359,"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/posts\/32332\/revisions\/32359"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/media\/32343"}],"wp:attachment":[{"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/media?parent=32332"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/categories?post=32332"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/tags?post=32332"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}