PostgreSQL ist meine Entwicklungsumgebung - Linuxwochen
←
→
Transkription von Seiteninhalten
Wenn Ihr Browser die Seite nicht korrekt rendert, bitte, lesen Sie den Inhalt der Seite unten
Überblick I Motivation I PostgreSQL I Erweiterungen I Foreign Data Wrappers I API-Nutzung I APIs konsumieren I APIs anbieten Balázs Bárány Linuxwochen Wien 2019 1 / 35
Motivation I Data Scientist I Kein Entwickler (ist lange her. . . ) I Beratung für Datenanalyse, Vorhersagen, Datenbanken, . . . I Mitbegründer des Motorroller-Sharings SCO2T (jetzt mo2drive) Balázs Bárány Linuxwochen Wien 2019 2 / 35
Motivation I Data Scientist I Kein Entwickler (ist lange her. . . ) I Beratung für Datenanalyse, Vorhersagen, Datenbanken, . . . I Mitbegründer des Motorroller-Sharings SCO2T (jetzt mo2drive) I Werkzeuge und Arbeitsmittel I Datenbanken, z. B. PostgreSQL I Andere Datensammlungen, Dateien, . . . I Datenintegrationswerkzeuge, z. B. Pentaho Data Integration I Data-Mining-Werkzeuge, z. B. RapidMiner I Scripting: Shell, R, jq, . . . I Web-APIs I Open Data Balázs Bárány Linuxwochen Wien 2019 2 / 35
“Entwicklungs”aufgaben I Datenintegration I Import aus Dateien I Andere Datenbanken I Externe Systeme: CRM, . . . I Open Data I Web-APIs Balázs Bárány Linuxwochen Wien 2019 3 / 35
“Entwicklungs”aufgaben I Datenintegration I Import aus Dateien I Andere Datenbanken I Externe Systeme: CRM, . . . I Open Data I Web-APIs I Alternative Werkzeuge I Grafische Datenintegrationswerkzeuge I Befehlszeilen-Werkzeuge I (Scripting) Balázs Bárány Linuxwochen Wien 2019 3 / 35
PostgreSQL I Führende Open-Source-Datenbank I In Features, Standardkonformität, Dokumentation, . . . I (noch) nicht in der Verbreitung Balázs Bárány Linuxwochen Wien 2019 4 / 35
PostgreSQL I Führende Open-Source-Datenbank I In Features, Standardkonformität, Dokumentation, . . . I (noch) nicht in der Verbreitung I Offen für Erweiterungen I Skriptsprachen I Funktionserweiterungen I Foreign Data Wrappers Balázs Bárány Linuxwochen Wien 2019 4 / 35
PostgreSQL I Führende Open-Source-Datenbank I In Features, Standardkonformität, Dokumentation, . . . I (noch) nicht in der Verbreitung I Offen für Erweiterungen I Skriptsprachen I Funktionserweiterungen I Foreign Data Wrappers I Großartige Community Balázs Bárány Linuxwochen Wien 2019 4 / 35
Warum in der Datenbank? I SQL I Deklarativ - kein Debuggen I Sehr mächtig I Stabil, zuverlässig Balázs Bárány Linuxwochen Wien 2019 5 / 35
Warum in der Datenbank? I SQL I Deklarativ - kein Debuggen I Sehr mächtig I Stabil, zuverlässig I Die Daten sind schon da! I Warum anderswo verarbeiten? Balázs Bárány Linuxwochen Wien 2019 5 / 35
Warum in der Datenbank? I SQL I Deklarativ - kein Debuggen I Sehr mächtig I Stabil, zuverlässig I Die Daten sind schon da! I Warum anderswo verarbeiten? I Nutze, was für dich am besten funktioniert! Balázs Bárány Linuxwochen Wien 2019 5 / 35
Unterstützung für Skriptsprachen in PostgreSQL I Eingebaut: PL/SQL, PL/PgSQL I Sehr SQL-lastig, prozedural I Verfügbar I PL/Perl I PL/Python I PL/R I Java, Shellscript, . . . Balázs Bárány Linuxwochen Wien 2019 6 / 35
Beispieldaten I Bezirksgrenzen von OGD Wien https://data.gv.at/katalog/dataset/2ee6b8bf-6292-413c-bb8b-bd22dbb2ad4b -- Erst die Tabelle mit dem Format der Daten anlegen CREATE TABLE opendata.wien_bezirke ( "FID" text, "SHAPE" text, ... ) Balázs Bárány Linuxwochen Wien 2019 7 / 35
Eingebauter CSV-Import I Direkt aus CSV importieren copy opendata.wien_bezirke from ’/tmp/BEZIRKSGRENZEOGD.csv’ with (FORMAT CSV, HEADER); -- Ohne zwischendurch herunterzuladen copy opendata.wien_bezirke from program ’curl -s ’’https://data.wien.gv.at/daten/geo?...=csv’’’ with (FORMAT CSV, HEADER); Balázs Bárány Linuxwochen Wien 2019 8 / 35
Diskussion I CSV-Import und Export I Verschiedene Formate (Trennzeichen, Quoting, Encoding, . . . ) I Nur ganze Tabelle, muß schon angelegt sein I Nur Superuser oder speziell privilegiert Balázs Bárány Linuxwochen Wien 2019 9 / 35
Diskussion I CSV-Import und Export I Verschiedene Formate (Trennzeichen, Quoting, Encoding, . . . ) I Nur ganze Tabelle, muß schon angelegt sein I Nur Superuser oder speziell privilegiert I Sicherheitsaspekte I Diskussion im April 2019, CVE-2019-9193 I “Datenbankbenutzer kann beliebige Programme am Server ausführen!” Balázs Bárány Linuxwochen Wien 2019 9 / 35
Diskussion I CSV-Import und Export I Verschiedene Formate (Trennzeichen, Quoting, Encoding, . . . ) I Nur ganze Tabelle, muß schon angelegt sein I Nur Superuser oder speziell privilegiert I Sicherheitsaspekte I Diskussion im April 2019, CVE-2019-9193 I “Datenbankbenutzer kann beliebige Programme am Server ausführen!” I Statement vom Projekt: Keine Sicherheitslücke Balázs Bárány Linuxwochen Wien 2019 9 / 35
Diskussion I CSV-Import und Export I Verschiedene Formate (Trennzeichen, Quoting, Encoding, . . . ) I Nur ganze Tabelle, muß schon angelegt sein I Nur Superuser oder speziell privilegiert I Sicherheitsaspekte I Diskussion im April 2019, CVE-2019-9193 I “Datenbankbenutzer kann beliebige Programme am Server ausführen!” I Statement vom Projekt: Keine Sicherheitslücke I Aufpassen, wer was darf! I Nicht alle User als Superuser I Hausverstand Balázs Bárány Linuxwochen Wien 2019 9 / 35
Scripting ohne “Programmierung” I Verwendung von High-Level-Funktionen aus Scripting-Sprachen I keine oder wenig Programmlogik Balázs Bárány Linuxwochen Wien 2019 10 / 35
Scripting ohne “Programmierung” I Verwendung von High-Level-Funktionen aus Scripting-Sprachen I keine oder wenig Programmlogik -- Die Skriptsprache PL/R laden CREATE EXTENSION plr; -- Funktion zum Laden der Bezirke-CSV erstellen create or replace function r_bezirke (text) returns setof opendata.wien_bezirke as $func$ return(read.csv(arg1)) $func$ language ’plr’ volatile; Balázs Bárány Linuxwochen Wien 2019 10 / 35
Anwendung für Datenimport -- flexiblere Abfragen möglich select * from r_bezirke(’/tmp/BEZIRKSGRENZEOGD.csv’) where "BEZNR" < 20 order by "FLAECHE" DESC; -- paßt, in die Tabelle einfügen insert into opendata.wien_bezirke select * from r_bezirke(’/tmp/BEZIRKSGRENZEOGD.csv’); Balázs Bárány Linuxwochen Wien 2019 11 / 35
Anwendung für Datenimport -- flexiblere Abfragen möglich select * from r_bezirke(’/tmp/BEZIRKSGRENZEOGD.csv’) where "BEZNR" < 20 order by "FLAECHE" DESC; -- paßt, in die Tabelle einfügen insert into opendata.wien_bezirke select * from r_bezirke(’/tmp/BEZIRKSGRENZEOGD.csv’); -- Wozu herunterladen? R kann URLs direkt verarbeiten. insert into opendata.wien_bezirke select * from r_bezirke(’https://data.wien.gv.at/...csv’); Balázs Bárány Linuxwochen Wien 2019 11 / 35
Interessante Erweiterungen I Skriptsprachen sind noch zu schwierig? I PGXN - PostgreSQL extension network I pgFoundry - Hosting für Postgres-bezogene Projekte I Beispiele I PostGIS – Alles für Geometrie und Geodaten I pgsql http – HTTP-Client I PostPic – Bildverarbeitung Balázs Bárány Linuxwochen Wien 2019 12 / 35
Beispiele mit pgsql http -- HTTP-Extension: https://github.com/pramsey/pgsql-http create extension http; -- Holen wir jetzt das GeoJSON-Dokument! select content from http_get(’https://data.wien.gv.at/daten/geo?...&outputFormat=json’) [content] {"type":"FeatureCollection","totalFeatures":23,"features":[...} Balázs Bárány Linuxwochen Wien 2019 13 / 35
Weiterverarbeitung des JSON-Dokuments select jsonb_array_elements(content::jsonb->’features’) as features from http_get(’https://data.wien.gv.at/daten/geo?...&outputFormat=json’) [features] {"id": "BEZIRKSGRENZEOGD.9290", "type": "Feature", "geometry": ... {"id": "BEZIRKSGRENZEOGD.9291", "type": "Feature", "geometry": ... ... Balázs Bárány Linuxwochen Wien 2019 14 / 35
JSON-Dokumente in Spalten zerlegen with features as ( select jsonb_array_elements(content::jsonb->’features’) as features from http_get(’https://data.wien.gv.at/daten/geo?...&outputFormat=json’) ) select cast(features->’properties’->>’BEZNR’ as integer) as beznr, features->’properties’->>’NAMEK’ as bezname, cast(features->’properties’->>’FLAECHE’ as numeric) as flaeche from features order by flaeche desc beznr bezname flaeche 22 Donaustadt 102299479.9377 21 Floridsdorf 44443232.9003 13 Hietzing 37714761.1255 Balázs Bárány Linuxwochen Wien 2019 15 / 35
Zusammenfassung: Erweiterungen I Neue Funktionalität in der Datenbank I Mit SQL-Syntax anwendbar I Volle PostgreSQL-Funktionalität I JSON-Verarbeitung I Window Functions I Trigger interagiert mit externen Daten Balázs Bárány Linuxwochen Wien 2019 16 / 35
Zusammenfassung: Erweiterungen I Neue Funktionalität in der Datenbank I Mit SQL-Syntax anwendbar I Volle PostgreSQL-Funktionalität I JSON-Verarbeitung I Window Functions I Trigger interagiert mit externen Daten I Komplexität, größere Angriffsfläche I Autor über pgsql http: “Footgun” I Mit Ziel und Maß einsetzen! I Evt. Verwendung durch nichtprivilegierte User einschränken Balázs Bárány Linuxwochen Wien 2019 16 / 35
Foreign Data Wrappers I SQL-Standard “Management of External Data” I PostgreSQL führend Balázs Bárány Linuxwochen Wien 2019 17 / 35
Foreign Data Wrappers I SQL-Standard “Management of External Data” I PostgreSQL führend I Zugriff auf andere Datenbanken I Relational I NoSQL I Hadoop Balázs Bárány Linuxwochen Wien 2019 17 / 35
Foreign Data Wrappers I SQL-Standard “Management of External Data” I PostgreSQL führend I Zugriff auf andere Datenbanken I Relational I NoSQL I Hadoop I Spezielle Dateiformate I Cloud-Anwendungen Balázs Bárány Linuxwochen Wien 2019 17 / 35
postgres fdw I Mitgelieferte Extension I Zugriff auf andere PostgreSQL-Datenbanken I Geografische Verteilung I Optimierung für Einsatzbereiche I Skalierung I Archivdatenbank I Datenintegration I ... create extension postgres_fdw; Balázs Bárány Linuxwochen Wien 2019 18 / 35
mysql fdw, oracle fdw, tds fdw (MSSQL), . . . I Zugriff auf andere Datenbanken I Lesend und schreibend I Unterschiedlicher Grad an Optimierung I Filter pushdown I Join pushdown I Datensynchronisierung mit Triggern I Aggregierung von Daten aus verschiedenen Quellen I Multicorn: Python-basierter “allgemeiner” FDW Balázs Bárány Linuxwochen Wien 2019 19 / 35
NoSQL und Hadoop I ElasticSearch I Hive, Impala I BigQuery I MongoDB, CouchDB I Neo4J I ... Balázs Bárány Linuxwochen Wien 2019 20 / 35
NoSQL und Hadoop I ElasticSearch I Hive, Impala I BigQuery I MongoDB, CouchDB I Neo4J I ... I Richtige Abfragesprache statt proprietär/eingeschränkt I Auslagerung großer Datenmengen I Integration mit Standard-Tools I Berichtstools, OLAP Balázs Bárány Linuxwochen Wien 2019 20 / 35
Protokolle und Webanwendungen I LDAP, IMAP, RSS, . . . I git, Telegram I geofdw: Geocoding und Reverse Geocoding I Twitter I Facebook I Google I Mailchimp I ... Balázs Bárány Linuxwochen Wien 2019 21 / 35
Dateiformate I CSV I gzipped CSV I zip, tar I Dateisystem/Metadaten Balázs Bárány Linuxwochen Wien 2019 22 / 35
Dateiformate I CSV I gzipped CSV I zip, tar I Dateisystem/Metadaten I GDAL/OGR: allgemein verwendbares Geo-Konvertierprogramm I ODBC, andere Datenbanken I Shapefile, OpenStreetMap, . . . I Excel und LibreOffice I Geo-Webdienste I Read/Write: Datenexport in verschiedene Formate Balázs Bárány Linuxwochen Wien 2019 22 / 35
Gesamten Open-Data-Server “importieren” CREATE SERVER ogd_wien_srv FOREIGN DATA WRAPPER ogr_fdw OPTIONS ( datasource ’WFS:https://data.wien.gv.at/daten/geo?service=WFS&request=GetFea format ’WFS’ ); create schema ogd_wien; import foreign schema ogr_all from server ogd_wien_srv into ogd_wien; NOTICE: Number of tables to be created 238 IMPORT FOREIGN SCHEMA Balázs Bárány Linuxwochen Wien 2019 23 / 35
Ergebnis Abbildung: Abfrage der Foreign-Tabelle (Daten: OpenStreetMap, OGD Wien) Balázs Bárány Linuxwochen Wien 2019 24 / 35
Anmerkungen I Metadaten wurden automatisch abgefragt Balázs Bárány Linuxwochen Wien 2019 25 / 35
Anmerkungen I Metadaten wurden automatisch abgefragt I Foreign-Tabellen sind Verknüpfungen I Daten nicht statisch kopiert I Jedes SELECT holt die aktuellen Daten vom Server Balázs Bárány Linuxwochen Wien 2019 25 / 35
Anmerkungen I Metadaten wurden automatisch abgefragt I Foreign-Tabellen sind Verknüpfungen I Daten nicht statisch kopiert I Jedes SELECT holt die aktuellen Daten vom Server I Wie Tabellen verwendbar -- Foreign Tables direkt joinen select bez.namek as bezirk, kh.bezeichnung as krankenhaus from ogd_wien.ogdwien_bezirksgrenzeogd bez inner join ogd_wien.ogdwien_krankenhausogd kh on kh.bezirk = bez.beznr; Balázs Bárány Linuxwochen Wien 2019 25 / 35
Anmerkungen I Metadaten wurden automatisch abgefragt I Foreign-Tabellen sind Verknüpfungen I Daten nicht statisch kopiert I Jedes SELECT holt die aktuellen Daten vom Server I Wie Tabellen verwendbar -- Foreign Tables direkt joinen select bez.namek as bezirk, kh.bezeichnung as krankenhaus from ogd_wien.ogdwien_bezirksgrenzeogd bez inner join ogd_wien.ogdwien_krankenhausogd kh on kh.bezirk = bez.beznr; I Nochmal IMPORT FOREIGN SCHEMA, um neue Datenquellen zu holen Balázs Bárány Linuxwochen Wien 2019 25 / 35
Nutzung von APIs I Mögliche Anwendungen I Datenimport periodisch, on demand, live Balázs Bárány Linuxwochen Wien 2019 26 / 35
Nutzung von APIs I Mögliche Anwendungen I Datenimport periodisch, on demand, live I Aktionen mit Triggern auslösen I Rechnung erstellt => Zahlungsprozess starten I Datenanreicherung nach Datensatzänderung I Geokodierung, Währungsumrechnung, . . . Balázs Bárány Linuxwochen Wien 2019 26 / 35
Nutzung von APIs I Mögliche Anwendungen I Datenimport periodisch, on demand, live I Aktionen mit Triggern auslösen I Rechnung erstellt => Zahlungsprozess starten I Datenanreicherung nach Datensatzänderung I Geokodierung, Währungsumrechnung, . . . I Export in fremde Anwendung mit API I Newsletter-Anbieter, Webshop, . . . Balázs Bárány Linuxwochen Wien 2019 26 / 35
Die Datenbank als API anbieten PostgREST I Exportiert ein Schema einer Datenbank als API I Generiert Endpunkte automatisch Balázs Bárány Linuxwochen Wien 2019 27 / 35
Die Datenbank als API anbieten PostgREST I Exportiert ein Schema einer Datenbank als API I Generiert Endpunkte automatisch I Nutzt Datenbank-Zugriffsrechte I Keine doppelte Arbeit I Rechte an einer Stelle definiert Balázs Bárány Linuxwochen Wien 2019 27 / 35
Die Datenbank als API anbieten PostgREST I Exportiert ein Schema einer Datenbank als API I Generiert Endpunkte automatisch I Nutzt Datenbank-Zugriffsrechte I Keine doppelte Arbeit I Rechte an einer Stelle definiert I Lese- und auf Wunsch auch Schreibzugriff I Stored Procedures als Endpunkt definierbar Balázs Bárány Linuxwochen Wien 2019 27 / 35
Die Datenbank als API anbieten PostgREST I Exportiert ein Schema einer Datenbank als API I Generiert Endpunkte automatisch I Nutzt Datenbank-Zugriffsrechte I Keine doppelte Arbeit I Rechte an einer Stelle definiert I Lese- und auf Wunsch auch Schreibzugriff I Stored Procedures als Endpunkt definierbar I Wie SQL: deklarativ statt programmiert Balázs Bárány Linuxwochen Wien 2019 27 / 35
Vorgehensweise - Lesbare API I Schema api anlegen (Name beliebig) I Rolle api anon anlegen (Name beliebig) Balázs Bárány Linuxwochen Wien 2019 28 / 35
Vorgehensweise - Lesbare API I Schema api anlegen (Name beliebig) I Rolle api anon anlegen (Name beliebig) I USAGE-Rechte am Schema vergeben I Alle anderen Rechte widerrufen Balázs Bárány Linuxwochen Wien 2019 28 / 35
Vorgehensweise - Lesbare API I Schema api anlegen (Name beliebig) I Rolle api anon anlegen (Name beliebig) I USAGE-Rechte am Schema vergeben I Alle anderen Rechte widerrufen I Views anlegen, die als lesbare API-Endpunkte dienen sollen I Leserecht für api anon an der View Balázs Bárány Linuxwochen Wien 2019 28 / 35
Lesezugriff über die API $ curl http://localhost:3000/bezirk | jq . [ { "FID": "BEZIRKSGRENZEOGD.9290", ... "SE_ANNO_CAD_DATA": null } ] $ curl ’http://localhost:3000/bezirk?select=BEZNR,NAMEK&order=BEZNR’ [{"BEZNR":1,"NAMEK":"Innere Stadt"}, {"BEZNR":2,"NAMEK":"Leopoldstadt"}, ...] Balázs Bárány Linuxwochen Wien 2019 29 / 35
Filterkriterien $ curl ’http://localhost:3000/bezirk? select=BEZNR,NAMEK,FLAECHE&order=FLAECHE.desc&FLAECHE=gt.10000000’ [{"BEZNR":22,"NAMEK":"Donaustadt","FLAECHE":102299479.94}, {"BEZNR":21,"NAMEK":"Floridsdorf","FLAECHE":44443232.90}, {"BEZNR":13,"NAMEK":"Hietzing","FLAECHE":37714761.13}, ...] Balázs Bárány Linuxwochen Wien 2019 30 / 35
Ausgabe anpassen # CSV-Output $ curl --header ’Accept: text/csv’ \ ’http://localhost:3000/bezirk?select=BEZNR,NAMEK,FLAECHE&order=BEZNR’ BEZNR,NAMEK,FLAECHE 1,"Innere Stadt",2868773.82 2,Leopoldstadt,19241995.82 ... # Nur die ersten drei Zeilen $ curl --header ’Accept: text/csv’ \ ’http://localhost:3000/bezirk?select=NAMEK&order=BEZNR&limit=3’ \ | wc -l 3 Balázs Bárány Linuxwochen Wien 2019 31 / 35
Hinweise I Syntax nicht sehr API-like I Auflistung der Objekte Balázs Bárány Linuxwochen Wien 2019 32 / 35
Hinweise I Syntax nicht sehr API-like I Auflistung der Objekte I Empfehlung: Apache mit HTTPS, mod proxy / mod rewrite I Auch für die Sicherheit besser I PostgREST und Datenbank hinter Firewall I Einschränkung von Abfragen (z. B. Abfrage nur mit id=) Balázs Bárány Linuxwochen Wien 2019 32 / 35
Hinweise I Syntax nicht sehr API-like I Auflistung der Objekte I Empfehlung: Apache mit HTTPS, mod proxy / mod rewrite I Auch für die Sicherheit besser I PostgREST und Datenbank hinter Firewall I Einschränkung von Abfragen (z. B. Abfrage nur mit id=) ProxyPass "/api/" "http://db:3000/" ProxyPassReverse /api/ http://db:3000/ # URLs der Form /api/bezirk/1 zur PostgREST-Syntax umschreiben RewriteRule "/api/bezirk/([0-9]+)$" "http://db:3000/bezirk?BEZNR=eq.$1" [P] Balázs Bárány Linuxwochen Wien 2019 32 / 35
Tutorial für Schreiben Siehe https://postgrest.org/en/v5.2/tutorials/tut1.html # INSERT curl http://localhost:3000/todos -X POST \ -H "Content-Type: application/json" \ -d ’{"task": "learn how to write"}’ # UPDATE auf einen Datensatz curl http://localhost:3000/todos?task=eq.finish+tutorial+0 \ -X PATCH \ -H "Content-Type: application/json" \ -d ’{"done": true}’ Balázs Bárány Linuxwochen Wien 2019 33 / 35
DELETE # Noch kein DELETE-Recht auf die Tabelle für api_anon $ curl http://localhost:3000/todos?task=eq.finish+tutorial+0 \ -X DELETE {"hint":null,"details":null,"code":"42501", "message":"permission denied for table todos"} # GRANT DELETE ON api.todos TO api_anon; $ curl http://localhost:3000/todos?task=eq.finish+tutorial+0 -X DELETE $ curl http://localhost:3000/todos [{"id":2,"done":false,"task":"pat self on back","due":null}, {"id":3,"done":false,"task":"learn how to write","due":null}] Balázs Bárány Linuxwochen Wien 2019 34 / 35
Fertig! I Quellen I PostgreSQL-Dokumentation https://postgresql.org/docs/11/ I Modern SQL https://modern-sql.com/ I Kontakt I Balázs Bárány balazs@datascientist.at Fragen? Balázs Bárány Linuxwochen Wien 2019 35 / 35
Sie können auch lesen