Исполнение конкретных SQL запросов из файла на Python
Быстрый ответ
Для исполнения внешнего SQL-скрипта в Python используйте функцию open()
в сочетании с методом executescript()
из модуля SQLite:
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 и т. д.).
Если вам нужен более гибкий подход, включая логику работы с плейсхолдерами и множественными запросами, то продолжайте чтение.
Тонкости и подводные камни: развиваем мастерство
Если базового функционала open()
и executescript()
недостаточно и требуется больше контроля над процессом, то учтите следующие возможности.
Работа с плейсхолдерами
В SQL-скрипте могут встречаться плейсхолдеры для вставки переменных. Для подстановки актуальных значений используйте форматирование строк в 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
:
try:
cursor.execute(formatted_command) # Попытка выполнить запрос
except sqlite3.DatabaseError as error:
print(f"Обнаружена ошибка: {error}")
Выбор нужных запросов
Вы можете выполнить конкретные запросы из SQL-файла, применив регулярные выражения или условные конструкции:
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)
Правильное освобождение ресурсов
По окончании работы удостоверьтесь, что файлы и соединения с базой данных были корректно закрыты:
file.close() # не забываем закрыть файл
conn.close() # и корректно завершаем работу с базой данных
Применение этих техник гарантирует гибкость и надежность вашего кода.
Визуализация
📖 SQL-скрипт: это своего рода книга рецептов
Шаг 1. Открыть "книгу": `open('recipe.sql', 'r')`
Шаг 2. Прочитать "рецепт": `.read()`
Шаг 3. "Приготовить блюдо": `execute()`
🐍 Python (Вы – шеф-повар): Следуем рецепту, приступаем к приготовлению!
with open('host.sql', 'r') as file:
query = file.read()
db_cursor.execute(query) # шеф-повар Python приступает к "готовке"!
Как и шеф-повар, следующий рецепту, Python исполняет SQL-скрипт, "приготавливая" данные в соответствии с инструкциями.
Упаковка функционала в функции
Чистый и структурированный код помогает в работе. Создавайте функции для ясности кода и повторного использования:
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()
— сделать массовую вставку данных:
data = [('Alice',), ('Bob',)] # "гости на вечеринке"
cursor.executemany("INSERT INTO users (name) VALUES (?)", data)
Проверки после выполнения
Чтобы узнать количество обработанных записей, используйте cursor.rowcount
:
cursor.execute("DELETE FROM users WHERE age < 18")
print(f"Количество обработанных строк: {cursor.rowcount}") # мы работаем только с пользователями 18+
Настраиваемые плейсхолдеры
import re
query = re.sub(r'{{username}}', 'JohnDoe', query) # Джон Доу уже здесь
Освоение этих приемов, несомненно, поднимет качество вашего скрипта на новый уровень.