SQLAlchemy Core - Verwenden von Set-Operationen

Im letzten Kapitel haben wir verschiedene Funktionen wie max (), min (), count () usw. kennengelernt. Hier erfahren Sie mehr über Set-Operationen und deren Verwendung.

Set-Operationen wie UNION und INTERSECT werden von Standard-SQL und dem größten Teil seines Dialekts unterstützt. SQLAlchemy implementiert sie mit Hilfe der folgenden Funktionen:

Union()

Beim Kombinieren der Ergebnisse von zwei oder mehr SELECT-Anweisungen entfernt UNION Duplikate aus der Ergebnismenge. Die Anzahl der Spalten und der Datentyp müssen in beiden Tabellen gleich sein.

Die Funktion union () gibt ein CompoundSelect-Objekt aus mehreren Tabellen zurück. Das folgende Beispiel zeigt seine Verwendung -

from sqlalchemy import create_engine, MetaData, Table, Column, Integer, String, union
engine = create_engine('sqlite:///college.db', echo = True)

meta = MetaData()
conn = engine.connect()
addresses = Table(
   'addresses', meta, 
   Column('id', Integer, primary_key = True), 
   Column('st_id', Integer), 
   Column('postal_add', String), 
   Column('email_add', String)
)

u = union(addresses.select().where(addresses.c.email_add.like('%@gmail.com addresses.select().where(addresses.c.email_add.like('%@yahoo.com'))))

result = conn.execute(u)
result.fetchall()

Das Vereinigungskonstrukt übersetzt in folgenden SQL-Ausdruck:

SELECT addresses.id, 
   addresses.st_id, 
   addresses.postal_add, 
   addresses.email_add
FROM addresses
WHERE addresses.email_add LIKE ? UNION SELECT addresses.id, 
   addresses.st_id, 
   addresses.postal_add, 
   addresses.email_add
FROM addresses
WHERE addresses.email_add LIKE ?

In unserer Adresstabelle stellen die folgenden Zeilen die Vereinigungsoperation dar -

[
   (1, 1, 'Shivajinagar Pune', '[email protected]'),
   (2, 1, 'ChurchGate Mumbai', '[email protected]'),
   (3, 3, 'Jubilee Hills Hyderabad', '[email protected]'),
   (4, 5, 'MG Road Bangaluru', '[email protected]')
]

union_all ()

Die Operation UNION ALL kann die Duplikate nicht entfernen und die Daten in der Ergebnismenge nicht sortieren. In der obigen Abfrage wird beispielsweise UNION durch UNION ALL ersetzt, um den Effekt zu sehen.

u = union_all(addresses.select().where(addresses.c.email_add.like('%@gmail.com')), addresses.select().where(addresses.c.email_add.like('%@yahoo.com')))

Der entsprechende SQL-Ausdruck lautet wie folgt:

SELECT addresses.id, 
   addresses.st_id, 
   addresses.postal_add, 
   addresses.email_add
FROM addresses
WHERE addresses.email_add LIKE ? UNION ALL SELECT addresses.id, 
   addresses.st_id, 
   addresses.postal_add, 
   addresses.email_add
FROM addresses
WHERE addresses.email_add LIKE ?

außer_()

Die SQL EXCEPTKlausel / Operator wird verwendet, um zwei SELECT-Anweisungen zu kombinieren und Zeilen aus der ersten SELECT-Anweisung zurückzugeben, die von der zweiten SELECT-Anweisung nicht zurückgegeben werden. Die Funktion exception_ () generiert einen SELECT-Ausdruck mit der EXCEPT-Klausel.

Im folgenden Beispiel gibt die Funktion exception_ () nur die Datensätze aus der Adresstabelle zurück, die im Feld email_add 'gmail.com' enthalten, schließt jedoch diejenigen aus, die im Feld postal_add 'Pune' enthalten.

u = except_(addresses.select().where(addresses.c.email_add.like('%@gmail.com')), addresses.select().where(addresses.c.postal_add.like('%Pune')))

Das Ergebnis des obigen Codes ist der folgende SQL-Ausdruck:

SELECT addresses.id, 
   addresses.st_id, 
   addresses.postal_add, 
   addresses.email_add
FROM addresses
WHERE addresses.email_add LIKE ? EXCEPT SELECT addresses.id, 
   addresses.st_id, 
   addresses.postal_add, 
   addresses.email_add
FROM addresses
WHERE addresses.postal_add LIKE ?

Angenommen, die Adresstabelle enthält Daten, die in früheren Beispielen verwendet wurden, wird die folgende Ausgabe angezeigt:

[(2, 1, 'ChurchGate Mumbai', '[email protected]'),
   (3, 3, 'Jubilee Hills Hyderabad', '[email protected]')]

sich schneiden()

Mit dem INTERSECT-Operator zeigt SQL gemeinsame Zeilen aus beiden SELECT-Anweisungen an. Die Funktion intersect () implementiert dieses Verhalten.

In den folgenden Beispielen sind zwei SELECT-Konstrukte Parameter für die Funktion intersect (). Eine gibt Zeilen zurück, die 'gmail.com' als Teil der Spalte email_add enthalten, und andere geben Zeilen zurück, die 'Pune' als Teil der Spalte postal_add enthalten. Das Ergebnis sind gemeinsame Zeilen aus beiden Ergebnismengen.

u = intersect(addresses.select().where(addresses.c.email_add.like('%@gmail.com')), addresses.select().where(addresses.c.postal_add.like('%Pune')))

In der Tat entspricht dies der folgenden SQL-Anweisung:

SELECT addresses.id, 
   addresses.st_id, 
   addresses.postal_add, 
   addresses.email_add
FROM addresses
WHERE addresses.email_add LIKE ? INTERSECT SELECT addresses.id, 
   addresses.st_id, 
   addresses.postal_add, 
   addresses.email_add
FROM addresses
WHERE addresses.postal_add LIKE ?

Die beiden gebundenen Parameter '% gmail.com' und '% Pune' erzeugen eine einzelne Zeile aus den Originaldaten in der Adresstabelle, wie unten gezeigt -

[(1, 1, 'Shivajinagar Pune', '[email protected]')]