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 / 35Motivation
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 / 35Motivation
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 / 35PostgreSQL
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 / 35PostgreSQL
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 / 35PostgreSQL
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 / 35Warum 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 / 35Warum 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 / 35Warum 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 / 35Unterstü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 / 35Beispieldaten
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 / 35Eingebauter 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 / 35Diskussion
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 / 35Diskussion
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 / 35Diskussion
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 / 35Scripting 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 / 35Scripting 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 / 35Anwendung 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 / 35Beispiele 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 / 35Weiterverarbeitung 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 / 35JSON-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 / 35Zusammenfassung: 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 / 35Zusammenfassung: 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 / 35Foreign Data Wrappers
I SQL-Standard “Management of External Data”
I PostgreSQL führend
Balázs Bárány Linuxwochen Wien 2019 17 / 35Foreign 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 / 35Foreign 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 / 35postgres 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 / 35mysql 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 / 35NoSQL 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 / 35Protokolle 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 / 35Gesamten 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 / 35Anmerkungen 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 / 35Anmerkungen
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 / 35Anmerkungen
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 / 35Nutzung von APIs
I Mögliche Anwendungen
I Datenimport periodisch, on demand, live
Balázs Bárány Linuxwochen Wien 2019 26 / 35Nutzung 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 / 35Nutzung 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 / 35Die 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 / 35Die 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 / 35Die 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 / 35Vorgehensweise - 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 / 35Vorgehensweise - 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 / 35Lesezugriff ü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 / 35Filterkriterien
$ 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 / 35Ausgabe 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 / 35Hinweise 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 / 35Hinweise
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 / 35Tutorial 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 / 35DELETE
# 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 / 35Fertig!
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 / 35Sie können auch lesen