Урок 80. MySQL и Python
⚡ Кратко: примеры кода
- Создай конфигурацию, подключись через
pymysql.connect()и проверьconnection.open. - Выполняй
SELECTчерез курсор, читай результаты итерацией илиfetch*. - Для
INSERT/UPDATEне забудьconnection.commit(). - Любой пользовательский ввод передавай только через плейсхолдеры
%sили%(name)s. - Оборачивай код в
try ... except pymysql.MySQLErrorиwith.
💻 Рабочие примеры
Все примеры предполагают, что у вас есть доступ к серверу MySQL с базой hr. Замените параметры подключения на свои.
Пример 1. Подключение и проверка
Файл: 01_connect.py
import pymysql
config = {
"host": "localhost",
"user": "root",
"password": "yourpassword",
"database": "hr",
"charset": "utf8mb4",
}
connection = pymysql.connect(**config)
if connection.open:
print("Соединение установлено!")
connection.close()
Пример 2. Выборка всех отделов
Файл: 02_select_all.py
import pymysql
config = {
"host": "localhost",
"user": "root",
"password": "yourpassword",
"database": "hr",
"charset": "utf8mb4",
}
connection = pymysql.connect(**config)
try:
cursor = connection.cursor()
cursor.execute("SELECT department_id, department_name FROM departments")
for row in cursor:
print(row)
finally:
cursor.close()
connection.close()
Пример 3. Параметризованный SELECT
Файл: 03_select_param.py
import pymysql
config = {
"host": "localhost",
"user": "root",
"password": "yourpassword",
"database": "hr",
"charset": "utf8mb4",
}
department_id = 50 # в реальной программе значение приходит извне
connection = pymysql.connect(**config)
try:
cursor = connection.cursor()
cursor.execute(
"SELECT first_name, last_name FROM employees WHERE department_id = %s",
(department_id,) # не забудьте запятую!
)
for first_name, last_name in cursor:
print(f"{first_name} {last_name}")
finally:
cursor.close()
connection.close()
Пример 4. Именованные параметры
Файл: 04_named_params.py
import pymysql
config = {
"host": "localhost",
"user": "root",
"password": "yourpassword",
"database": "hr",
"charset": "utf8mb4",
}
params = {
"min_salary": 10000,
"department_id": 60,
}
connection = pymysql.connect(**config)
try:
cursor = connection.cursor()
cursor.execute(
"""SELECT first_name, last_name
FROM employees
WHERE department_id = %(department_id)s
OR salary > %(min_salary)s""",
params
)
for row in cursor:
print(row)
finally:
cursor.close()
connection.close()
Пример 5. INSERT с commit
Файл: 05_insert.py
import pymysql
config = {
"host": "localhost",
"user": "root",
"password": "yourpassword",
"database": "hr",
"charset": "utf8mb4",
}
connection = pymysql.connect(**config)
try:
cursor = connection.cursor()
cursor.execute(
"INSERT INTO departments (department_name, location_id) VALUES (%s, %s)",
("Data Science", 1700)
)
connection.commit()
print("Добавлено строк:", cursor.rowcount)
finally:
cursor.close()
connection.close()
Пример 6. Безопасный запрос с пользовательским вводом
Файл: 06_safe_input.py
import pymysql
config = {
"host": "localhost",
"user": "root",
"password": "yourpassword",
"database": "hr",
"charset": "utf8mb4",
}
user_input = input("Введите ID отдела: ")
connection = pymysql.connect(**config)
try:
cursor = connection.cursor()
cursor.execute(
"SELECT first_name, last_name FROM employees WHERE department_id = %s",
(user_input,)
)
for row in cursor:
print(row)
finally:
cursor.close()
connection.close()
Пример 7. Обработка ошибок
Файл: 07_errors.py
import pymysql
config = {
"host": "localhost",
"user": "root",
"password": "wrong_password",
"database": "hr",
"charset": "utf8mb4",
}
try:
connection = pymysql.connect(**config)
print("Соединение установлено")
except pymysql.OperationalError as e:
print("Ошибка подключения:", e)
except pymysql.MySQLError as e:
print("Общая ошибка MySQL:", e)
Пример 8. Полный код с with
Файл: 08_with_statement.py
import pymysql
config = {
"host": "localhost",
"user": "root",
"password": "yourpassword",
"database": "hr",
"charset": "utf8mb4",
}
try:
with pymysql.connect(**config) as connection:
with connection.cursor() as cursor:
cursor.execute("SELECT department_id, department_name FROM departments")
departments = cursor.fetchall()
for department_id, department_name in departments:
print(f"{department_id}: {department_name}")
except pymysql.MySQLError as e:
print("Ошибка работы с базой данных:", e)
⚠️ Проверить по документации: при использовании
with pymysql.connect(...) соединение автоматически закрывается при выходе из блока. Если нужно сохранить изменения внутри with, вызовите connection.commit() до завершения блока.