Python MySQL - pilote mysql-connector

MySQL est le système de gestion de bases de données relationnelles le plus populaire. Si vous n'êtes pas familier avec MySQL, vous pouvez lire notretutoriel MySQL.

Ce chapitre présente l'utilisation demysql-connectorpour se connecter à et utiliser MySQL,mysql-connectorest, pourMySQL,le pilote officiellement fourni.

Nous pouvons utiliser la commandepippour installermysql-connector:

python -m pip install mysql-connector

Utilisez le code suivant pour tester si mysql-connector a été installé avec succès :

demo_mysql_test.py :

import mysql.connector

Exécutez le code ci-dessus. Si aucune erreur ne se produit, l'installation a réussi.

RemarqueRemarque :Si votre MySQL est en version 8.0, la méthode d'authentification du plugin de mot de passe a changé. La version précédente utilisait mysql_native_password, et la version 8.0 utilise caching_sha2_password, donc certaines modifications doivent être apportées :

Modifiez d'abord la configuration my.ini :

[mysqld]
default_authentication_plugin=mysql_native_password

Exécutez ensuite les commandes suivantes sous MySQL pour changer le mot de passe :

ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '新密码';

Pour plus de contenu, vous pouvez vous référer à :Problème de connexion Python MySQL 8.0。


Création d'une connexion à la base de données

Vous pouvez utiliser le code suivant pour vous connecter à la base de données :

demo_mysql_test.py :

