SQLAlchemy Core - Utilizzo di operazioni sugli insiemi

Nell'ultimo capitolo, abbiamo imparato a conoscere varie funzioni come max (), min (), count (), ecc., Qui impareremo le operazioni sugli insiemi e il loro utilizzo.

Le operazioni di impostazione come UNION e INTERSECT sono supportate dallo standard SQL e dalla maggior parte del suo dialetto. SQLAlchemy li implementa con l'aiuto delle seguenti funzioni:

unione()

Durante la combinazione dei risultati di due o più istruzioni SELECT, UNION elimina i duplicati dal gruppo di risultati. Il numero di colonne e il tipo di dati devono essere gli stessi in entrambe le tabelle.

La funzione union () restituisce un oggetto CompoundSelect da più tabelle. L'esempio seguente ne dimostra l'uso:

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()

Il costrutto di unione si traduce nella seguente espressione SQL:

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 ?

Dalla nostra tabella degli indirizzi, le seguenti righe rappresentano l'operazione di unione -

[
   (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 ()

L'operazione UNION ALL non può rimuovere i duplicati e non può ordinare i dati nel gruppo di risultati. Ad esempio, nella query precedente, UNION è sostituito da UNION ALL per vedere l'effetto.

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

L'espressione SQL corrispondente è la seguente:

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 ?

tranne_ ()

L'SQL EXCEPTla clausola / operatore viene utilizzata per combinare due istruzioni SELECT e restituire righe dalla prima istruzione SELECT che non vengono restituite dalla seconda istruzione SELECT. La funzione tranne_ () genera un'espressione SELECT con la clausola EXCEPT.

Nell'esempio seguente, la funzione tranne_ () restituisce solo i record dalla tabella degli indirizzi che hanno "gmail.com" nel campo email_add ma esclude quelli che hanno "Pune" come parte del campo postale_add.

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

Il risultato del codice precedente è la seguente espressione SQL:

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 ?

Supponendo che la tabella degli indirizzi contenga i dati utilizzati negli esempi precedenti, verrà visualizzato il seguente output:

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

intersecare ()

Utilizzando l'operatore INTERSECT, SQL visualizza righe comuni da entrambe le istruzioni SELECT. La funzione intersect () implementa questo comportamento.

Negli esempi seguenti, due costrutti SELECT sono parametri per la funzione intersect (). Uno restituisce le righe contenenti "gmail.com" come parte della colonna email_add e l'altro restituisce le righe con "Pune" come parte della colonna Postal_add. Il risultato sarà righe comuni da entrambi i gruppi di risultati.

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

In effetti, questo è equivalente alla seguente istruzione SQL:

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 ?

I due parametri associati "% gmail.com" e "% Pune" generano una singola riga dai dati originali nella tabella degli indirizzi come mostrato di seguito:

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