Participer au site avec un Tip
Rechercher
 

Améliorations / Corrections

Vous avez des améliorations (ou des corrections) à proposer pour ce document : je vous remerçie par avance de m'en faire part, cela m'aide à améliorer le site.

Emplacement :

Description des améliorations :

Mapper une classe avec SQLAlchemy

SQLAlchemy est un ORM (Object-Relational Mapping) permettant de synchroniser vos classes avec des tables en base de données relationnelle (basée sur SQL).

L'étape la plus importante, quand on utilise un ORM, c'est de réaliser le « Mapping », c'est à dire l'association entre les éléments de vos classes et ceux de vos tables en base de données.

Présentation de la table SQL

Imaginons la table suivante, T_Persons, en base de données.

CREATE TABLE T_Persons (
    id              int(4)      PRIMARY KEY AUTO_INCREMENT,
    firstName       text        NOT NULL,
    lastName        text        NOT NULL
);
l'exemple de code SQL proposé est spécifique à MySQL/MariaDB. Si vous utilisez un autre moteur de bases de données relationnelles, veuillez adapter ce code.
ce code vous est présenté à titre informatif. Dans l'exemple de code proposé ci-dessous, on partira du principe que la table en base de données n'existe pas encore et qu'il faudra la créer automatiquement, via SQLAlchemy, en début de programme.

Définition du mapping et utilisation des données

Pour mapper une classe avec SQLAlchemy, vous devez respecter un certain nombre de règles :

Si les tables n'existent pas encore dans la base de données, SQLAlchemy peut les produire pour vous. Dans ce cas, veuillez invoquer la fonction Base.metadata.create_all.

L'exemple ci-dessous propose d'associer la classe Contact à la table T_Contacts. Une fois le mapping établi, la table sera automatiquement créée et les codes associés aux actions CRUD (Cread, Read, Update, Delete) seront exécutés.

 1 
 2 
 3 
 4 
 5 
 6 
 7 
 8 
 9 
 10 
 11 
 12 
 13 
 14 
 15 
 16 
 17 
 18 
 19 
 20 
 21 
 22 
 23 
 24 
 25 
 26 
 27 
 28 
 29 
 30 
 31 
 32 
 33 
 34 
 35 
 36 
 37 
 38 
 39 
 40 
 41 
 42 
 43 
 44 
 45 
 46 
 47 
 48 
 49 
 50 
 51 
 52 
 53 
 54 
 55 
 56 
 57 
 58 
 59 
 60 
 61 
 62 
 63 
 64 
 65 
 66 
 67 
 68 
 69 
 70 
 71 
 72 
#!/usr/bin/python3

from sqlalchemy import create_engine
from sqlalchemy import Column, Integer, Text
from sqlalchemy.orm import sessionmaker
from sqlalchemy.ext.declarative import declarative_base

# Base class used by my classes (my entities)
Base = declarative_base()    # Required

# Definition of the Contact class
class Contact( Base ):
    __tablename__ = 'T_Contacts'

    id = Column(Integer, primary_key=True)
    firstName = Column(Text)
    lastName = Column(Text)

    def __init__(self, pk=0, fn="John", ln="Doe"):
        self.id = pk
        self.firstName = fn
        self.lastName = ln

    def __str__(self):
        return self.firstName + " " + self.lastName

# The main part
if __name__ == '__main__':
    
    #engine = create_engine('sqlite:///demo.db', echo=False)
    engine = create_engine('mysql+mysqldb://<user>:<pwd>@localhost/<yourDB>', echo=False)
    
    print( "--- Construct all tables for the database (here just one table) ---" )
    Base.metadata.create_all(engine)    # Only for the first time

    
    print( "--- Create three new contacts and push its into the database ---" )
    Session = sessionmaker(bind=engine)
    session = Session()
    
    doe = Contact( 1 )
    session.add( doe )
    
    james = Contact( 3, "James", "Bond" )
    session.add( james )

    jason = Contact( 4, "Jason", "Bourne" )
    session.add( jason )
    
    #session.add_all( [ doe, james, jason ] )
    session.commit()
    
    print( "--- First select by primary key ---" )
    contact = session.query( Contact ).get(3)
    print( contact )

    print( "--- Second select by firstName ---" )
    searchedContacts = session.query( Contact ).filter( Contact.firstName.startswith( "Ja" ) )
    for c in searchedContacts: print( c )

    print( "--- Third select all contacts ---")
    agenda = session.query(Contact)  #.filter_by( firstName='James' )
    for c in agenda: print( c )

    print( "--- Try to update a specific contact ---")
    contact = session.query( Contact ).get(1)
    contact.lastName += "!"
    session.commit()        # Mandatory

    print( "--- Try to delete a specific contact ---")
    session.delete(contact)
    session.commit()        # Mandatory
Fichier useSQLAlchemy.py
il est a notez que vous devez modifiez la ligne de code associée à la connexion MySql (ou MariaDB) en fournissant votre login, votre mot de passe ainsi que la base de données à manipuler. Si vous n'avez pas installer MySql (ou MariaDB), vous pouvez aussi choisir d'utiliser la base de données SQLite livrée par défaut avec Python.

Et voici les résultats produit par cet exemple de code.

$> python3 useSQLAlchemy.py
--- Construct all tables for the database (here just one table) ---
--- Create three new contacts and push its into the database ---
--- First select by primary key ---
James Bond
--- Second select by firstName ---
James Bond
Jason Bourne
--- Third select all contacts ---
John Doe
James Bond
Jason Bourne
--- Try to update a specific contact ---
--- Try to delete a specific contact ---
$>