Python MySQL — драйвер mysql-connector

MySQL — самая популярная реляционная система управления базами данных. Если вы не знакомы с MySQL, можете прочитать нашучебник по MySQL.

В этой главе рассказывается об использованииmysql-connectorдля подключения к MySQL и работы с ней,mysql-connectorявляетсяMySQLофициально предоставляемым драйвером.

Мы можем использовать командуpipдля установкиmysql-connector:

python -m pip install mysql-connector

Используйте следующий код, чтобы проверить, успешно ли установлен mysql-connector:

demo_mysql_test.py:

import mysql.connector

Выполните приведённый выше код. Если ошибок не возникло, установка прошла успешно.

ПримечаниеПримечание:Если у вас MySQL версии 8.0, метод аутентификации с помощью плагина пароля изменился. В ранней версии использовался mysql_native_password, а в версии 8.0 используется caching_sha2_password, поэтому необходимо внести некоторые изменения:

Сначала измените конфигурацию my.ini:

[mysqld]
default_authentication_plugin=mysql_native_password

Затем выполните следующие команды в MySQL, чтобы изменить пароль:

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

За дополнительной информацией можно обратиться к:Проблема подключения Python MySQL 8.0。


Создание подключения к базе данных

Вы можете использовать следующий код для подключения к базе данных:

demo_mysql_test.py:

import mysql.connector mydb = mysql.connector.connect( host="localhost", # Адрес хоста базы данных user="yourusername", # Имя пользователя базы данных passwd="yourpassword" # Пароль базы данных ) print(mydb)

Создание базы данных

Чтобы создать базу данных, используйте оператор "CREATE DATABASE". Следующий код создаёт базу данных с именем 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")

Прежде чем создавать базу данных, мы также можем использовать оператор "SHOW DATABASES", чтобы проверить, существует ли база данных:

demo_mysql_test.py:

Выведите список всех баз данных:

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)

Как вариант, мы можем подключиться напрямую к базе данных. Если база данных не существует, будет выведено сообщение об ошибке:

demo_mysql_test.py:

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

Создание таблицы данных

Чтобы создать таблицу данных, используйте оператор"CREATE TABLE". Прежде чем создавать таблицу данных, необходимо убедиться, что база данных уже существует. Следующий код создаёт таблицу данныхsites:

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))")
После успешного выполнения мы можем увидеть таблицу данных sites, созданную в базе данных, с полями name и url.

Мы также можем использовать оператор"SHOW TABLES", чтобы проверить, существует ли уже таблица данных:

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)

Настройка первичного ключа

При создании таблицы мы обычно задаём первичный ключ (PRIMARY KEY). Мы можем использовать оператор"INT AUTO_INCREMENT PRIMARY KEY", чтобы создать первичный ключ. Первичный ключ начинается с 1 и увеличивается шаг за шагом.

Если наша таблица уже создана, нам нужно использоватьALTER TABLE, чтобы добавить первичный ключ в таблицу:

demo_mysql_test.py:

Добавьте первичный ключ в таблицу 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")

Если вы ещё не создали таблицу sites, вы можете напрямую использовать следующий код для её создания.

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 (id INT AUTO_INCREMENT PRIMARY KEY, name VARCHAR(255), url VARCHAR(255))")

Вставка данных

Чтобы вставить данные, используйте"INSERT INTO"оператор:

demo_mysql_test.py:

Вставьте запись в таблицу 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() # Содержимое таблицы данных было обновлено; необходимо использовать этот оператор print(mycursor.rowcount, "Запись успешно вставлена.")

Выполните код, и результат вывода будет следующим:

1 记录插入成功

Пакетная вставка

Для пакетной вставки используйтеexecutemany()метод. Второй параметр этого метода — список кортежей, содержащий данные, которые мы хотим вставить:

demo_mysql_test.py:

Вставьте несколько записей в таблицу 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() # Содержимое таблицы данных было обновлено; необходимо использовать этот оператор print(mycursor.rowcount, "Записи были успешно вставлены.")

