formazione-python

Package SQLAlchemy

Introduzione

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.

Installazione

SQLAlchemy può essere installato utilizzando il gestore di pacchetti pip:

pip install sqlalchemy

Connessione al database

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

Creazione di una sessione

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

Dichiarazione di una tabella

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)

Creazione di una tabella

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)

Operazioni CRUD

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

Metodi CRUD

SQLAlchemy fornisce molti metodi per eseguire operazioni CRUD sui dati del database. Elenchiamo alcuni più comuni:

Query

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)

Metodi di query

SQLAlchemy fornisce molti metodi di query per eseguire operazioni complesse sul database. Elenchiamo alcuni più comuni:

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

Metodi di aggregazione

SQLAlchemy fornisce molti metodi di aggregazione per eseguire operazioni di aggregazione sui dati del database. Elenchiamo alcuni più comuni:

# Esecuzione di una query di aggregazione
count = session.query(User).filter(User.age > 21).count()
print(count)

Metodi di join

SQLAlchemy fornisce molti metodi di join per eseguire operazioni di join tra tabelle. Elenchiamo alcuni più comuni:

# Esecuzione di una query con join
users = session.query(User, Address).join(Address).all()

for user, address in users:
    print(user.name, address.email)

Metodi di operatori logici

SQLAlchemy fornisce molti metodi di operazioni di base per eseguire operazioni di base sul database. Elenchiamo alcuni più comuni:

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)

Metodi di operatori di confronto

SQLAlchemy fornisce molti metodi di operatori di confronto per eseguire operazioni di confronto sul database. Elenchiamo alcuni più comuni:

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

Metodi di operatori di stringhe

SQLAlchemy fornisce molti metodi di operatori di stringhe per eseguire operazioni di stringhe sul database. Elenchiamo alcuni più comuni:

# Esecuzione di una query con operatori di stringhe
users = session.query(User).filter(User.name.like('%Alice%')).

Metodi di operatori di matematica

SQLAlchemy fornisce molti metodi di operatori di matematica per eseguire operazioni di matematica sul database. Elenchiamo alcuni più comuni:

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

Relazioni

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)

Tipi di relazione

SQLAlchemy fornisce molti tipi di relazione per definire relazioni complesse tra tabelle. Elenchiamo alcuni più comuni:

Chiave primaia e chiave esterna

SQLAlchemy fornisce molti metodi per definire chiavi primarie e chiavi esterne nelle tabelle. Elenchiamo alcuni più comuni:

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

Esempio di relazione

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)

Conclusioni

SQLAlchemy è una libreria potente e flessibile per la gestione di database in Python.

By Maurizio Tolomeo

HOMEPAGE