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.
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 );
Pour mapper une classe avec SQLAlchemy, vous devez respecter un certain nombre de règles :
Toutes les classes « mappées » de votre programme doivent toutes dériver d'une même classe de base (pourquoi par appelée Base
)
et qui est produite via un appel à la fonction declarative_base
du framework SQLAlchemy.
__tablename__
.
Chaque colonne de la table en base de données doit être associée à un attribut statique de votre classe : cet attribut statique est une instance
de la classe Column
fournie par le framework SQLAlchemy.
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 |
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 --- $>
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 :