Ich versuche, meine Unit-Tests von H2 nach Postgresql zu migrieren.
Derzeit gibt mir H2 ein speicherinternes Schema, sodass jede Verbindung einem eindeutigen Schema zugeordnet ist, die Tabellen erstellt, den Test ausführt und das Schema löscht. Die Erstellung und Zerstörung des Schemas wird automatisch von H2 übernommen.
Die Komponententests werden gleichzeitig ausgeführt.
Was ist der beste Weg, dies in Postgresql zu tun? Speziell,
- Wie erhalte ich ein eindeutiges Schema pro Verbindung?
- Sollte das Testframework eindeutige Namen generieren oder gibt es dafür einen integrierten Mechanismus?
- Wie stelle ich sicher, dass das Schema getrennt wird, wenn die Verbindung getrennt wird?
- Ich möchte nicht mit baumelnden Schemata enden, wenn Unit-Tests getötet werden.
- Welcher Ansatz liefert die höchste Leistung?
- Ich muss Dutzende von Schemas pro Sekunde erstellen / löschen.
UPDATE : Ich habe hier eine verwandte Antwort gefunden, aber es werden keine Schemas gelöscht, falls der Prozess, der die Komponententests ausführt, abgebrochen wird.
quelle
pg_temp
stimmt ein einzelnes Schema? Wenn ich also gleichzeitig Unit-Tests durchführe, werden sie dann nicht die Tabellen / Daten des anderen überfrachten?SET search_path
ausführen. Verwenden SieSET LOCAL search_path
, um pro Subtransaktion festzulegen, oder wenn Sie möchten, können Sie auf Benutzerebene mitALTER USER mytestuser SET search_path = 'pg_temp'
oder auf Datenbankebene mitALTER DATABASE mytestdb SET search_path = 'pg_temp'
pg_temp
Schema unmöglich ?Sie können den Namen des aktuellen temporären Schemas (nach dem Erstellen der ersten temporären Tabelle) wie in dem von Ihnen hinzugefügten Link angegebenen abrufen:
Aber Ihr aktueller Plan würde immer noch nicht viel Sinn machen. Um Tabellen im aktuellen temporären Schema zu erstellen, erstellen Sie einfach temporäre Tabellen. Das ist alles. Standardmäßig
search_path
ist das so definiert, dass temporäre Tabellen zuerst sichtbar sind. Ein nie muss Schema qualifizieren temporäre Tabellen. Sie sollten das aktuelle temporäre Schema niemals direkt ansprechen müssen - das ist ein Implementierungsdetail.quelle
If you're explicitly sequences ...
: Ich denke dein letzter Kommentar enthielt einen Tippfehler. Was wolltest du zwischenexplicitly
und sagensequences
?Umfassen Ihre Tests Transaktionen? DDL ist in PostgreSQL transaktional. Wenn Sie also Ihr Schema und Ihre Tabellen erstellen und dann Ihre Tests ausführen, alles innerhalb einer einzigen Transaktion, die dann zurückgesetzt wird, wird das Schema niemals festgeschrieben und ist für andere Sitzungen sichtbar.
Sie müssten weiterhin einen wahrscheinlich eindeutigen Namen für Ihr Schema verwenden (möglicherweise Hostname und PID), da
CREATE SCHEMA
dieser sofort fehlschlägt, wenn bereits ein Schema mit identischem Namen vorhanden ist, und blockiert, wenn eine andere Sitzung ein Schema mit identischem Namen in erstellt hat eine nicht festgeschriebene Transaktion.Eine Alternative wäre möglicherweise nur die Verwendung temporärer Tabellen, wenn Sie Ihre Datenbankerstellungsskripts dazu ändern können.
quelle
CREATE SCHEMA
die einzige ist, die garantieren kann, dass sie verschwinden, wenn der Komponententest beendet wird.Ich habe gerade eine Idee.
Postgresql garantiert, dass eine Sitzung die temporären Tabellen einer anderen Sitzung nicht sehen kann. Ich vermute, dies bedeutet, dass beim Erstellen einer temporären Tabelle ein temporäres Schema erstellt wird. Vielleicht könnte ich folgendes tun:
Ich mag es nicht, mich auf Implementierungsdetails zu verlassen, aber in diesem Fall scheint dies ziemlich sicher zu sein.
quelle