Introduction à RDB avec sqlalchemy II

Dernière fois a étudié les bases de DB et RDB.

Cette fois, utilisons enfin DB de Python.

Préparation préalable

Installez sqlalchemy

$ pip install sqlalchemy

Préparation de la base de données

Connexion avec la base de données

Créez db.py et écrivez le contenu suivant.

db.py


from sqlalchemy import create_engine, MetaData

engine = create_engine('sqlite:///db.sqlite3', echo=True)
metadata = MetaData()
metadata.bind = engine

Je vais l'expliquer ligne par ligne.

engine = create_engine('sqlite:///db.sqlite3', echo=True)

Créez un objet pour vous connecter à la base de données.

Dans le premier argument de create_engine, spécifiez l'URL de la base de données de destination de la connexion. Je n'expliquerai pas en détail ce qu'est l'URL de la base de données, mais dans le cas de sqlite, vous pouvez spécifier sqlite: /// file name.

De plus, en spécifiant ʻecho = True pour create_engine`, le journal sera affiché. Il est utile pour le débogage, il est donc recommandé de le spécifier.

En règle générale, il est nécessaire de créer le DB de destination de connexion à l'avance, mais dans sqlite, si le DB de destination de connexion n'existe pas, il sera créé automatiquement.

matadata = MetaData()

Créez les métadonnées.

Le schéma de la table est stocké dans les métadonnées, mais si vous ne le comprenez pas, vous pouvez reconnaître que «je ne sais pas, mais les données de la base de données sont incluses».

metadata.bind = engine

Connectez les métadonnées à la base de données.

Définition de la table

Ici, nous créons une table menus avec une colonne name et une colonne kcal.

Modifiez db.py comme suit.

db.py


#Importer des classes supplémentaires pour la définition de table
from sqlalchemy import create_engine, MetaData, Table, Column, Integer, String

engine = create_engine('sqlite:///db.sqlite3', echo=True)
metadata = MetaData()
metadata.bind = engine

#définition de table de menu
menus = Table(
  'menus', metadata,
  Column('id', Integer, primary_key=True),
  Column('name', String),
  Column('kcal', Integer)
)

Spécifiez le nom de la table dans le premier argument de Table et les métadonnées dans le deuxième argument. Après cela, vous pouvez spécifier librement la colonne.

Définissez également le nom de la colonne dans le premier argument de Column et le type de colonne dans le deuxième argument. De plus, la colonne «id» est définie comme clé primaire.

Créer une table

À ce stade, la définition de la table est terminée, mais la table n'a pas encore été créée.

Démarrez le shell interactif et créez un tableau comme indiqué ci-dessous.

>>> import db
>>> db.metadata.create_all()

Évolution: importance des métadonnées

À ce stade, la signification des métadonnées qui ne pouvaient pas être expliquées autant peut enfin être vue. Puisque les métadonnées ont à la fois la structure de la table et du «moteur», il est possible de créer une table.

Si metadata et ʻengine` ne sont pas liés à ce stade, vous devez spécifier explicitement ce qui suit.

>>> import db
>>> db.metadata.create_all(engine)

De plus, il est recommandé de connecter les métadonnées et le moteur à l'avance car ce sera un peu gênant non seulement pour créer la table mais aussi pour faire fonctionner la base de données à l'avenir.

Résumé

--Pour utiliser DB, il est nécessaire de se connecter à DB, de définir une table et de créer une table. --Metadata conserve les informations de la table.

Cela a peut-être été un peu difficile, mais vous êtes maintenant prêt à utiliser la base de données. Même si vous ne comprenez pas le contenu jusqu'à présent, il n'y a pas de problème immédiat avec le contenu suivant. Cependant, c'est quelque chose que vous devez comprendre, alors veuillez le relire après un certain temps.

Utilisation de DB

Créer des données

L'opération de création de données est appelée ** insérer ** dans le SGBDR. Notez qu'il s'agit d'un insert, pas d'une création. Cela peut être plus facile à retenir si vous pensez à créer de nouvelles données comme à insérer une nouvelle ligne dans le tableau.

Dans sqlalchemy, ʻinsert` exécute:

>>> import db
>>> db.menus.insert().execute(name='Curry meshi', kcal=500)

Notez qu'après avoir appelé ʻinsert, nous appelons également ʻexecute. Aucune opération n'est effectuée tant que vous n'appelez pas ʻexecute`.

Ceci s'applique également à d'autres opérations. En règle générale, les opérations sur la base de données ne sont exécutées que lorsque ʻexecute` est appelé.

Obtenez des données

Utilisez select pour obtenir les données.

Tout d'abord, essayez d'exécuter le code ci-dessous.

>>> import db
>>> db.menus.select().execute().fetchall()
[(1, 'Curry meshi', 500)]

Comme avec ʻinsert, aucune donnée n'est récupérée jusqu'à ce que vous appeliez ʻexecute. Notez également que nous appelons plus loin fetchall pour le résultat de ʻexecute`.

Notez que la valeur de retour ressemble à une liste de taples, mais ce n'est pas le cas. Vous pouvez le traiter comme un taple comme res [0] [0], mais vous pouvez aussi l'obtenir par nom de colonne pour res [0] ['id'].

