Python MySQL - controlador mysql-connector

MySQL es el sistema de gestión de bases de datos relacional más popular; si no estás familiarizado con MySQL, puedes leer nuestroTutorial de MySQL.

En este capítulo presentamos el uso demysql-connectorpara conectarse y usar MySQL,mysql-connectorSíMySQLel controlador proporcionado oficialmente.

Podemos usar el comandopippara instalarmysql-connector:

python -m pip install mysql-connector

Usa el siguiente código para probar si mysql-connector se instaló correctamente:

demo_mysql_test.py:

import mysql.connector

Ejecuta el código anterior; si no se produce ningún error, indica que la instalación fue exitosa.

Nota.Nota:Si tu MySQL es la versión 8.0, el método de verificación del complemento de contraseña ha cambiado. En versiones anteriores era mysql_native_password, en la versión 8.0 es caching_sha2_password, por lo que se necesitan algunos cambios:

Primero modifica la configuración de my.ini:

[mysqld]
default_authentication_plugin=mysql_native_password

Luego ejecuta el siguiente comando en mysql para modificar la contraseña:

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

Para más contenido, consulta:Problema de conexión con Python MySQL 8.0。


Crear conexión a la base de datos

Puedes usar el siguiente código para conectarte a la base de datos:

demo_mysql_test.py:

import mysql.connector mydb = mysql.connector.connect( host="localhost", # Dirección del host de la base de datos user="yourusername", # Nombre de usuario de la base de datos passwd="yourpassword" # Contraseña de la base de datos ) print(mydb)

Crear base de datos

Para crear una base de datos se usa la sentencia "CREATE DATABASE"; a continuación se crea una base de datos llamada ejemplo_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 ejemplo_db")

Antes de crear la base de datos, también podemos usar la sentencia "SHOW DATABASES" para ver si la base de datos existe:

demo_mysql_test.py:

Mostrar la lista de todas las bases de datos:

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)

O podemos conectarnos directamente a la base de datos; si la base de datos no existe, se mostrará un mensaje de error:

demo_mysql_test.py:

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

Crear tabla de datos

Para crear una tabla de datos se usa la sentencia"CREATE TABLE"; antes de crear la tabla, hay que asegurarse de que la base de datos ya exista. A continuación se crea una tabla llamadasites:

demo_mysql_test.py:

import mysql.connector mydb = mysql.connector.connect( host="localhost", user="root", passwd="123456", database="ejemplo_db" ) mycursor = mydb.cursor() mycursor.execute("CREATE TABLE sites (name VARCHAR(255), url VARCHAR(255))")
Después de ejecutarlo correctamente, podemos ver la tabla sites creada en la base de datos, con los campos name y url.

También podemos usar la sentencia"SHOW TABLES"para ver si la tabla de datos ya existe:

demo_mysql_test.py:

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

Configuración de clave primaria

Al crear una tabla, generalmente configuramos una clave primaria (PRIMARY KEY). Podemos usar la sentencia"INT AUTO_INCREMENT PRIMARY KEY"para crear una clave primaria; el valor inicial de la clave primaria es 1 y se incrementa gradualmente.

Si nuestra tabla ya ha sido creada, debemos usarALTER TABLEpara agregar la clave primaria a la tabla:

demo_mysql_test.py:

Agregar clave primaria a la tabla sites.

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

Si aún no has creado la tabla sites, puedes usar directamente el siguiente código para crearla.

demo_mysql_test.py:

Crear la clave primaria para la tabla.

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

Insertar datos

Para insertar datos se usa la sentencia"INSERT INTO":

demo_mysql_test.py:

Insertar un registro en la tabla sites.

import mysql.connector mydb = mysql.connector.connect( host="localhost", user="root", passwd="123456", database="ejemplo_db" ) mycursor = mydb.cursor() sql = "INSERT INTO sites (name, url) VALUES (%s, %s)" val = ("EJEMPLO", "https://www.example.com") mycursor.execute(sql, val) mydb.commit() # El contenido de la tabla de datos ha cambiado; es obligatorio usar esta sentencia print(mycursor.rowcount, "Registro insertado correctamente.")

Ejecuta el código; el resultado es:

1 记录插入成功

Inserción por lotes

Para la inserción por lotes se usa el métodoexecutemany(); el segundo parámetro de este método es una lista de tuplas que contiene los datos que queremos insertar:

demo_mysql_test.py:

Insertar varios registros en la tabla sites.

