<?xml version="1.0" encoding="utf-8"?>
<?xml-stylesheet type="text/xsl" href="../../assets/xml/rss.xsl" media="all"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Linuxkurs-Blog (Posts about PostgreSQL)</title><link>https://lannert.de/debloss/</link><description></description><atom:link href="https://lannert.de/debloss/en/categories/postgresql.xml" rel="self" type="application/rss+xml"></atom:link><language>en</language><copyright>Contents © 2024 &lt;a href="mailto:lannert@hhu.de"&gt;Detlef Lannert&lt;/a&gt; 
&lt;a rel="license" href="https://creativecommons.org/licenses/by-nc-sa/4.0/"&gt;
&lt;img alt="Creative Commons License BY-NC-SA"
style="border-width:0; margin-bottom:12px;"
src="https://i.creativecommons.org/l/by-nc-sa/4.0/88x31.png"&gt;&lt;/a&gt;</copyright><lastBuildDate>Wed, 14 Aug 2024 06:52:17 GMT</lastBuildDate><generator>Nikola (getnikola.com)</generator><docs>http://blogs.law.harvard.edu/tech/rss</docs><item><title>In Django mit Materialized Views arbeiten</title><link>https://lannert.de/debloss/en/posts/in-django-mit-materialized-views-arbeiten/</link><dc:creator>Detlef Lannert</dc:creator><description>&lt;p&gt;Auch in einer Django-Anwendung kann man mit PostgreSQLs Materialized Views arbeiten –
&lt;a class="reference external" href="https://pganalyze.com/blog/postgresql-views-django-python"&gt;dieser Artikel&lt;/a&gt; erklärt, was man wie
machen muss. Nämlich&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;ein passendes Model definieren, das unmanaged ist und den View als Table hat&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;den View innerhalb einer Migration erzeugen (&lt;code class="docutils literal"&gt;CREATE MATERIALIZED VIEW name AS …&lt;/code&gt;)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;den View gelegentlich (concurrently) refreshen (evtl. könnte man sich im Cache merken, ob er
aktuell ist, und per Signal diesen Merker löschen, wenn sich an den verwendeten Tabellen etwas
ändert, etwa durch Speichern oder Löschen von Objekten)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;beachten, dass der View eine „unique“ indizierbare Spalte hat (sonst geht concurrent refresh nicht)&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Abfragen solcher Views können wesentlich schneller sein als bei konventionellen Views, deren Daten
bei jedem Zugriff wieder „on the fly“ erstellt werden müssen.
Mehr dazu findet sich &lt;a class="reference external" href="https://www.postgresql.org/docs/current/rules-materializedviews.html"&gt;in der PostgreSQL-Doku&lt;/a&gt;.&lt;/p&gt;</description><guid>https://lannert.de/debloss/en/posts/in-django-mit-materialized-views-arbeiten/</guid><pubDate>Thu, 11 Jul 2024 08:00:00 GMT</pubDate></item><item><title>Tabellenübergreifende Constraints in Django realisieren</title><link>https://lannert.de/debloss/en/posts/tabellenubergreifende-constraints-in-django-realisieren/</link><dc:creator>Detlef Lannert</dc:creator><description>&lt;p&gt;Django-Datenbank-Constraints können keine Felder außerhalb der jeweiligen Tabelle referenzieren und
damit z. B. Foreign-Key-Beziehungen plausibilisieren.
Die &lt;a class="reference external" href="https://www.postgresql.org/docs/current/ddl-constraints.html"&gt;PostgreSQL-Doku&lt;/a&gt;
erklärt, was DB-seitig möglich ist und warum keine anderen Rows oder Tables angesprochen werden dürfen
(bzw. sollen). Um bestimmte übergreifende Restriktionen beim Einfügen einer Zeile abzuprüfen, sollten
demzufolge Trigger verwendet werden.&lt;/p&gt;
&lt;p&gt;&lt;a class="reference external" href="https://bsago.me/tech-notes/check-nested-relations-with-postgresql-triggers"&gt;Dieser Artikel&lt;/a&gt; gibt ein
schönes Beispiel für einen Trigger (in plpgsql), der Werte einer neu eingefügten Row gegen vorhandene
Einträge in anderen Tabellen prüft und ggf. ein Insert (oder auch ein Update) verhindert.&lt;/p&gt;
&lt;p&gt;Wie man den Trigger (und ähnliches) per Django-Migration in die Datenbank bekommt, wird in der
&lt;a class="reference external" href="https://stackoverflow.com/questions/68381971/how-to-use-postgresqls-stored-procedures-or-functions-in-django-project"&gt;Antwort auf diese Stackexchange-Frage&lt;/a&gt;
mit einem einfachen Beispiel erläutert.&lt;/p&gt;
&lt;p&gt;Allerdings muss man in den Views vorsichtig sein:
Wenn bei einem Insert oder Update über den Django-ORM so ein Trigger mit einer Exception zuschlägt,
bekommt man einen IntegrityError, der dann auch abgefangen werden sollte. Sonst kommt es zum Error500.
Die Ursache für den Error ist nicht so ganz einfach zu erkennen – deshalb sollte man durch
Vorababfragen die Situation möglichst vermeiden (und dann ordentlich anmeckern).&lt;/p&gt;
&lt;p&gt;Der Trigger ist dann trotzdem nicht überflüssig – er verhindert
vor allem, dass durch Umgehung der entsprechenden Views oder durch Race conditions die Prüfung
das Eintragen falscher Daten nicht wirksam verhindert.&lt;/p&gt;</description><guid>https://lannert.de/debloss/en/posts/tabellenubergreifende-constraints-in-django-realisieren/</guid><pubDate>Wed, 10 Jul 2024 14:18:16 GMT</pubDate></item><item><title>Verschachtelte Subqueries in Django</title><link>https://lannert.de/debloss/en/posts/verschachtelte-subqueries-in-django/</link><dc:creator>Detlef Lannert</dc:creator><description>&lt;p&gt;Mit &lt;a class="reference external" href="https://softwarecrafts.co.uk/100-words/day-119"&gt;verschachtelte Subqueries in Django&lt;/a&gt; lassen sich
(n*m+1)-Schleifen vermeiden.&lt;/p&gt;
&lt;p&gt;Besonders interessant in diesem Artikel:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;ArraySubquery (für PostgreSQL)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Annotation mit JSONObject (um die Ergebnisse der Subquery abzulegen)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;through.objects-Filter&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;OuterRef-Abfrage&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;</description><guid>https://lannert.de/debloss/en/posts/verschachtelte-subqueries-in-django/</guid><pubDate>Mon, 01 Jul 2024 07:50:00 GMT</pubDate></item><item><title>Django 5.1</title><link>https://lannert.de/debloss/en/posts/django-51/</link><dc:creator>Detlef Lannert</dc:creator><description>&lt;p&gt;&lt;a class="reference external" href="https://docs.djangoproject.com/en/dev/releases/5.1/"&gt;Django 5.1&lt;/a&gt; – was ist an Neuerungen zu beachten?&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Für PostgreSQL können in den Settings Connection pools eingestellt werden.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;LoginRequiredMiddleware kann als Voreinstellung für alle Views das Login verlangen; mit einem neuen
Decorator &lt;code class="docutils literal"&gt;@login_not_required&lt;/code&gt; kann davon abgewichen werden.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Für ein SQLite-Backend können per &lt;code class="docutils literal"&gt;init_command&lt;/code&gt; Pragma-Optionen gesetzt werden.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Unterstützt kein PostgreSQL 12 mehr.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;CheckConstraint: &lt;code class="docutils literal"&gt;check&lt;/code&gt; ist umbenannt in &lt;code class="docutils literal"&gt;condition&lt;/code&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;</description><guid>https://lannert.de/debloss/en/posts/django-51/</guid><pubDate>Mon, 01 Jul 2024 07:45:00 GMT</pubDate></item><item><title>Wird PostgreSQL dem (schlechten) Beispiel von Redis folgen?</title><link>https://lannert.de/debloss/en/posts/wird-postgresql-dem-schlechten-beispiel-von-redis-folgen/</link><dc:creator>Detlef Lannert</dc:creator><description>&lt;p&gt;Wird nach Redis auch PostgreSQL künftig irgendwann seine Lizenz ändern (und unfrei machen)?&lt;/p&gt;
&lt;p&gt;Antwort: &lt;a class="reference external" href="https://jkatz05.com/post/postgres/postgres-license-2024/"&gt;Nein&lt;/a&gt;.&lt;/p&gt;</description><guid>https://lannert.de/debloss/en/posts/wird-postgresql-dem-schlechten-beispiel-von-redis-folgen/</guid><pubDate>Sat, 30 Mar 2024 07:55:00 GMT</pubDate></item><item><title>django-pgcrypto</title><link>https://lannert.de/debloss/en/posts/django-pgcrypto/</link><dc:creator>Detlef Lannert</dc:creator><description>&lt;p&gt;Das Paket &lt;a class="reference external" href="https://github.com/incuna/django-pgcrypto-fields"&gt;django-pgcrypto&lt;/a&gt; erlaubt die
Nutzung der PostgreSQL-Erweiterung &lt;a class="reference external" href="https://www.postgresql.org/docs/current/pgcrypto.html"&gt;pgcrypto&lt;/a&gt;
von Django aus. Damit sind verschlüsselte Datenbankfelder weitgehend transparent nutzbar;
ein Hashcode (bzw. HMAC) kann automatisch ein einem anderen Feld abgelegt werden, um z.B.
unique-Constraints zu ermöglichen. Aber aufpassen: Die Ver- und Entschlüsselung wird auf dem
Datenbankserver ausgeführt; hierzu werden die Passphrasen im Klartext übertragen – man muss also
dem Server grundsätzlich vertrauen. Andernfalls kann nur im Clientcode „zu Fuß“ ver- und entschlüsselt
werden.&lt;/p&gt;</description><guid>https://lannert.de/debloss/en/posts/django-pgcrypto/</guid><pubDate>Fri, 11 Aug 2023 18:21:09 GMT</pubDate></item></channel></rss>