SQLAlchemy è una libreria open source per la gestione di database in Python. Fornisce un'API ad alto livello per la creazione e la gestione di database relazionali. SQLAlchemy è una delle librerie più utilizzate per la gestione di database in Python.
SQLAlchemy può essere installato utilizzando il gestore di pacchetti pip:
pip install sqlalchemy
Per connettersi a un database utilizzando SQLAlchemy, è necessario creare un'istanza di Engine
utilizzando la funzione create_engine
. Ad esempio, per connettersi a un database SQLite in memoria, è possibile utilizzare il seguente codice:
from sqlalchemy import create_engine
# Connessione a un database SQLite in memoria
engine = create_engine('sqlite:///:memory:')
# Connessione a un database SQLite su disco
engine = create_engine('sqlite:///path/to/database.db')
# Connessione a un database MySQL
engine = create_engine('mysql://user:password@localhost/dbname')
# Connessione a un database PostgreSQL
engine = create_engine('postgresql://user:password@localhost/dbname')
# Connessione a un database SQL Server
engine = create_engine('mssql+pyodbc://user:password@localhost/dbname')
# Connessione a un database Oracle
engine = create_engine('oracle://user:password@localhost/dbname')
# Connessione a un database di tipo custom
engine = create_engine('dialect+driver://user:password@host:port/dbname')
Per eseguire operazioni sul database, è necessario creare una sessione utilizzando la classe Session
di SQLAlchemy. Ad esempio, è possibile creare una sessione per il database SQLite in memoria utilizzando il seguente codice:
from sqlalchemy.orm import sessionmaker
# Creazione di una sessione
Session = sessionmaker(bind=engine)
session = Session()
# Esecuzione di operazioni sul database
# ...
# Chiusura della sessione
session.close()
Per dichiarare una tabella in SQLAlchemy, è necessario creare una classe che erediti dalla classe Base
e definire gli attributi della tabella come attributi della classe. Ad esempio, è possibile definire una tabella User
con gli attributi id
, name
e age
utilizzando il seguente codice:
from sqlalchemy import Column, Integer, String
from sqlalchemy.ext.declarative import declarative_base
Base = declarative_base()
class User(Base):
__tablename__ = 'users'
id = Column(Integer, primary_key=True)
name = Column(String)
age = Column(Integer)
Per creare una tabella nel database, è necessario utilizzare la funzione create_all
dell'istanza di Engine
. Ad esempio, per creare la tabella User
nel database, è possibile utilizzare il seguente codice:
# Creazione della tabella nel database
Base.metadata.create_all(engine)
SQLAlchemy fornisce un'API ad alto livello per eseguire operazioni CRUD (Create, Read, Update, Delete) sui dati del database. Ad esempio, è possibile inserire un nuovo utente nel database utilizzando il seguente codice:
from sqlalchemy.orm import sessionmaker
# Creazione di una sessione
Session = sessionmaker(bind=engine)
session = Session()
# Inserimento di un nuovo utente
new_user = User(name='Alice', age=25)
session.add(new_user)
session.commit()
# Lettura di un utente con query e visualizzazione dei dati
user = session.query(User).filter_by(name='Alice').first()
print(user.name, user.age)
# Aggiornamento di un utente
user.age = 26
session.commit()
# Cancellazione di un utente
session.delete(user)
session.commit()
# Chiusura della sessione
session.close()
SQLAlchemy fornisce molti metodi per eseguire operazioni CRUD sui dati del database. Elenchiamo alcuni più comuni:
add()
: Aggiunge un oggetto al database.commit()
: Conferma le modifiche apportate al database.query()
: Esegue una query sul database.update()
: Aggiorna i dati nel database.delete()
: Cancella un oggetto dal database.
SQLAlchemy fornisce un'API per eseguire query sul database utilizzando un linguaggio simile a SQL. Ad esempio, è possibile eseguire una query per ottenere tutti gli utenti con età maggiore di 21 anni utilizzando il seguente codice:
# Esecuzione di una query
users = session.query(User).filter(User.age > 21).all()
for user in users:
print(user.name, user.age)
SQLAlchemy fornisce molti metodi di query per eseguire operazioni complesse sul database. Elenchiamo alcuni più comuni:
filter()
: Applica un filtro ai risultati della query.filter_by()
: Applica un filtro ai risultati della query utilizzando il nome della colonna.order_by()
: Ordina i risultati della query in base a una colonna.group_by()
: Raggruppa i risultati della query in base a una colonna.join()
: Esegue una join tra due tabelle.count()
: Restituisce il numero di risultati della query.first()
: Restituisce il primo risultato della query.all()
: Restituisce tutti i risultati della query.one()
: Restituisce un errore se la query restituisce più di un risultato.scalar()
: Restituisce il primo risultato della query come valore scalare.exists()
: Restituisce True se la query restituisce almeno un risultato, altrimenti False.
# Esecuzione di una query complessa
users = session.query(User).filter(User.age > 21).order_by(User.name).all()
for user in users:
print(user.name, user.age)
SQLAlchemy fornisce molti metodi di aggregazione per eseguire operazioni di aggregazione sui dati del database. Elenchiamo alcuni più comuni:
count()
: Restituisce il numero di risultati della query.sum()
: Restituisce la somma dei valori di una colonna.avg()
: Restituisce la media dei valori di una colonna.min()
: Restituisce il valore minimo di una colonna.max()
: Restituisce il valore massimo di una colonna.
# Esecuzione di una query di aggregazione
count = session.query(User).filter(User.age > 21).count()
print(count)
SQLAlchemy fornisce molti metodi di join per eseguire operazioni di join tra tabelle. Elenchiamo alcuni più comuni:
join()
: Esegue una join tra due tabelle.outerjoin()
: Esegue una join esterna tra due tabelle.select_from()
: Specifica la tabella di partenza per la query.join_from()
: Specifica la tabella di partenza per la join.
# Esecuzione di una query con join
users = session.query(User, Address).join(Address).all()
for user, address in users:
print(user.name, address.email)
SQLAlchemy fornisce molti metodi di operazioni di base per eseguire operazioni di base sul database. Elenchiamo alcuni più comuni:
and_()
: Restituisce un'espressione che rappresenta l'operatore logico AND.or_()
: Restituisce un'espressione che rappresenta l'operatore logico OR.not_()
: Restituisce un'espressione che rappresenta l'operatore logico NOT.
from sqlalchemy import and_, or_, not_
# Esecuzione di una query con operatori logici
users = session.query(User).filter(and_(User.age > 21, User.name != 'Alice')).all()
for user in users:
print(user.name, user.age)
SQLAlchemy fornisce molti metodi di operatori di confronto per eseguire operazioni di confronto sul database. Elenchiamo alcuni più comuni:
==
: Restituisce un'espressione che rappresenta l'operatore di uguaglianza.!=
: Restituisce un'espressione che rappresenta l'operatore di disuguaglianza.<
: Restituisce un'espressione che rappresenta l'operatore di minore.<=
: Restituisce un'espressione che rappresenta l'operatore di minore o uguale.>
: Restituisce un'espressione che rappresenta l'operatore di maggiore.>=
: Restituisce un'espressione che rappresenta l'operatore di maggiore o uguale.
# Esecuzione di una query con operatori di confronto
users = session.query(User).filter(User.age > 21).all()
for user in users:
print(user.name, user.age)
SQLAlchemy fornisce molti metodi di operatori di stringhe per eseguire operazioni di stringhe sul database. Elenchiamo alcuni più comuni:
like()
: Restituisce un'espressione che rappresenta l'operatore di confronto LIKE.ilike()
: Restituisce un'espressione che rappresenta l'operatore di confronto ILIKE.contains()
: Restituisce un'espressione che rappresenta l'operatore di confronto CONTAINS.startswith()
: Restituisce un'espressione che rappresenta l'operatore di confronto STARTSWITH.endswith()
: Restituisce un'espressione che rappresenta l'operatore di confronto ENDSWITH.
# Esecuzione di una query con operatori di stringhe
users = session.query(User).filter(User.name.like('%Alice%')).
SQLAlchemy fornisce molti metodi di operatori di matematica per eseguire operazioni di matematica sul database. Elenchiamo alcuni più comuni:
+
: Restituisce un'espressione che rappresenta l'operatore di somma.-
: Restituisce un'espressione che rappresenta l'operatore di sottrazione.*
: Restituisce un'espressione che rappresenta l'operatore di moltiplicazione./
: Restituisce un'espressione che rappresenta l'operatore di divisione.%
: Restituisce un'espressione che rappresenta l'operatore di modulo.
# Esecuzione di una query con operatori di matematica
users = session.query(User).filter(User.age + 5 > 21).all()
for user in users:
print(user.name, user.age)
SQLAlchemy fornisce un'API per definire relazioni tra tabelle nel database. Ad esempio, è possibile definire una relazione uno a molti tra le tabelle User
e Address
utilizzando il seguente codice:
from sqlalchemy import ForeignKey
from sqlalchemy.orm import relationship
class Address(Base):
__tablename__ = 'addresses'
id = Column(Integer, primary_key=True)
email = Column(String)
user_id = Column(Integer, ForeignKey('users.id'))
user = relationship('User', back_populates='addresses')
User.addresses = relationship('Address', order_by=Address.id, back_populates='user')
# Creazione della tabella nel database
Base.metadata.create_all(engine)
SQLAlchemy fornisce molti tipi di relazione per definire relazioni complesse tra tabelle. Elenchiamo alcuni più comuni:
relationship()
: Definisce una relazione tra due tabelle.back_populates
: Specifica il nome dell'attributo nella tabella correlata.order_by
: Specifica l'ordine dei risultati della relazione.lazy
: Specifica il comportamento di caricamento dei dati della relazione.
SQLAlchemy fornisce molti metodi per definire chiavi primarie e chiavi esterne nelle tabelle. Elenchiamo alcuni più comuni:
ForeignKey()
: Definisce una chiave esterna nella tabella.primary_key
: Specifica se una colonna è una chiave primaria.
from sqlalchemy import ForeignKey
class Address(Base):
__tablename__ = 'addresses'
id = Column(Integer, primary_key=True)
email = Column(String)
user_id = Column(Integer, ForeignKey('users.id'))
Ad esempio, è possibile definire una relazione uno a molti tra le tabelle User
e Address
utilizzando il seguente codice:
from sqlalchemy import ForeignKey
class Address(Base):
__tablename__ = 'addresses'
id = Column(Integer, primary_key=True)
email = Column(String)
user_id = Column(Integer, ForeignKey('users.id'))
class User(Base):
__tablename__ = 'users'
id = Column(Integer, primary_key=True)
name = Column(String)
age = Column(Integer)
addresses = relationship('Address', backref='user')
# Creazione della tabella nel database
Base.metadata.create_all(engine)
SQLAlchemy è una libreria potente e flessibile per la gestione di database in Python.