Исполнение конкретных SQL запросов из файла на Python

Пройдите тест, узнайте какой профессии подходите

Я предпочитаю
0%
Работать самостоятельно и не зависеть от других
Работать в команде и рассчитывать на помощь коллег
Организовывать и контролировать процесс работы

Быстрый ответ

Для исполнения внешнего SQL-скрипта в Python используйте функцию open() в сочетании с методом executescript() из модуля SQLite:

Python
Скопировать код
import sqlite3

# Открываем SQL-скрипт, подключаемся к базе данных и выполняем команды
with open('script.sql', 'r') as file, sqlite3.connect('database.db') as conn:
    conn.executescript(file.read())  # Команды отправляются на выполнение!

Вместо 'script.sql' и 'database.db' подставьте актуальные имена файлов. Учтите, что синтаксис SQL должен быть совместим с вашей системой управления базами данных (SQLite, MySQL, PostgreSQL и т. д.).

Если вам нужен более гибкий подход, включая логику работы с плейсхолдерами и множественными запросами, то продолжайте чтение.

Кинга Идем в IT: пошаговый план для смены профессии

Тонкости и подводные камни: развиваем мастерство

Если базового функционала open() и executescript() недостаточно и требуется больше контроля над процессом, то учтите следующие возможности.

Работа с плейсхолдерами

В SQL-скрипте могут встречаться плейсхолдеры для вставки переменных. Для подстановки актуальных значений используйте форматирование строк в Python:

Python
Скопировать код
# SQL-скрипт с плейсхолдером: {name}
sql_command = "INSERT INTO users (name) VALUES ('{name}')"

# Подстановка актуального значения
formatted_command = sql_command.format(name='John Doe')

# Исполнение запроса и добавление пользователя Джона Доу в базу данных
cursor.execute(formatted_command)

Обработка ошибок

В случае возникновения ошибок применяйте конструкцию try-except:

Python
Скопировать код
try:
    cursor.execute(formatted_command)  # Попытка выполнить запрос
except sqlite3.DatabaseError as error:
    print(f"Обнаружена ошибка: {error}")

Выбор нужных запросов

Вы можете выполнить конкретные запросы из SQL-файла, применив регулярные выражения или условные конструкции:

Python
Скопировать код
import re

pattern = re.compile(r'INSERT INTO users')
selected_queries = [q for q in queries if pattern.match(q)]  # Выбираем необходимые

# Выполняем отобранные запросы по очереди
for query in selected_queries:
    cursor.execute(query)

Правильное освобождение ресурсов

По окончании работы удостоверьтесь, что файлы и соединения с базой данных были корректно закрыты:

Python
Скопировать код
file.close()  # не забываем закрыть файл
conn.close()  # и корректно завершаем работу с базой данных

Применение этих техник гарантирует гибкость и надежность вашего кода.

Визуализация

Markdown
Скопировать код
📖 SQL-скрипт: это своего рода книга рецептов
   Шаг 1. Открыть "книгу": `open('recipe.sql', 'r')`
   Шаг 2. Прочитать "рецепт": `.read()`
   Шаг 3. "Приготовить блюдо": `execute()`

🐍 Python (Вы – шеф-повар): Следуем рецепту, приступаем к приготовлению!
Python
Скопировать код
with open('host.sql', 'r') as file:
    query = file.read()
db_cursor.execute(query)  # шеф-повар Python приступает к "готовке"!

Как и шеф-повар, следующий рецепту, Python исполняет SQL-скрипт, "приготавливая" данные в соответствии с инструкциями.

Упаковка функционала в функции

Чистый и структурированный код помогает в работе. Создавайте функции для ясности кода и повторного использования:

Python
Скопировать код
def execute_sql_script(file_path, db_path):
    with open(file_path, 'r') as file, sqlite3.connect(db_path) as conn:
        conn.executescript(file.read())

Массовое выполнение

Метод executescript() позволяет выполнить множество SQL-запросов, а cursor.executemany() — сделать массовую вставку данных:

Python
Скопировать код
data = [('Alice',), ('Bob',)]  # "гости на вечеринке"
cursor.executemany("INSERT INTO users (name) VALUES (?)", data)

Проверки после выполнения

Чтобы узнать количество обработанных записей, используйте cursor.rowcount:

Python
Скопировать код
cursor.execute("DELETE FROM users WHERE age < 18")
print(f"Количество обработанных строк: {cursor.rowcount}")  # мы работаем только с пользователями 18+

Настраиваемые плейсхолдеры

Python
Скопировать код
import re

query = re.sub(r'{{username}}', 'JohnDoe', query)  # Джон Доу уже здесь

Освоение этих приемов, несомненно, поднимет качество вашего скрипта на новый уровень.

Полезные ресурсы

  1. sqlite3 – DB-API 2.0 интерфейс для работы с SQLite в Python
  2. Руководство разработчика для MySQL Connector/Python
  3. Документация pymssql
  4. SQLAlchemy – инструментарий для работы с базами данных в Python
  5. Psycopg – адаптер PostgreSQL для Python
  6. cx_Oracle – Интерфейс Oracle Database для Python