import mysql.connector mydb = mysql.connector.connect( host="localhost", user="root", passwd="123456", database="ejemplo_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() # El contenido de la tabla de datos ha cambiado; es obligatorio usar esta sentencia print(mycursor.rowcount, "Registros insertados correctamente.")

Ejecuta el código; el resultado es:

4 记录插入成功。

Después de ejecutar el código anterior, podemos ver los registros de la tabla de datos:

Si después de insertar el registro de datos queremos obtener el ID de ese registro, podemos usar el siguiente código:

demo_mysql_test.py:

import mysql.connector mydb = mysql.connector.connect( host="localhost", user="root", passwd="123456", database="ejemplo_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 registro insertado, ID:", mycursor.lastrowid)

Ejecuta el código; el resultado es:

1 条记录已插入, ID: 6

Consultar datos

Para consultar datos se usa la sentenciaSELECT:

demo_mysql_test.py:

import mysql.connector mydb = mysql.connector.connect( host="localhost", user="root", passwd="123456", database="ejemplo_db" ) mycursor = mydb.cursor() mycursor.execute("SELECT * FROM sites") myresult = mycursor.fetchall() # fetchall() obtiene todos los registros for x in myresult: print(x)

Ejecuta el código; el resultado es:

(1, 'EJEMPLO', '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')

También se pueden leer los datos de campos específicos:

demo_mysql_test.py:

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

Ejecuta el código; el resultado es:

('EJEMPLO', '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 solo queremos leer un dato, podemos usar el métodofetchone():

demo_mysql_test.py:

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

Ejecuta el código; el resultado es:

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

Sentencia de condición WHERE

Si queremos leer datos con condiciones específicas, podemos usar la sentenciawhere:

demo_mysql_test.py

Leer el registro donde el campo name sea EJEMPLO:

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

Ejecuta el código; el resultado es:

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

También se pueden usar comodines%:

demo_mysql_test.py

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

Ejecuta el código; el resultado es:

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

Para evitar ataques de inyección SQL en las consultas a la base de datos, podemos usar el marcador de posición%spara escapar las condiciones de la consulta:

demo_mysql_test.py

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

Ordenamiento

Para ordenar los resultados de la consulta se puede usar la sentenciaORDER BY; el método de ordenamiento predeterminado es ascendente y la palabra clave esASC; si se desea configurar el ordenamiento descendente, se puede establecer la palabra claveDESC。

demo_mysql_test.py

Ordenar por el campo name en orden alfabético ascendente:

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

Ejecuta el código; el resultado es:

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

Ejemplo de ordenamiento descendente:

demo_mysql_test.py

Ordenar por el campo name en orden alfabético descendente:

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

Ejecuta el código; el resultado es:

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

Limit

Si queremos establecer la cantidad de datos a consultar, podemos usar la sentencia"LIMIT"para especificarlo

demo_mysql_test.py

Leer los primeros 3 registros:

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

Ejecuta el código; el resultado es:

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

También se puede especificar la posición inicial; la palabra clave utilizada esOFFSET:

demo_mysql_test.py

Leer 3 registros a partir del segundo:

import mysql.connector mydb = mysql.connector.connect( host="localhost", user="root", passwd="123456", database="ejemplo_db" ) mycursor = mydb.cursor() mycursor.execute("SELECT * FROM sites LIMIT 3 OFFSET 1") # 0 es el primero, 1 es el segundo, y así sucesivamente myresult = mycursor.fetchall() for x in myresult: print(x)

Ejecuta el código; el resultado es:

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

Eliminar registros

Para eliminar registros se usa la sentencia"DELETE FROM":

demo_mysql_test.py

Eliminar el registro cuyo name sea stackoverflow:

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

Ejecuta el código; el resultado es:

1  条记录删除

Nota:Debes usar la sentencia de borrado con precaución. Asegúrate de especificar la cláusula WHERE; de lo contrario, se eliminarán todos los datos de la tabla.

Para evitar ataques de inyección SQL en las consultas a la base de datos, podemos usar el marcador de posición%spara escapar las condiciones de la sentencia de borrado:

demo_mysql_test.py

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

Ejecuta el código; el resultado es:

1  条记录删除

Actualizar datos de la tabla

Para actualizar la tabla de datos se usa la sentencia"UPDATE":

demo_mysql_test.py

Cambiar el campo del registro cuyo name es Zhihu a ZH:

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

Ejecuta el código; el resultado es:

1  条记录被修改

Nota:La sentencia UPDATE debe asegurarse de especificar la cláusula WHERE; de lo contrario, se actualizarán todos los datos de la tabla.

Para evitar ataques de inyección SQL en las consultas a la base de datos, podemos usar el marcador de posición %s para escapar las condiciones de la sentencia de actualización:

demo_mysql_test.py

import mysql.connector mydb = mysql.connector.connect( host="localhost", user="root", passwd="123456", database="ejemplo_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, "registros modificados")

Ejecuta el código; el resultado es:

1  条记录被修改

Eliminar tabla

Para eliminar una tabla se usa la sentencia"DROP TABLE"; la palabra claveIF EXISTSse usa para determinar si la tabla existe; solo se elimina si existe:

demo_mysql_test.py

import mysql.connector mydb = mysql.connector.connect( host="localhost", user="root", passwd="123456", database="ejemplo_db" ) mycursor = mydb.cursor() sql = "DROP TABLE IF EXISTS sites" # Eliminar la tabla de datos sites mycursor.execute(sql)
Otras extensiones