Выполните код, и результат вывода будет следующим:

4 记录插入成功。

После выполнения вышеуказанного кода можно посмотреть записи в таблице данных:

Если мы хотим получить ID записи после вставки данных, можно использовать следующий код:

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 запись, ID:", mycursor.lastrowid)

Выполните код, и результат вывода будет следующим:

1 条记录已插入, ID: 6

Запрос данных

Чтобы запросить данные, используйтеSELECTинструкцию:

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() получает все записи for x in myresult: print(x)

Выполните код, и результат вывода будет следующим:

(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')

Вы также можете читать данные из указанных полей:

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)

Выполните код, и результат вывода будет следующим:

('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')

Если мы хотим прочитать только одну запись, мы можем использовать методfetchone():

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)

Выполните код, и результат вывода будет следующим:

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

Условный оператор WHERE

Если мы хотим считывать данные с заданными условиями, мы можем использовать операторwhere:

demo_mysql_test.py

Чтение записей, где поле name равно 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)

Выполните код, и результат вывода будет следующим:

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

Вы также можете использовать подстановочные знаки%:

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)

Выполните код, и результат вывода будет следующим:

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

Чтобы предотвратить атаки SQL-инъекций в запросах к базе данных, мы можем использовать%splaceholder для экранирования условий запроса:

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)

Сортировка

Результаты запроса можно отсортировать с помощью оператораORDER BY. По умолчанию применяется сортировка по возрастанию с ключевым словомASC. Если вы хотите задать сортировку по убыванию, можно указать ключевое словоDESC。

demo_mysql_test.py

Сортировка по возрастанию по буквам поля 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)

Выполните код, и результат вывода будет следующим:

(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')

Пример сортировки по убыванию:

demo_mysql_test.py

Сортировка по убыванию по буквам поля 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)

Выполните код, и результат вывода будет следующим:

(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')

Предел

Если мы хотим задать объем данных для запроса, мы можем использовать"LIMIT"оператор, чтобы указать

demo_mysql_test.py

Прочитать первые 3 записи:

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)

Выполните код, и результат вывода будет следующим:

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

Вы также можете указать начальную позицию. Используемое ключевое слово —OFFSET:

demo_mysql_test.py

Прочитать первые 3 записи, начиная со второй записи:

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 — первый, 1 — второй, и так далее myresult = mycursor.fetchall() for x in myresult: print(x)

Выполните код, и результат вывода будет следующим:

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

Удаление записи

Чтобы удалить записи, используйте оператор"DELETE FROM":

demo_mysql_test.py

Удалите записи, где name равно 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, "записей удалено")

Выполните код, и результат вывода будет следующим:

1  条记录删除

Примечание:Используйте оператор DELETE с осторожностью. Убедитесь, что в операторе DELETE указано условие WHERE, иначе все данные в таблице будут удалены.

Чтобы предотвратить атаки SQL-инъекций в запросах к базе данных, можно использовать%sзаполнитель для экранирования условий оператора 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, "записей удалено")

Выполните код, и результат вывода будет следующим:

1  条记录删除

Обновление данных таблицы

Чтобы обновить таблицу данных, используйте"UPDATE"оператор:

demo_mysql_test.py

Измените данные поля с именем Zhihu на 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, "записей изменено")

Выполните код, и результат вывода будет следующим:

1  条记录被修改

Примечание:Убедитесь, что оператор UPDATE указывает условие WHERE, иначе все данные в таблице будут обновлены.

Чтобы предотвратить атаки SQL-инъекций в запросах к базе данных, мы можем использовать заполнитель %s для экранирования условий оператора 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, "записей изменено")

Выполните код, и результат вывода будет следующим:

1  条记录被修改

Удаление таблицы

Чтобы удалить таблицу, используйте"DROP TABLE"оператор.IF EXISTSЭто ключевое слово используется для проверки, существует ли таблица, и она удаляется, только если существует:

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" # Удалить таблицу данных sites mycursor.execute(sql)
Другие расширения