Tout ce que vous devez savoir sur les cartes Python et relation-objet
Vous avez peut-être entendu parler du mappage relationnel-objet (ORM). Vous en avez peut-être même utilisé un, mais quels sont-ils exactement? Et comment les utilisez-vous en Python?
Voici tout ce que vous devez savoir sur les ORM et Python.
Qu'est-ce qu'un ORM??
Le mappage objet-relationnel (ORM) est une technique de programmation utilisée pour accéder à une base de données. Il expose votre base de données dans une série d'objets. Il n'est pas nécessaire d'écrire des commandes SQL pour insérer ou récupérer des données, vous utilisez une série d'attributs et de méthodes attachés à des objets..
Cela peut sembler complexe et inutile, mais cela peut vous faire gagner beaucoup de temps et vous aider à contrôler l'accès à votre base de données..
Voici un exemple. Dites que chaque fois que vous insérez un mot de passe dans votre base de données, vous voulez le hacher, comme expliqué dans Sécurité du mot de passe du site Web Chaque site Web sécurisé le fait avec votre mot de passe Chaque site Web sécurisé le fait avec votre mot de passe Vous êtes-vous déjà demandé comment les sites Web préservent votre mot de passe des données des violations? Lire la suite . Ce n'est pas un problème pour les cas d'utilisation simples, vous faites le calcul avant de l'insérer. Mais que se passe-t-il si vous devez insérer un enregistrement à plusieurs endroits dans le code? Que se passe-t-il si un autre programmeur insère dans votre table et que vous ne le connaissez pas??
En utilisant un ORM, vous pouvez écrire du code pour vous assurer que chaque fois que vous accédez à une ligne ou à un champ de votre base de données, votre autre code personnalisé est exécuté en premier..
Cela agit aussi comme un “source unique de vérité”. Si vous souhaitez modifier un calcul personnalisé, vous ne devez le modifier qu’à un seul endroit, pas plusieurs. Il est possible d'exécuter nombre de ces principes avec la programmation orientée objet (OOP) en Python. Guide d'initiation à la programmation orientée objet de Python Guide d'initiation à la programmation orientée objet de Python Pour tirer pleinement parti des atouts de Python, vous souhaiterez apprendre à Python fonctionne avec la programmation orientée objet (OOP). En savoir plus, mais les ORM travaillent en parallèle avec les principes de la programmation orientée objet pour contrôler l'accès à une base de données.
Il y a certaines choses à surveiller lors de l'utilisation d'un ORM, et il y a des circonstances dans lesquelles vous ne souhaitez peut-être pas en utiliser un, mais elles sont généralement considérées comme une bonne chose à avoir, en particulier dans un code de grande taille..
ORM en Python utilisant SQLAlchemy
Comme beaucoup de tâches en Python, il est plus rapide et plus facile d'importer un module que d'écrire le vôtre. Bien sûr, il est possible d'écrire votre propre ORM, mais pourquoi réinventer la roue?
Les exemples suivants utilisent tous SQLAlchemy, un ORM Python populaire, mais bon nombre des principes s'appliquent quelle que soit la mise en œuvre..
Configuration de Python pour SQLAlchemy
Avant de vous lancer, vous devez configurer votre machine pour le développement Python avec SQLAlchemy..
Vous devrez utiliser Python 3.6 pour suivre ces exemples. Bien que les anciennes versions fonctionnent, le code ci-dessous nécessitera quelques modifications avant de pouvoir être exécuté. Pas sûr des différences? Notre FAQ Python Les questions les plus fréquemment posées sur la programmation Python Les questions les plus fréquemment posées sur la programmation Python Dans cet article, nous vous expliquerons tout ce que vous devez savoir sur Python en tant que débutant. Lire la suite couvre toutes les différences.
Avant de coder, vous devez configurer un environnement Python. Apprendre à utiliser l’environnement virtuel Python. Apprendre à utiliser l’environnement virtuel Python. Que vous soyez un développeur Python expérimenté ou débutant, il est essentiel d’apprendre à configurer un environnement virtuel. pour tout projet Python. En savoir plus, ce qui évitera les problèmes avec d'autres packages Python importés.
Assurez-vous que vous disposez de PIP, le gestionnaire de packages Python. Comment installer PIP pour Python sous Windows, Mac et Linux Comment installer PIP pour Python sous Windows, Mac et Linux De nombreux développeurs Python s'appuient sur un outil appelé PIP pour Python pour rendre tout beaucoup plus facile et plus rapide. Voici comment installer PIP. Lisez-en plus avec les versions les plus modernes de Python.
Une fois que vous êtes prêt, vous pouvez commencer par préparer SQLAlchemy. Depuis votre environnement Python en ligne de commande, installez SQLAlchemy avec le pip installer commander:
pip installer SQLAlchemy-1.2.9
le 1.2.9 est le numéro de version. Vous pouvez laisser cette option désactivée pour obtenir le dernier package, mais il est recommandé d’être spécifique. Vous ne savez pas quand une nouvelle version peut casser votre code actuel.
Vous êtes maintenant prêt à commencer à coder. Vous devrez peut-être préparer votre base de données à accepter une connexion Python, mais les exemples suivants utilisent tous une base de données SQLite créée en mémoire ci-dessous..
Modèles dans SQLAlchemy
L’un des composants clés d’un ORM est un modèle. Il s'agit d'une classe Python qui décrit à quoi une table devrait ressembler et comment elle devrait fonctionner. C'est la version ORM du CREER LA TABLE déclaration en SQL. Vous avez besoin d'un modèle pour chaque table de votre base de données.
Ouvrez votre éditeur de texte préféré ou votre IDE et créez un nouveau fichier appelé test.py. Entrez ce code de démarrage, enregistrez le fichier et exécutez-le:
from sqlalchemy import create_engine from sqlalchemy.ext.declarative import base_déclarante = base_déclarante () engine = create_engine ('sqlite: //') # Crée la base de données en mémoire Base.metadata.create_all (engine) # Crée toutes les tables de la base de données.
Ce code fait plusieurs choses. Les importations sont nécessaires pour que Python sache où trouver les modules SQLAlchemy dont il a besoin. Vos modèles utiliseront le base déclarative plus tard, et il configure tous les nouveaux modèles pour fonctionner comme prévu.
le create_engine Cette méthode crée une nouvelle connexion à votre base de données. Si vous avez déjà une base de données, vous devrez changer sqlite: // à votre URI de base de données. En l'état, ce code créera une nouvelle base de données uniquement en mémoire. La base de données est détruite une fois que votre code a fini de s'exécuter..
Finalement, le create_all method crée toutes les tables définies dans vos modes dans votre base de données. Comme vous n'avez encore défini aucun modèle, rien ne se passera. Allez-y et exécutez ce code, pour vous assurer que vous n'avez pas de problèmes ou de fautes de frappe.
Faisons un modèle. Ajoutez une autre importation en haut de votre fichier:
depuis sqlalchemy import Column, Integer, String
Cela importe le Colonne, Entier, et Chaîne modules de SQLAlchemy. Ils définissent le fonctionnement des tables, des champs, des colonnes et des types de données de la base de données.
Sous le base déclarative, créez votre classe de modèle:
class Cars (Base): __tablename__ = 'cars' id = Column (Integer, primary_key = True) make = Column (String (50), nullable = False) color = Column (String (50), nullable = False)
Cet exemple simple utilise des voitures, mais vos tables peuvent contenir des données.
Chaque classe doit hériter Base. Le nom de votre table de base de données est défini dans __nom de la table__. Cela devrait être identique au nom de la classe, mais ceci est juste une recommandation, et rien ne se cassera si elles ne correspondent pas.
Enfin, chaque colonne est définie en tant que variable python dans la classe. Différents types de données sont utilisés, et le clé primaire attribut dit à SQLAlchemy de créer le identifiant colonne en tant que clé primaire.
Allez-y et ajoutez une dernière importation, cette fois pour le Clé étrangère module. Ajoutez ceci aux côtés de votre Colonne importation:
à partir de sqlalchemy import Column, ForeignKey, Integer, String
Créez maintenant une deuxième classe de modèle. Cette classe s'appelle Propriétaires, et stocke les détails du propriétaire des voitures spécifiques stockées dans le Des voitures table:
class CarOwners (Base): __tablename__ = 'id des propriétaires * = Colonne (entier, clé primaire = True) name = Colonne (Chaîne (50), nullable = False) age = Colonne (Integer, nullable = False) car_id = Colonne (Entier, ForeignKey ('cars.id')) voiture = relation (Voitures)
Il y a plusieurs nouveaux attributs introduits ici. le car_id Le champ est défini comme une clé étrangère. Il est lié à la identifiant dans le des voitures table. Notez comment le nom de la table en minuscule est utilisé, au lieu du nom de la classe en majuscule.
Enfin, un attribut de voiture est défini comme un relation. Cela permet à votre modèle d'accéder à la Des voitures table à travers cette variable. Ceci est démontré ci-dessous.
Si vous exécutez ce code maintenant, vous verrez que rien ne se produit. C'est parce que vous ne lui avez pas encore demandé de faire quoi que ce soit de notable.
Objets dans SQLAlchemy
Maintenant que vos modèles sont créés, vous pouvez commencer à accéder aux objets et à lire et écrire des données. C'est une bonne idée de placer votre logique dans sa propre classe et fichier, mais pour l'instant, elle peut rester aux côtés des modèles..
Écriture de données
Dans cet exemple, vous devez insérer des données dans la base de données avant de pouvoir les lire. Si vous utilisez une base de données existante, vous avez peut-être déjà des données. Quoi qu'il en soit, il est toujours très utile de savoir comment insérer des données.
Vous pouvez être habitué à écrire INSÉRER instructions en SQL. SQLAlchemy s'en occupe pour vous. Voici comment insérer une ligne dans le Des voitures modèle. Commencez avec une nouvelle importation pour faiseur de session:
à partir de sqlalchemy.orm sessionmaker
Cela est nécessaire pour créer le session et DBSession objets, qui sont utilisés pour lire et écrire des données:
DBSession = sessionmaker (bind = engine) session = DBSession ()
Maintenant, placez ceci sous votre create_all déclaration:
car1 = Voitures (make = "Ford", color = "silver") session.add (car1) session.commit ()
Décomposons ce code. La variable voiture1 est défini comme un objet basé sur la Des voitures modèle. Sa marque et sa couleur sont définies en tant que paramètres. C'est comme dire “fais-moi une voiture, mais ne l'écris pas encore dans la base de données”. Cette voiture existe en mémoire mais attend d'être écrite.
Ajouter la voiture à la session avec session.add, puis écrivez-le dans la base de données avec session.commit.
Ajoutons maintenant un propriétaire:
owner1 = CarOwners (name = "Joe", age = "99", car_id = (car1.id)) session.add (owner1) session.commit ()
Ce code est presque identique à l’insertion précédente pour le Des voitures modèle. La principale différence ici est que car_id est une clé étrangère, il faut donc un identifiant de ligne qui existe dans l'autre table. Ceci est accessible via le car1.id propriété.
Vous n'avez pas besoin d'interroger la base de données ni de renvoyer d'identifiant, car SQLAlchemy s'en charge pour vous (à condition de valider les données en premier)..
Lecture de données
Une fois que vous avez écrit certaines données, vous pouvez commencer à les relire. Voici comment interroger le Des voitures et Propriétaires les tables:
result = session.query (Cars) .all ()
C'est aussi simple que ça. En utilisant le question méthode trouvée dans le session, vous spécifiez le modèle, puis utilisez le tout méthode pour récupérer tous les résultats. Si vous savez qu'il n'y aura qu'un seul résultat, vous pouvez utiliser le premier méthode:
result = session.query (Cars) .first ()
Une fois que vous avez interrogé le modèle et stocké les résultats renvoyés dans une variable, vous pouvez accéder aux données via l'objet:
print (résultat [0] .color)
Cela imprime la couleur “argent”, comme cet enregistrement est la première ligne. Vous pouvez faire une boucle sur l’objet résultat si vous voulez.
Lorsque vous avez défini la relation dans votre modèle, il est possible d’accéder aux données des tables associées sans spécifier de jointure:
result = session.query (CarOwners) .all () print (result [0] .name) print (result [0] .car.color)
Cela fonctionne car votre modèle contient des détails sur la structure de votre table et le voiture attribut a été défini comme un lien vers la des voitures table.
Qu'est-ce qui ne pas aimer les ORM??
Ce tutoriel ne couvrait que les bases, mais une fois que vous avez maîtrisé celles-ci, vous pouvez passer aux sujets avancés. Les ORM présentent certains inconvénients potentiels:
- Vous devez écrire votre modèle avant de pouvoir exécuter une requête..
- C'est une autre nouvelle syntaxe à apprendre.
- C'est peut-être trop complexe pour des besoins simples.
- Vous devez avoir une bonne conception de base de données pour commencer.
Ces problèmes ne sont pas un gros problème en eux-mêmes, mais ce sont des choses à surveiller. Si vous travaillez avec une base de données existante, vous risquez d'être pris au piège.
Si vous n'êtes pas convaincu qu'un ORM est le bon outil pour vous, assurez-vous de lire les commandes SQL importantes que les programmeurs doivent connaître. 13 Commandes SQL les plus importantes que tout programmeur devrait connaître 13 Commandes SQL les plus importantes que tout programmeur devrait connaître Ce site Web utilise une base de données d’une certaine manière et, une fois combiné avec le langage SQL (Structured Query Language), les possibilités de manipulation des données sont infinies. Lire la suite .
En savoir plus sur: Tutoriels de codage, Python, SQL.