SQLAlchemy : Qu’est-ce que c’est ? À quoi ça sert ?

-
4
 m de lecture
-

Comment combiner la flexibilité de SQL avec la simplicité et l’efficacité du langage Python ? C’est là l’ambition de SQLAlchemy. Découvrez tout ce que vous devez savoir sur SQLAlchemy, un outil fondé sur le principe de mapping objet-relationnel (ORM).

Qu'est ce que le principe de mapping objet-relationnel ?

SQLAlchemy est un outil fondé sur le principe de mapping objet-relationnel (ORM).

L’ORM est une technique informatique qui fait correspondre le schéma d’une base de données relationnelle (dites SQL), et les classes d’un langage de programmation orientée objet (ici Python), via la création d’une couche virtuelle entre nous et la base de données, qu’on peut ensuite utiliser et « requêter » directement depuis un script Python.

SQLAlchemy facilite donc la liaison entre Python et les bases de données SQL en convertissant automatiquement les appels de classes de Python en instructions SQL. Il est donc possible de requêter les bases de données relationnelles de manière pythonique.

Parties/Décomposition Alchemy

SQL Alchemy se décompose en plusieurs parties : 

  • L’engine, qui est utilisé pour se connecter à la base de données et lui communiquer nos requêtes : create_engine()
    On passe généralement en argument une chaîne de caractère indiquant la localisation de la base de données (chemin local ou URL), le driver/dialecte de la base de données et les arguments de connexion (qui peuvent par exemple être des identifiants). Sur la requête suivante on va utiliser SQLite et une base de données en local :
    engine = create_engine("sqlite:///base1.db", echo=False)
    Mais on pourrait aussi utiliser PostGreSQl :
engine = create_engine("postgresql:///base1.db", echo=False)
  •  DBAPI pour “Python Database API Specification”. SQLAlchemy , comme d’autres packages de connexion aux bases de données, est fondée sur cette interface globale et y ajoute une surcouche avec ses services spécifiques.
  • SQLAlchemy permet aussi de gérer la partie DML (Data Modification Language) de SQL, c’est-à-dire les opérations élémentaires de modification des tables nommées CRUD opérations pour « Create, Read, Update, Delete ».

SQLAlchemy fait correspondre les déclarations SQL INSERT, UPDATE, et DELETE à ses propres méthodes : insert, update and delete grâce au mécanisme ORM. On peut ainsi modifier les tables d’une façon orientée objet, comme le montre l’exemple suivant.

On se connect à la base de données via .connect()  puis on donne des instructions SQL (INSERT pour créer une ligne, DELETE pour la supprimer, SELECT pour une simple lecture) suivi de .execute() pour les envoyer à la base de données.

  • Il est courant de s’intéresser aux métadonnées et au schéma strict des tables quand on utilise des BDD (Bases de données) relationnelles. SQL alchemy fournit des classes prédéfinies afin de faciliter le Data Definition Language (DDL), à savoir la partie de SQL relative à la création des schémas des bases de données relationnelles (type, clés..). Par exemple, la classe Column représente un champ dans la table, Integer précise que le champ est de type « INT », et String que c’est un « varchar ». La classe ForeignKey précise quant à elle que la colonne est une clé étrangère. Il est à noter que toutes ces classes héritent d’une classe globale nommée MetaData.

Dans ce second exemple on crée un nouvelle table Locations contenant des lieux de nouvelles régions, et l’on effectue des opérations CRUD dessus. En ce but, SQLAlchemy nous fournit des classes pré-mâchant le travail comme Column ou Table. On remarque que des fonctions de python comme .insert() , update, .where ou delete sont utilisées en lieu et place du langage SQL

  • Cependant, la syntaxe des fonctions élémentaires comme engine, .connect(),execute peut en rebuter plus d’un, car on doit fournir son propre code SQL pour interagir avec sa base de données. Une session va nous permettre d’effectuer les mêmes opérations (opérations de lecture, d’écriture et de suppression)  au moyen d’objets python plus aisés à manipuler qui sont ensuite mappés à la base de données. Les sessions sont donc utilisées pour faire de la gestion de la relation objet (ORM), et maintiennent également le suivi des objets qui ont été modifiés pendant la durée de la session.

Une exemple pour illustrer ce côté interface plus pratique :

On effectue les mêmes opérations que précédemment mais l’on constate que la syntaxe est bien plus légère :sessionmaker sert à définir notre session, qui permet d’utiliser seulement des méthodes python afin de communiquer des instructions à la base de données via une classe Python ici Pokemon qui utilise la table pokedex via le paramètre __tablename__. On peut ensuite récupérer des informations de la base de données via la méthode query(),  filtrer les résultats avec filter_by() et supprimer ensuite l’objet de la session avec la méthode delete().

Enfin , illustrons la notion de upsert , à la fin de ce dernier exemple.

On souhaite ajouter plusieurs pokémons à notre base de données mais on ne sait plus si elle en contient déjà certains ou non. Pour éviter de rajouter des doublons on va donc utiliser la fonction merge() qui va mettre à jour les informations des pokémons déjà présents dans la base (update) ou insérer une nouvelle ligne dans la table sinon (insert), cette combinaison d’update et d’insert est nommé upsert.

Quels sont les usages de SQLAlchemy ?

L’ORM, et plus globalement SQLAlchemy est adapté pour les situations suivantes :

  • L’utilisation basiques d’opérations CRUD 
  • L’écriture de meilleurs tests et data fixtures pour la consistance des données,
  • SQLAlchemy est DataBase agnostique. Cela signifie que notre code python sera le même pour tous les environnements et dialectes SQL tels que SQlite, PostGReSQL ou Oracle. Cela améliore l’interopérabilité avec le reste de votre application et on peut ainsi changer de système de base de données sans avoir à changer son code.
  • Au lieu de jongler entre les différents dialectes SQL, le toolkit open source SQL Alchemy nous permet ainsi de rationaliser notre workflow et de traiter efficacement nos données depuis le langage Python.
  • L’écriture des contraintes sur le schéma des tables directement depuis notre script python.
  • Représenter des bases relationnelles par des classes python permet d’améliorer la qualité du code, éviter les duplicatas ce qui facilite la maintenance,  mais permet également de stocker des objets dans un cache mémoire. Cela permet d’accélérer l’accès aux données en réduisant le nombre de requêtes et augmente les performances.
  • Si on ne dispose pas de base de données hébergées dans le cloud comme un Datawarehouse, on peut utiliser la base de données Open source PostGreSQL via SQLAlchemy.

Il faut cependant noter que l’ORM est peu adapté au traitement de données volumineuses ainsi qu’aux processus d’ETL. Dans ce dernier cas de figure dbt serait plus idoine (packages, macros, tests).

Conclusion

Vous êtes passionné par SQL, Python, et le monde de la donnée et vous avez envie de découvrir les outils essentiels comme dbt, Spark ou SQLAlchemy?

Rejoignez nos formations de Data Analyst, Data Scientist ou Analytics Engineer chez DataScientest pour parfaire vos connaissances en la matière via les cours du sprint Big Data.

Facebook
Twitter
LinkedIn

DataScientest News

Inscrivez-vous à notre Newsletter pour recevoir nos guides, tutoriels, et les dernières actualités data directement dans votre boîte mail.

Vous souhaitez être alerté des nouveaux contenus en data science et intelligence artificielle ?

Laissez-nous votre e-mail, pour que nous puissions vous envoyer vos nouveaux articles au moment de leur publication !

Newsletter icone
icon newsletter

DataNews

Vous souhaitez recevoir notre
newsletter Data hebdomadaire ?