import mysql.connector mydb = mysql.connector.connect( host="localhost", # Adresse de l'hôte de la base de données user="yourusername", # Nom d'utilisateur de la base de données passwd="yourpassword" # Mot de passe de la base de données ) print(mydb)

Création d'une base de données

Pour créer une base de données, utilisez l'instruction "CREATE DATABASE". Ce qui suit crée une base de données nommée example_db :

demo_mysql_test.py :

import mysql.connector mydb = mysql.connector.connect( host="localhost", user="root", passwd="123456" ) mycursor = mydb.cursor() mycursor.execute("CREATE DATABASE example_db")

Avant de créer une base de données, nous pouvons également utiliser l'instruction "SHOW DATABASES" pour vérifier si la base de données existe :

demo_mysql_test.py :

Afficher la liste de toutes les bases de données :

import mysql.connector mydb = mysql.connector.connect( host="localhost", user="root", passwd="123456" ) mycursor = mydb.cursor() mycursor.execute("SHOW DATABASES") for x in mycursor: print(x)

Alternativement, nous pouvons nous connecter directement à la base de données. Si la base de données n'existe pas, un message d'erreur sera affiché :

demo_mysql_test.py :

import mysql.connector mydb = mysql.connector.connect( host="localhost", user="root", passwd="123456", database="example_db" )

Création d'une table de données

Pour créer une table de données, utilisez l'instruction"CREATE TABLE". Avant de créer une table de données, vous devez vous assurer que la base de données existe déjà. Ce qui suit crée une table de donnéessites:

demo_mysql_test.py :

import mysql.connector mydb = mysql.connector.connect( host="localhost", user="root", passwd="123456", database="example_db" ) mycursor = mydb.cursor() mycursor.execute("CREATE TABLE sites (name VARCHAR(255), url VARCHAR(255))")
Après une exécution réussie, nous pouvons voir la table de données sites créée dans la base de données, avec les champs name et url.

Nous pouvons également utiliser l'instruction"SHOW TABLES"pour vérifier si la table de données existe déjà :

demo_mysql_test.py :

import mysql.connector mydb = mysql.connector.connect( host="localhost", user="root", passwd="123456", database="example_db" ) mycursor = mydb.cursor() mycursor.execute("SHOW TABLES") for x in mycursor: print(x)

Configuration de la clé primaire

Lors de la création d'une table, nous définissons généralement une clé primaire (PRIMARY KEY). Nous pouvons utiliser l'instruction"INT AUTO_INCREMENT PRIMARY KEY"pour créer une clé primaire. La clé primaire commence à 1 et s'incrémente pas à pas.

Si notre table a déjà été créée, nous devons utiliserALTER TABLEpour ajouter une clé primaire à la table :

demo_mysql_test.py :

Ajouter une clé primaire à la table sites.

import mysql.connector mydb = mysql.connector.connect( host="localhost", user="root", passwd="123456", database="example_db" ) mycursor = mydb.cursor() mycursor.execute("ALTER TABLE sites ADD COLUMN id INT AUTO_INCREMENT PRIMARY KEY")

Si vous n'avez pas encore créé la table sites, vous pouvez directement utiliser le code suivant pour la créer.

demo_mysql_test.py :

Créer une clé primaire pour la table.

import mysql.connector mydb = mysql.connector.connect( host="localhost", user="root", passwd="123456", database="example_db" ) mycursor = mydb.cursor() mycursor.execute("CREATE TABLE sites (id INT AUTO_INCREMENT PRIMARY KEY, name VARCHAR(255), url VARCHAR(255))")

Insertion de données

Pour insérer des données, utilisez la"INSERT INTO"instruction :

demo_mysql_test.py :

Insérez un enregistrement dans la table sites.

import mysql.connector mydb = mysql.connector.connect( host="localhost", user="root", passwd="123456", database="example_db" ) mycursor = mydb.cursor() sql = "INSERT INTO sites (name, url) VALUES (%s, %s)" val = ("EXAMPLE", "https://www.example.com") mycursor.execute(sql, val) mydb.commit() # Le contenu de la table de données a été mis à jour ; cette instruction doit être utilisée print(mycursor.rowcount, "L'enregistrement a été inséré avec succès.")

Exécutez le code, et le résultat de sortie est :

1 记录插入成功

Insertion par lots

Pour l'insertion par lots, utilisez laexecutemany()méthode. Le deuxième paramètre de cette méthode est une liste de tuples, contenant les données que nous voulons insérer :

demo_mysql_test.py :

Insérer plusieurs enregistrements dans la table sites.

import mysql.connector mydb = mysql.connector.connect( host="localhost", user="root", passwd="123456", database="example_db" ) mycursor = mydb.cursor() sql = "INSERT INTO sites (name, url) VALUES (%s, %s)" val = [ ('Google', 'https://www.google.com'), ('Github', 'https://www.github.com'), ('Taobao', 'https://www.taobao.com'), ('stackoverflow', 'https://www.stackoverflow.com/') ] mycursor.executemany(sql, val) mydb.commit() # Le contenu de la table de données a été mis à jour ; cette instruction doit être utilisée print(mycursor.rowcount, "Les enregistrements ont été insérés avec succès.")

Exécutez le code, et le résultat de sortie est :

4 记录插入成功。

Après avoir exécuté le code ci-dessus, nous pouvons examiner les enregistrements dans la table de données :

Si nous voulons obtenir l'ID de l'enregistrement après avoir inséré les données, nous pouvons utiliser le code suivant :

demo_mysql_test.py :

import mysql.connector mydb = mysql.connector.connect( host="localhost", user="root", passwd="123456", database="example_db" ) mycursor = mydb.cursor() sql = "INSERT INTO sites (name, url) VALUES (%s, %s)" val = ("Zhihu", "https://www.zhihu.com") mycursor.execute(sql, val) mydb.commit() print("1 enregistrement inséré, ID :", mycursor.lastrowid)

Exécutez le code, et le résultat de sortie est :

1 条记录已插入, ID: 6

Interroger les données

Pour interroger des données, utilisez l'instructionSELECT:

demo_mysql_test.py :

import mysql.connector mydb = mysql.connector.connect( host="localhost", user="root", passwd="123456", database="example_db" ) mycursor = mydb.cursor() mycursor.execute("SELECT * FROM sites") myresult = mycursor.fetchall() # fetchall() récupère tous les enregistrements for x in myresult: print(x)

Exécutez le code, et le résultat de sortie est :

(1, 'EXAMPLE', 'https://www.example.com')
(2, 'Google', 'https://www.google.com')
(3, 'Github', 'https://www.github.com')
(4, 'Taobao', 'https://www.taobao.com')
(5, 'stackoverflow', 'https://www.stackoverflow.com/')
(6, 'Zhihu', 'https://www.zhihu.com')

Vous pouvez également lire des données à partir de champs spécifiés :

demo_mysql_test.py :

import mysql.connector mydb = mysql.connector.connect( host="localhost", user="root", passwd="123456", database="example_db" ) mycursor = mydb.cursor() mycursor.execute("SELECT name, url FROM sites") myresult = mycursor.fetchall() for x in myresult: print(x)

Exécutez le code, et le résultat de sortie est :

('EXAMPLE', 'https://www.example.com')
('Google', 'https://www.google.com')
('Github', 'https://www.github.com')
('Taobao', 'https://www.taobao.com')
('stackoverflow', 'https://www.stackoverflow.com/')
('Zhihu', 'https://www.zhihu.com')

Si nous voulons lire un seul enregistrement, nous pouvons utiliser la méthodefetchone():

demo_mysql_test.py :

import mysql.connector mydb = mysql.connector.connect( host="localhost", user="root", passwd="123456", database="example_db" ) mycursor = mydb.cursor() mycursor.execute("SELECT * FROM sites") myresult = mycursor.fetchone() print(myresult)

Exécutez le code, et le résultat de sortie est :

(1, 'EXAMPLE', 'https://www.example.com')

Instruction conditionnelle WHERE

Si nous voulons lire des données avec des conditions spécifiées, nous pouvons utiliser l'instructionwhere:

demo_mysql_test.py

Lire les enregistrements dont le champ name est EXAMPLE :

import mysql.connector mydb = mysql.connector.connect( host="localhost", user="root", passwd="123456", database="example_db" ) mycursor = mydb.cursor() sql = "SELECT * FROM sites WHERE name ='EXAMPLE'" mycursor.execute(sql) myresult = mycursor.fetchall() for x in myresult: print(x)

Exécutez le code, et le résultat de sortie est :

(1, 'EXAMPLE', 'https://www.example.com')

Vous pouvez également utiliser des caractères génériques%:

demo_mysql_test.py

import mysql.connector mydb = mysql.connector.connect( host="localhost", user="root", passwd="123456", database="example_db" ) mycursor = mydb.cursor() sql = "SELECT * FROM sites WHERE url LIKE '%oo%'" mycursor.execute(sql) myresult = mycursor.fetchall() for x in myresult: print(x)

Exécutez le code, et le résultat de sortie est :

(1, 'EXAMPLE', 'https://www.example.com')
(2, 'Google', 'https://www.google.com')

Pour éviter les attaques par injection SQL dans les requêtes de base de données, nous pouvons utiliser%splaceholder pour échapper aux conditions de la requête :

demo_mysql_test.py

import mysql.connector mydb = mysql.connector.connect( host="localhost", user="root", passwd="123456", database="example_db" ) mycursor = mydb.cursor() sql = "SELECT * FROM sites WHERE name = %s" na = ("EXAMPLE", ) mycursor.execute(sql, na) myresult = mycursor.fetchall() for x in myresult: print(x)

Tri

Les résultats de la requête peuvent être triés à l'aide de la clauseORDER BY. La méthode de tri par défaut est l'ordre croissant, avec le mot-cléASC. Si vous souhaitez définir l'ordre décroissant, vous pouvez définir le mot-cléDESC。

demo_mysql_test.py

Trier par ordre croissant selon les lettres du champ name :

import mysql.connector mydb = mysql.connector.connect( host="localhost", user="root", passwd="123456", database="example_db" ) mycursor = mydb.cursor() sql = "SELECT * FROM sites ORDER BY name" mycursor.execute(sql) myresult = mycursor.fetchall() for x in myresult: print(x)

Exécutez le code, et le résultat de sortie est :

(3, 'Github', 'https://www.github.com')
(2, 'Google', 'https://www.google.com')
(1, 'EXAMPLE', 'https://www.example.com')
(5, 'stackoverflow', 'https://www.stackoverflow.com/')
(4, 'Taobao', 'https://www.taobao.com')
(6, 'Zhihu', 'https://www.zhihu.com')

Exemple de tri par ordre décroissant :

demo_mysql_test.py

Trier par ordre décroissant selon les lettres du champ name :

import mysql.connector mydb = mysql.connector.connect( host="localhost", user="root", passwd="123456", database="example_db" ) mycursor = mydb.cursor() sql = "SELECT * FROM sites ORDER BY name DESC" mycursor.execute(sql) myresult = mycursor.fetchall() for x in myresult: print(x)

Exécutez le code, et le résultat de sortie est :

(6, 'Zhihu', 'https://www.zhihu.com')
(4, 'Taobao', 'https://www.taobao.com')
(5, 'stackoverflow', 'https://www.stackoverflow.com/')
(1, 'EXAMPLE', 'https://www.example.com')
(2, 'Google', 'https://www.google.com')
(3, 'Github', 'https://www.github.com')

Limite

Si nous voulons définir la quantité de données à interroger, nous pouvons utiliser la commande"LIMIT"pour spécifier

demo_mysql_test.py

Lire les 3 premiers enregistrements :

import mysql.connector mydb = mysql.connector.connect( host="localhost", user="root", passwd="123456", database="example_db" ) mycursor = mydb.cursor() mycursor.execute("SELECT * FROM sites LIMIT 3") myresult = mycursor.fetchall() for x in myresult: print(x)

Exécutez le code, et le résultat de sortie est :

(1, 'EXAMPLE', 'https://www.example.com')
(2, 'Google', 'https://www.google.com')
(3, 'Github', 'https://www.github.com')

Vous pouvez également spécifier la position de départ. Le mot-clé utilisé estOFFSET:

demo_mysql_test.py

Lire les 3 premiers enregistrements à partir du deuxième enregistrement :

import mysql.connector mydb = mysql.connector.connect( host="localhost", user="root", passwd="123456", database="example_db" ) mycursor = mydb.cursor() mycursor.execute("SELECT * FROM sites LIMIT 3 OFFSET 1") # 0 est le premier, 1 est le deuxième, et ainsi de suite myresult = mycursor.fetchall() for x in myresult: print(x)

Exécutez le code, et le résultat de sortie est :

(2, 'Google', 'https://www.google.com')
(3, 'Github', 'https://www.github.com')
(4, 'Taobao', 'https://www.taobao.com')

Supprimer l'enregistrement

Pour supprimer des enregistrements, utilisez l'instruction"DELETE FROM":

demo_mysql_test.py

Supprimer les enregistrements où name est stackoverflow :

import mysql.connector mydb = mysql.connector.connect( host="localhost", user="root", passwd="123456", database="example_db" ) mycursor = mydb.cursor() sql = "DELETE FROM sites WHERE name = 'stackoverflow'" mycursor.execute(sql) mydb.commit() print(mycursor.rowcount, "enregistrement(s) supprimé(s)")

Exécutez le code, et le résultat de sortie est :

1  条记录删除

Remarque :Utilisez l'instruction DELETE avec prudence. Assurez-vous que la condition WHERE est spécifiée dans l'instruction DELETE, sinon toutes les données de la table seront supprimées.

Pour éviter les attaques par injection SQL dans les requêtes de base de données, nous pouvons utiliser%splaceholder pour échapper les conditions de l'instruction DELETE :

demo_mysql_test.py

import mysql.connector mydb = mysql.connector.connect( host="localhost", user="root", passwd="123456", database="example_db" ) mycursor = mydb.cursor() sql = "DELETE FROM sites WHERE name = %s" na = ("stackoverflow", ) mycursor.execute(sql, na) mydb.commit() print(mycursor.rowcount, "enregistrement(s) supprimé(s)")

Exécutez le code, et le résultat de sortie est :

1  条记录删除

Mettre à jour les données de la table

Pour mettre à jour une table de données, utilisez l'instruction"UPDATE":

demo_mysql_test.py

Remplacez les données du champ nommé Zhihu par ZH :

import mysql.connector mydb = mysql.connector.connect( host="localhost", user="root", passwd="123456", database="example_db" ) mycursor = mydb.cursor() sql = "UPDATE sites SET name = 'ZH' WHERE name = 'Zhihu'" mycursor.execute(sql) mydb.commit() print(mycursor.rowcount, "enregistrement(s) modifié(s)")

Exécutez le code, et le résultat de sortie est :

1  条记录被修改

Remarque :Assurez-vous que l'instruction UPDATE spécifie une condition WHERE, sinon toutes les données de la table seront mises à jour.

Pour éviter les attaques par injection SQL dans les requêtes de base de données, nous pouvons utiliser l'espace réservé %s pour échapper aux conditions de l'instruction UPDATE :

demo_mysql_test.py

import mysql.connector mydb = mysql.connector.connect( host="localhost", user="root", passwd="123456", database="example_db" ) mycursor = mydb.cursor() sql = "UPDATE sites SET name = %s WHERE name = %s" val = ("Zhihu", "ZH") mycursor.execute(sql, val) mydb.commit() print(mycursor.rowcount, "enregistrement(s) modifié(s)")

Exécutez le code, et le résultat de sortie est :

1  条记录被修改

Supprimer la table

Pour supprimer une table, utilisez l'instruction"DROP TABLE".IF EXISTSLe mot-clé est utilisé pour déterminer si la table existe, et elle n'est supprimée que si elle existe :

demo_mysql_test.py

import mysql.connector mydb = mysql.connector.connect( host="localhost", user="root", passwd="123456", database="example_db" ) mycursor = mydb.cursor() sql = "DROP TABLE IF EXISTS sites" # Supprimer la table de données sites mycursor.execute(sql)
Autres extensions