Aussi, non seulement obtenir toutes les données, mais aussi utiliser where pour affiner les données à obtenir, utiliser ʻorder_by pour trier et utiliser limit` pour limiter le nombre de données à obtenir. Vous pouvez également.

Par exemple, avec le code ci-dessous, vous pouvez "obtenir jusqu'à 5 menus avec moins de 100 kcal et les trier par calorie".

>>> import db
>>> db.menus.select().where(db.menus.c.kcal < 100).order_by('kcal').limit(5).execute().fetchall()

Ce type de raffinement est le même pour la mise à jour et la suppression de données.

Mise à jour des données

Utilisez ʻupdate. Les bases sont les mêmes que ʻinsert, mais veuillez noter que toutes les données seront ciblées si vous ne les restreignez pas.

Le code suivant met à jour «kcal» à 1000 pour les données avec «id» de 1.

>>> import db
>>> db.menus.update().where(db.menus.c.id == 1).execute(kcal=1000)

Suprimmer les données

Utilisez delete. Les bases sont les mêmes que ʻinsert et ʻupdate.

Le code ci-dessous supprime toutes les données avec «kcal» supérieur à 1000.

>>> import db
>>> db.menus.delete().where(db.menus.c.kcal > 1000).execute()

Résumé

Dans la continuité de la première mi-temps, le contenu était un peu difficile. Peu importe si vous ne comprenez pas tout. Il peut également être utilisé comme une simple référence, donc si vous vous perdez, vérifiez-le à nouveau.

Ce résumé

Cette fois, c'était plus difficile que la dernière fois. Ce n'est pas grave si vous ne comprenez pas tout à la fois. De plus, même si vous pensez le comprendre, vous ne savez peut-être pas comment l'écrire lorsque vous écrivez réellement le code, alors dans un tel cas, relisez-le.

Recommended Posts

Introduction à RDB avec sqlalchemy II
Introduction à RDB avec sqlalchemy Ⅰ
Comment mettre à jour avec SQLAlchemy?
Comment modifier avec SQLAlchemy?
Comment supprimer avec SQLAlchemy?
Connectez-vous à plusieurs bases de données avec SQL Alchemy
Comment INNER JOIN avec SQL Alchemy
[Introduction à WordCloud] Jouez avec le scraping ♬
Introduction au remplissage d'image Python Remplissage d'image à l'aide d'ImageDataGenerator
[Introduction à Pytorch] J'ai joué avec sinGAN ♬
Comment utiliser SQLAlchemy / Connect avec aiomysql
Introduction à MQTT (Introduction)
Introduction à Scrapy (1)
Introduction à Scrapy (3)
Premiers pas avec Supervisor
Introduction à Tkinter 1: Introduction
Introduction à PyQt
Introduction à Scrapy (2)
[Linux] Introduction à Linux
Introduction à Scrapy (4)
Introduction à discord.py (2)
Introduction aux tests d'hypothèses statistiques avec des modèles de statistiques
[Python] Introduction facile à l'apprentissage automatique avec python (SVM)
Introduction à l'intelligence artificielle avec Python 1 «Théorie des algorithmes génétiques»
Chaîne de Markov artificielle sans cervelle avec Python + Janome (2) Introduction à la chaîne de Markov
Introduction à l'intelligence artificielle avec Python 2 «Pratique de l'algorithme génétique»
[Introduction à StyleGAN2] Apprentissage indépendant avec 10 visages d'anime ♬
Introduction à Tornado (1): Framework Web Python démarré avec Tornado
Introduction au vol en formation avec Tello edu (Python)
[Introduction à minimiser] Analyse des données avec le modèle SEIR ♬
Introduction à Python avec Atom (en route)
Introduction aux modèles de retour automatique vectoriel (VAR) avec des modèles de statistiques
Introduction au modèle linéaire généralisé (GLM) par Python
[Introduction à l'application Udemy Python3 +] 9. Tout d'abord, imprimez avec print
[Introduction à Python] Comment itérer avec la fonction range?
[Introduction à WordCloud] Il est facile à utiliser même avec Jetson-nano ♬
Introduction à Lightning Pytorch
Premiers pas avec le Web Scraping
Introduction aux baies non paramétriques
Introduction à EV3 / MicroPython
Introduction au traitement parallèle distribué Python par Ray
Introduction aux mathématiques à partir du mémo d'étude Python Vol.1
Note de lecture: Introduction à l'analyse de données avec Python
Introduction au langage Python
[Chapitre 6] Introduction à scicit-learn avec 100 coups de traitement du langage
Introduction à la reconnaissance d'image TensorFlow
Introduction à OpenCV (python) - (2)
[Chapitre 3] Introduction à Python avec 100 coups de traitement du langage
Introduction à PyQt4 Partie 1
[Introduction à Pytorch] J'ai essayé de catégoriser Cifar10 avec VGG16 ♬
[Chapitre 2] Introduction à Python avec 100 coups de traitement du langage
Introduction à l'injection de dépendances
Introduction à Private Chainer
Introduction aux modèles de correction d'erreur vectorielle (VECM) avec des modèles de statistiques
Utiliser Enum avec SQLAlchemy
Introduction à l'apprentissage automatique
[Introduction à AWS] J'ai essayé de jouer avec la conversion voix-texte ♪
[Chapitre 4] Introduction à Python avec 100 coups de traitement du langage
Introduction facile au piratage domestique avec Raspberry Pi et discord.py