Python pas cher
Tous les programmes traitent les données sous une forme ou une autre, et beaucoup doivent pouvoir sauvegarder et récupérer ces données d'un appel à l'autre. Python, SQLite et SQLAlchemy donnent à vos programmes des fonctionnalités de base de données, vous permettant de stocker des données dans un seul fichier sans avoir besoin d'un serveur de base de données.
Vous pouvez obtenir des résultats similaires en utilisant des fichiers plats dans n'importe quel nombre de formats, y compris CSV, JSON, XML et même des formats personnalisés. Les fichiers plats sont souvent des fichiers texte lisibles par l'homme – bien qu'ils puissent également être des données binaires – avec une structure qui peut être analysée par un programme informatique. Ci-dessous, vous découvrirez l'utilisation de bases de données SQL et de fichiers plats pour le stockage et la manipulation des données et vous apprendrez à décider quelle approche convient le mieux à votre programme.
Dans ce didacticiel, vous apprendrez à utiliser:
- Fichiers plats pour le stockage des données
- SQL pour améliorer l'accès aux données persistantes
- SQLite pour le stockage des données
- SQLAlchemy pour travailler avec des données comme des objets Python
Vous pouvez obtenir tout le code et les données que vous verrez dans ce didacticiel en cliquant sur le lien ci-dessous:
Utilisation de fichiers plats pour le stockage de données
UNE fichier plat est un fichier contenant des données sans hiérarchie interne et généralement sans référence à des fichiers externes. Les fichiers plats contiennent des caractères lisibles par l'homme et sont très utiles pour créer et lire des données. Comme ils n’ont pas à utiliser des largeurs de champ fixes, les fichiers plats utilisent souvent d’autres structures pour permettre à un programme d’analyser le texte.
Par exemple, les fichiers de valeurs séparées par des virgules (CSV) sont des lignes de texte brut dans lesquelles la virgule sépare les éléments de données. Chaque ligne de texte représente une ligne de données et chaque valeur séparée par des virgules est un champ dans cette ligne. Le séparateur de caractère virgule indique la limite entre les valeurs de données.
Python excelle dans la lecture et l'enregistrement dans des fichiers. Être capable de lire des fichiers de données avec Python vous permet de restaurer une application dans un état utile lorsque vous la réexécutez ultérieurement. Le fait de pouvoir enregistrer des données dans un fichier vous permet de partager des informations du programme entre les utilisateurs et les sites sur lesquels l'application s'exécute.
Avant qu'un programme puisse lire un fichier de données, il doit être capable de comprendre les données. Habituellement, cela signifie que le fichier de données doit avoir une structure que l'application peut utiliser pour lire et analyser le texte dans le fichier.
Vous trouverez ci-dessous un fichier CSV nommé author_book_publisher.csv
, utilisé par le premier programme d'exemple de ce didacticiel:
prénom, nom, titre, éditeur
Isaac, Asimov, Fondation, Random House
Pearl, Buck, The Good Earth, Random House
Pearl, Buck, la bonne terre, Simon & Schuster
Tom, Clancy, La chasse à octobre rouge, Berkley
Tom, Clancy, Patriot Games, Simon et Schuster
Stephen, King, It, Random House
Stephen, King, It, Penguin Random House
Stephen, roi, zone morte, maison aléatoire
Stephen, King, The Shining, Penguin Random House
John, Le Carré, "Tinker, Tailor, Solider, Spy: A George Smiley Novel", Berkley
Alex, Michaelides, le patient silencieux, Simon et Schuster
Carol, Shaben, dans les abysses, Simon & Schuster
La première ligne fournit une liste de champs séparés par des virgules, qui sont les noms de colonne pour les données qui suivent dans les lignes restantes. Le reste des lignes contient les données, chaque ligne représentant un seul enregistrement.
Remarque: Bien que les auteurs, les livres et les éditeurs soient tous réels, les relations entre les livres et les éditeurs sont fictives et ont été créées pour les besoins de ce didacticiel.
Ensuite, vous examinerez certains des avantages et des inconvénients de l'utilisation de fichiers plats comme le CSV ci-dessus pour travailler avec vos données.
Avantages des limes plates
Travailler avec des données dans des fichiers plats est gérable et simple à mettre en œuvre. Disposer des données dans un format lisible par l'homme est utile non seulement pour créer le fichier de données avec un éditeur de texte, mais également pour examiner les données et rechercher d'éventuelles incohérences ou problèmes.
De nombreuses applications peuvent exporter des versions de fichier plat des données générées par le fichier. Par exemple, Excel peut importer ou exporter un fichier CSV vers et depuis une feuille de calcul. Les fichiers plats ont également l'avantage d'être autonomes et transférables si vous souhaitez partager les données.
Presque tous les langages de programmation ont des outils et des bibliothèques qui facilitent le travail avec les fichiers CSV. Python a la fonction intégrée csv
et le puissant module pandas disponibles, faisant du travail avec des fichiers CSV une solution puissante.
Inconvénients des fichiers plats
Les avantages de travailler avec des fichiers plats commencent à diminuer à mesure que les données deviennent plus volumineuses. Les fichiers volumineux sont toujours lisibles par l'homme, mais leur modification pour créer des données ou rechercher des problèmes devient une tâche plus difficile. Si votre application modifie les données du fichier, une solution consiste à lire l'intégralité du fichier en mémoire, à effectuer les modifications et à écrire les données dans un autre fichier.
Un autre problème lié à l’utilisation de fichiers plats est que vous devrez créer et gérer explicitement les relations entre les parties de vos données et le programme d’application dans la syntaxe du fichier. De plus, vous devrez générer du code dans votre application pour utiliser ces relations.
Une dernière complication est que les personnes avec lesquelles vous souhaitez partager votre fichier de données devront également connaître et agir sur les structures et les relations que vous avez créées dans les données. Pour accéder aux informations, ces utilisateurs devront comprendre non seulement la structure des données, mais également les outils de programmation nécessaires pour y accéder.
Exemple de fichier plat
Le programme d'exemple exemples / example_1 / main.py
utilise le author_book_publisher.csv
fichier pour obtenir les données et les relations qu'il contient. Ce fichier CSV contient une liste des auteurs, des livres qu'ils ont publiés et des éditeurs de chacun des livres.
Remarque: Les fichiers de données utilisés dans les exemples sont disponibles dans le projet / données
annuaire. Il existe également un fichier programme dans le project / build_data
répertoire qui génère les données. Cette application est utile si vous modifiez les données et souhaitez revenir à un état connu.
Pour accéder aux fichiers de données utilisés dans cette section et tout au long du tutoriel, cliquez sur le lien ci-dessous:
Le fichier CSV présenté ci-dessus est un assez petit fichier de données contenant seulement quelques auteurs, livres et éditeurs. Vous devriez également remarquer certaines choses sur les données:
-
Les auteurs Stephen King et Tom Clancy apparaissent plusieurs fois, car plusieurs livres qu'ils ont publiés sont représentés dans les données.
-
Les auteurs Stephen King et Pearl Buck ont le même livre publié par plus d'un éditeur.
Ces champs de données dupliqués créent des relations entre d'autres parties des données. Un auteur peut écrire plusieurs livres et un éditeur peut travailler avec plusieurs auteurs. Les auteurs et les éditeurs partagent des relations avec des livres individuels.
Les relations dans le author_book_publisher.csv
sont représentés par des champs qui apparaissent plusieurs fois dans différentes lignes du fichier de données. En raison de cette redondance des données, les données représentent plus qu'une seule table bidimensionnelle. Vous en verrez davantage lorsque vous utiliserez le fichier pour créer un fichier de base de données SQLite.
Le programme d'exemple exemples / example_1 / main.py
utilise les relations intégrées dans le author_book_publisher.csv
fichier pour générer des données. Il présente d'abord une liste des auteurs et le nombre de livres que chacun a écrits. Il montre ensuite une liste d'éditeurs et le nombre d'auteurs pour lesquels chacun a publié des livres.
Il utilise également le treelib
module pour afficher une arborescence des auteurs, des livres et des éditeurs.
Enfin, il ajoute un nouveau livre aux données et réaffiche la hiérarchie de l'arborescence avec le nouveau livre en place. Ici se trouve le principale()
fonction de point d'entrée pour ce programme:
1 def principale():
2 "" "Le point d'entrée principal du programme" ""
3 # Obtenez les ressources pour le programme
4 avec Ressources.chemin(
5 "project.data", "author_book_publisher.csv"
6 ) comme chemin du fichier:
7 Les données = get_data(chemin du fichier)
8
9 # Obtenez le nombre de livres imprimés par chaque éditeur
dix books_by_publisher = get_books_by_publisher(Les données, Ascendant=Faux)
11 pour éditeur, total_books dans books_by_publisher.articles():
12 impression(F"Éditeur: éditeur, total de livres: total_books")
13 impression()
14
15 # Obtenez le nombre d'auteurs que chaque éditeur publie
16 author_by_publisher = get_authors_by_publisher(Les données, Ascendant=Faux)
17 pour éditeur, total_authors dans author_by_publisher.articles():
18 impression(F"Éditeur: éditeur, nombre total d'auteurs: total_authors")
19 impression()
20
21 # Sortie des données des auteurs hiérarchiques
22 output_author_hierarchy(Les données)
23
24 # Ajouter un nouveau livre à la structure de données
25 Les données = add_new_book(
26 Les données,
27 nom de l'auteur="Stephen King",
28 titre de livre="Le stand",
29 nom_éditeur="Maison aléatoire",
30 )
31
32 # Sortie des données mises à jour des auteurs hiérarchiques
33 output_author_hierarchy(Les données)
Le code Python ci-dessus suit les étapes suivantes:
- Lignes 4 à 7 lis le
author_book_publisher.csv
fichier dans un DataFrame pandas. - Lignes 10 à 13 imprimer le nombre de livres publiés par chaque éditeur.
- Lignes 16 à 19 imprimer le nombre d'auteurs associés à chaque éditeur.
- Ligne 22 renvoie les données du livre sous forme de hiérarchie triée par auteurs.
- Lignes 25 à 30 ajouter un nouveau livre à la structure en mémoire.
- Ligne 33 renvoie les données du livre sous forme de hiérarchie triée par auteurs, y compris le livre nouvellement ajouté.
L'exécution de ce programme génère la sortie suivante:
$ python main.py
Éditeur: Simon & Schuster, nombre total de livres: 4
Éditeur: Random House, nombre total de livres: 4
Éditeur: Penguin Random House, nombre total de livres: 2
Éditeur: Berkley, total des livres: 2
Éditeur: Simon & Schuster, nombre total d'auteurs: 4
Éditeur: Random House, nombre total d'auteurs: 3
Éditeur: Berkley, nombre total d'auteurs: 2
Éditeur: Penguin Random House, nombre total d'auteurs: 1
Auteurs
├── Alex Michaelides
│ └── Le patient silencieux
│ └── Simon et Schuster
├── Carol Shaben
│ └── Dans les abysses
│ └── Simon et Schuster
├── Isaac Asimov
│ └── Fondation
│ └── Random House
├── John Le Carré
│ └── Tinker, Tailor, Solider, Spy: Un roman de George Smiley
│ └── Berkley
├── Pearl Buck
│ └── La bonne terre
│ ├── Random House
│ └── Simon et Schuster
├── Stephen King
│ ├── Zone morte
│ │ └── Random House
│ ├── Il
│ │ ├── Pingouin Random House
│ │ └── Random House
│ └── Le brillant
│ └── Pingouin Random House
└── Tom Clancy
├── Patriot Games
│ └── Simon et Schuster
└── La chasse à octobre rouge
└── Berkley
La hiérarchie des auteurs ci-dessus est présentée deux fois dans la sortie, avec l'ajout de Stephen King's Le stand, publié par Random House. La sortie réelle ci-dessus a été modifiée et affiche uniquement la première sortie de la hiérarchie pour économiser de l'espace.
principale()
appelle d'autres fonctions pour effectuer l'essentiel du travail. La première fonction qu'il appelle est get_data ()
:
def get_data(chemin du fichier):
"" "Obtenir les données du livre à partir du fichier csv" ""
revenir pd.read_csv(chemin du fichier)
Cette fonction prend le chemin du fichier vers le fichier CSV et utilise des pandas pour le lire dans un pandas DataFrame, qu'elle renvoie ensuite à l'appelant. La valeur de retour de cette fonction devient la structure de données transmise aux autres fonctions qui composent le programme.
get_books_by_publisher ()
calcule le nombre de livres publiés par chaque éditeur. La série pandas résultante utilise la fonctionnalité pandas GroupBy pour regrouper par éditeur, puis trier en fonction de la Ascendant
drapeau:
def get_books_by_publisher(Les données, Ascendant=Vrai):
"" "Renvoie le nombre de livres de chaque éditeur sous forme de série pandas" ""
revenir Les données.par groupe("éditeur").Taille().sort_values(Ascendant=Ascendant)
get_authors_by_publisher ()
fait essentiellement la même chose que la fonction précédente, mais pour les auteurs:
def get_authors_by_publisher(Les données, Ascendant=Vrai):
"" "Renvoie le nombre d'auteurs de chaque éditeur en tant que série pandas" ""
revenir (
Les données.attribuer(Nom=Les données.Prénom.str.chat(Les données.nom de famille, SEP=""))
.par groupe("éditeur")
.nunique()
.loc[:[:[:[: "Nom"]
.sort_values(Ascendant=Ascendant)
)
add_new_book ()
crée un nouveau livre dans le pandas DataFrame. Le code vérifie si l'auteur, le livre ou l'éditeur existe déjà. Sinon, il crée un nouveau livre et l'ajoute au pandas DataFrame:
def add_new_book(Les données, nom de l'auteur, titre de livre, nom_éditeur):
"" "Ajoute un nouveau livre au système" ""
# Le livre existe-t-il?
Prénom, _, nom de famille = nom de l'auteur.cloison("")
si tout(
(Les données.Prénom == Prénom)
& (Les données.nom de famille == nom de famille)
& (Les données.Titre == titre de livre)
& (Les données.éditeur == nom_éditeur)
):
revenir Les données
# Ajouter le nouveau livre
revenir Les données.ajouter(
"Prénom": Prénom,
"nom de famille": nom de famille,
"Titre": titre de livre,
"éditeur": nom_éditeur,
,
ignore_index=Vrai,
)
output_author_hierarchy ()
utilise imbriqué pour
boucles pour parcourir les niveaux de la structure de données. Il utilise ensuite le treelib
module pour générer une liste hiérarchique des auteurs, des livres qu'ils ont publiés et des éditeurs qui ont publié ces livres:
def output_author_hierarchy(Les données):
"" "Sortie des données sous forme de liste hiérarchique des auteurs" ""
auteurs = Les données.attribuer(
Nom=Les données.Prénom.str.chat(Les données.nom de famille, SEP="")
)
author_tree = Arbre()
author_tree.create_node("Auteurs", "auteurs")
pour auteur, livres dans auteurs.par groupe("Nom"):
author_tree.create_node(auteur, auteur, parent="auteurs")
pour livre, éditeurs dans livres.par groupe("Titre")[[[["éditeur"]:
book_id = F"auteur:livre"
author_tree.create_node(livre, book_id, parent=auteur)
pour éditeur dans éditeurs:
author_tree.create_node(éditeur, parent=book_id)
# Sortie des données des auteurs hiérarchiques
author_tree.spectacle()
Cette application fonctionne bien et illustre la puissance dont vous disposez avec le module pandas. Le module offre une excellente fonctionnalité pour lire un fichier CSV et interagir avec les données.
Poussons et créons un programme fonctionnant de manière identique à l'aide de Python, une version de base de données SQLite des données de l'auteur et de la publication, et SQLAlchemy pour interagir avec ces données.
Utilisation de SQLite pour conserver les données
Comme vous l'avez vu précédemment, il y a des données redondantes dans le author_book_publisher.csv
fichier. Par exemple, toutes les informations sur Pearl Buck’s La bonne terre est répertorié deux fois car deux éditeurs différents ont publié le livre.
Imaginez si ce fichier de données contenait davantage de données connexes, telles que l'adresse et le numéro de téléphone de l'auteur, les dates de publication et les numéros ISBN des livres, ou les adresses, les numéros de téléphone et peut-être les revenus annuels des éditeurs. Ces données seraient dupliquées pour chaque élément de données racine, comme l'auteur, le livre ou l'éditeur.
Il est possible de créer des données de cette manière, mais ce serait extrêmement compliqué. Pensez aux problèmes de mise à jour de ce fichier de données. Et si Stephen King voulait changer de nom? Vous devez mettre à jour plusieurs enregistrements contenant son nom et vous assurer qu'il n'y a pas eu de fautes de frappe.
Pire que la duplication des données serait la complexité de l'ajout d'autres relations aux données. Et si vous décidiez d'ajouter des numéros de téléphone pour les auteurs et qu'ils avaient des numéros de téléphone pour la maison, le travail, le portable et peut-être plus? Chaque nouvelle relation que vous souhaitez ajouter pour un élément racine multiplierait le nombre d'enregistrements par le nombre d'éléments dans cette nouvelle relation.
Ce problème est l'une des raisons pour lesquelles des relations existent dans les systèmes de bases de données. Un sujet important de l'ingénierie des bases de données est normalisation de la base de donnéesou le processus de séparation des données pour réduire la redondance et augmenter l'intégrité. Lorsqu'une structure de base de données est étendue avec de nouveaux types de données, la normalisation préalable permet de minimiser les modifications de la structure existante.
La base de données SQLite est disponible en Python et, selon la page d'accueil de SQLite, elle est plus utilisée que tous les autres systèmes de base de données combinés. Il offre un système de gestion de base de données relationnelle (SGBDR) complet qui fonctionne avec un seul fichier pour maintenir toutes les fonctionnalités de la base de données.
Il présente également l'avantage de ne pas nécessiter de serveur de base de données distinct pour fonctionner. Le format de fichier de base de données est multiplateforme et accessible à tout langage de programmation prenant en charge SQLite.
Toutes ces informations sont intéressantes, mais en quoi est-ce pertinent pour l'utilisation de fichiers plats pour le stockage de données? Vous le découvrirez ci-dessous!
Création d'une structure de base de données
L'approche de la force brute pour obtenir le author_book_publisher.csv
données dans une base de données SQLite serait de créer une table unique correspondant à la structure du fichier CSV. Faire cela ignorerait une bonne partie de la puissance de SQLite.
Bases de données relationnelles fournissent un moyen de stocker des données structurées dans des tables et d'établir des relations entre ces tables. Ils utilisent généralement le langage SQL (Structured Query Language) comme principal moyen d'interagir avec les données. Ceci est une simplification excessive de ce que fournissent les SGBDR, mais c'est suffisant pour les besoins de ce didacticiel.
Une base de données SQLite prend en charge l'interaction avec la table de données à l'aide de SQL. Non seulement un fichier de base de données SQLite contient les données, mais il dispose également d'un moyen standardisé d'interagir avec les données. Cette prise en charge est intégrée au fichier, ce qui signifie que tout langage de programmation qui peut utiliser un fichier SQLite peut également utiliser SQL pour travailler avec lui.
Interagir avec une base de données avec SQL
SQL est un langage déclaratif utilisé pour créer, gérer et interroger les données contenues dans une base de données. Un langage déclaratif décrit quoi doit être accompli plutôt que Comment il doit être accompli. Vous verrez des exemples d'instructions SQL plus tard lorsque vous créerez des tables de base de données.
Structurer une base de données avec SQL
Pour tirer parti de la puissance de SQL, vous devez appliquer une certaine normalisation de la base de données aux données du author_book_publisher.csv
fichier. Pour ce faire, vous séparez les auteurs, les livres et les éditeurs dans des tables de base de données distinctes.
Conceptuellement, les données sont stockées dans la base de données dans des structures de table bidimensionnelles. Chaque tableau se compose de rangées de records, et chaque enregistrement se compose de colonnes, ou des champs, contenant des données.
Les données contenues dans les champs sont de types prédéfinis, notamment du texte, des entiers, des flottants, etc. Les fichiers CSV sont différents car tous les champs sont du texte et doivent être analysés par un programme pour qu'un type de données leur soit attribué.
Chaque enregistrement du tableau a un clé primaire défini pour donner à un enregistrement un identifiant unique. La clé primaire est similaire à la clé d'un dictionnaire Python. Le moteur de base de données lui-même génère souvent la clé primaire sous la forme d'une valeur entière incrémentielle pour chaque enregistrement inséré dans la table de base de données.
Bien que la clé primaire soit souvent générée automatiquement par le moteur de base de données, ce n’est pas nécessaire. Si les données stockées dans un champ sont uniques parmi toutes les autres données de la table de ce champ, il peut s'agir de la clé primaire. Par exemple, un tableau contenant des données sur les livres pourrait utiliser l'ISBN du livre comme clé primaire.
Création de tables avec SQL
Voici comment créer les trois tables représentant les auteurs, les livres et les éditeurs dans le fichier CSV à l'aide d'instructions SQL:
CRÉER TABLE auteur (
author_id ENTIER NE PAS NUL PRIMAIRE CLÉ,
Prénom VARCHAR,
nom de famille VARCHAR
);
CRÉER TABLE livre (
book_id ENTIER NE PAS NUL PRIMAIRE CLÉ,
author_id ENTIER LES RÉFÉRENCES auteur,
Titre VARCHAR
);
CRÉER TABLE éditeur (
publisher_id ENTIER NE PAS NUL PRIMAIRE CLÉ,
Nom VARCHAR
);
Notez qu'il n'y a aucune opération sur les fichiers, aucune variable créée et aucune structure pour les contenir. Les instructions décrivent uniquement le résultat souhaité: la création d'une table avec des attributs particuliers. Le moteur de base de données détermine comment procéder.
Une fois que vous avez créé et rempli ce tableau avec les données d'auteur du author_book_publisher.csv
fichier, vous pouvez y accéder à l'aide d'instructions SQL. L'instruction suivante (également appelée requete) utilise le caractère générique (*
) pour obtenir toutes les données du auteur
table et affichez-la:
Vous pouvez utiliser le sqlite3
outil de ligne de commande pour interagir avec le author_book_publisher.db
fichier de base de données dans le projet / données
annuaire:
$ sqlite3 author_book_publisher.db
Une fois que l'outil de ligne de commande SQLite est en cours d'exécution avec la base de données ouverte, vous pouvez entrer des commandes SQL. Voici la commande SQL ci-dessus et sa sortie, suivie de .q
commande pour quitter le programme:
sqlite> SÉLECTIONNER * DE auteur;
1 | Isaac | Asimov
2 | Perle | Buck
3 | Tom | Clancy
4 | Stephen | Roi
5 | John | Le Carré
6 | Alex | Michaelides
7 | Carol | Shaben
sqlite> .q
Notez que chaque auteur n'existe qu'une seule fois dans le tableau. Contrairement au fichier CSV, qui avait plusieurs entrées pour certains auteurs, ici, un seul enregistrement unique par auteur est nécessaire.
Maintenance d'une base de données avec SQL
SQL fournit des moyens de travailler avec des bases de données et des tables existantes en insérant de nouvelles données et en mettant à jour ou en supprimant des données existantes. Voici un exemple d'instruction SQL pour insérer un nouvel auteur dans le auteur
table:
INSÉRER DANS auteur
(Prénom, nom de famille)
VALEURS ('Paul', «Mendez»);
Cette instruction SQL insère les valeurs "Paul
' et 'Mendez
«Dans les colonnes respectives Prénom
et nom de famille
du auteur
table.
Notez que le author_id
la colonne n’est pas spécifiée. Étant donné que cette colonne est la clé primaire, le moteur de base de données génère la valeur et l'insère dans le cadre de l'exécution de l'instruction.
La mise à jour des enregistrements dans une table de base de données est un processus simple. Par exemple, supposons que Stephen King veuille être connu sous son pseudonyme, Richard Bachman. Voici une instruction SQL pour mettre à jour l'enregistrement de la base de données:
MISE À JOUR auteur
ENSEMBLE Prénom = 'Richard', nom de famille = «Bachman»
OÙ Prénom = «Stephen» ET nom de famille = 'Roi';
L'instruction SQL localise l'enregistrement unique pour 'Stephen King'
en utilisant l'instruction conditionnelle WHERE first_name = 'Stephen' AND last_name = 'King'
puis met à jour le Prénom
et nom de famille
champs avec les nouvelles valeurs. SQL utilise le signe égal (=
) en tant qu'opérateur de comparaison et opérateur d'affectation.
Vous pouvez également supprimer des enregistrements d'une base de données. Voici un exemple d'instruction SQL pour supprimer un enregistrement de la auteur
table:
EFFACER DE auteur
OÙ Prénom = 'Paul'
ET nom de famille = «Mendez»;
Cette instruction SQL supprime une seule ligne du auteur
table où le Prénom
est égal à 'Paul'
et le nom de famille
est égal à «Mendez»
.
Soyez prudent lorsque vous supprimez des enregistrements! Les conditions que vous définissez doivent être aussi spécifiques que possible. Une condition trop large peut entraîner la suppression de plus d'enregistrements que prévu. Par exemple, si la condition était basée uniquement sur la ligne first_name = 'Paul'
, alors tous les auteurs dont le prénom est Paul seraient supprimés de la base de données.
Remarque: Pour éviter la suppression accidentelle d'enregistrements, de nombreuses applications n'autorisent pas du tout les suppressions. Au lieu de cela, l'enregistrement a une autre colonne pour indiquer s'il est utilisé ou non. Cette colonne peut être nommée actif
et contiennent une valeur évaluée à True ou False, indiquant si l'enregistrement doit être inclus lors de l'interrogation de la base de données.
Par exemple, la requête SQL ci-dessous obtiendrait toutes les colonnes de tous les enregistrements actifs dans une_table
:
SÉLECTIONNER
*
DE une_table
OÙ actif = 1;
SQLite n'a pas de type de données booléen, donc le actif
la colonne est représentée par un entier avec une valeur de 0
ou 1
pour indiquer l'état du dossier. D'autres systèmes de base de données peuvent avoir ou non des types de données booléens natifs.
Il est tout à fait possible de créer des applications de base de données en Python en utilisant des instructions SQL directement dans le code. Cela renvoie les données à l'application sous forme de liste de listes ou de liste de dictionnaires.
L'utilisation de SQL brut est un moyen parfaitement acceptable de travailler avec les données renvoyées par les requêtes à la base de données. Cependant, plutôt que de faire cela, vous allez passer directement à l’utilisation de SQLAlchemy pour travailler avec des bases de données.
Construire des relations
Une autre caractéristique des systèmes de base de données que vous pourriez trouver encore plus puissante et utile que la persistance et la récupération des données est des relations. Les bases de données qui prennent en charge les relations vous permettent de diviser les données en plusieurs tables et d'établir des connexions entre elles.
Les données dans le author_book_publisher.csv
fichier représente les données et les relations en dupliquant les données. Une base de données gère cela en divisant les données en trois tables:auteur
, livre
, et éditeur
—Et établir des relations entre eux.
Après avoir rassemblé toutes les données souhaitées au même endroit dans le fichier CSV, pourquoi voudriez-vous le diviser en plusieurs tables? Ne serait-il pas plus difficile de créer et de reconstituer? C’est vrai dans une certaine mesure, mais les avantages de fractionner les données et de les reconstituer à l’aide de SQL pourraient vous convaincre!
Relations un-à-plusieurs
UNE un-à-plusieurs La relation est comme celle d'un client qui commande des articles en ligne. Un client peut avoir plusieurs commandes, mais chaque commande appartient à un client. le author_book_publisher.db
base de données a une relation un-à-plusieurs sous la forme d'auteurs et de livres. Chaque auteur peut écrire plusieurs livres, mais chaque livre est écrit par un auteur.
Comme vous l'avez vu dans la création de table ci-dessus, l'implémentation de ces entités distinctes consiste à placer chacune dans une table de base de données, une pour les auteurs et une pour les livres. Mais comment la relation un-à-plusieurs entre ces deux tables est-elle implémentée?
N'oubliez pas que chaque table d'une base de données a un champ désigné comme clé primaire pour cette table. Chaque table ci-dessus a un champ de clé primaire nommé à l'aide de ce modèle: