Как можно улучшить скрипт на Python, чтобы при его запуске сначала создавался бэкап одной из таблиц базы данных, затем эта таблица очищалась, и после этого данные импортировались из файла *.csv? При этом бэкап и очистка проходят успешно, но при импорте данных происходит ошибка "Ошибка при подключении к базе данных: 1045 (28000): Access denied for user '[логин]'@'localhost' (using password: YES)". Используются библиотеки: `subprocess`, `mysql.connector`, `datetime` и `os`.
Вот соответствующий участок кода:
```python
# ... (предшествующий код)
if connection.is_connected():
print("Успешное подключение к базе данных")
cursor = connection.cursor()
subprocess.run(['mysqldump', '-h', host, '-u', user, '-p' + password, '--no-create-info', '--default-character-set=utf8', database, table_to_backup], stdout=open(backup_file, 'w')) # ПРОХОДИТ УСПЕШНО
print(f"Бэкап таблицы {table_to_backup} создан успешно и сохранен в файл {backup_file}")
delete_query = f"DELETE FROM {table_to_backup}"
cursor.execute(delete_query) # ПРОХОДИТ УСПЕШНО
connection.commit()
print(f"Таблица {table_to_backup} очищена")
load_data_query = f"LOAD DATA INFILE '{import_file}' INTO TABLE {table_to_backup} FIELDS TERMINATED BY ',' ENCLOSED BY '\"' LINES TERMINATED BY '\n' IGNORE 1 ROWS"
cursor.execute(load_data_query) # ОШИБКА
connection.commit()
print(f"Данные из файла {import_file} успешно импортированы в таблицу {table_to_backup}")
```
Где может быть ошибка?
Ошибка возникает потому, что при выполнении команды `LOAD DATA INFILE` требуется, чтобы пользователь имел привилегию FILE для загрузки данных в базу данных. У вас доступа к этой привилегии, скорее всего, нет.
Чтобы исправить эту ошибку, можно попробовать использовать другой метод загрузки данных, который не требует привилегии FILE. Например, вы можете прочитать файл .csv в Python, обработать его и вставить данные в таблицу с помощью INSERT запросов.
Вот пример кода, который показывает, как это можно сделать:
```python
import csv
# ... (предшествующий код)
if connection.is_connected():
print("Успешное подключение к базе данных")
cursor = connection.cursor()
subprocess.run(['mysqldump', '-h', host, '-u', user, '-p' + password, '--no-create-info', '--default-character-set=utf8', database, table_to_backup], stdout=open(backup_file, 'w')) # ПРОХОДИТ УСПЕШНО
print(f"Бэкап таблицы {table_to_backup} создан успешно и сохранен в файл {backup_file}")
delete_query = f"DELETE FROM {table_to_backup}"
cursor.execute(delete_query) # ПРОХОДИТ УСПЕШНО
connection.commit()
print(f"Таблица {table_to_backup} очищена")
with open(import_file, 'r') as file:
reader = csv.reader(file)
next(reader) # Пропускаем заголовок файла
for row in reader:
insert_query = f"INSERT INTO {table_to_backup} (column1, column2, column3) VALUES ('{row[0]}', '{row[1]}', '{row[2]}')" # Здесь необходимо заменить column1, column2, column3 на названия столбцов из вашей таблицы и соответствующим образом сформировать строку запроса
cursor.execute(insert_query)
connection.commit()
print(f"Данные из файла {import_file} успешно импортированы в таблицу {table_to_backup}")
```
Обратите внимание, что в данном примере я предполагаю, что структура .csv файла и структура таблицы совпадает, и что в таблице есть столбцы column1, column2 и column3. Проверьте и адаптируйте этот код под свою конкретную ситуацию.
<blockquote>Access denied for user</blockquote> пользователю (в mysql это пара 'юзер%хост') не выданы права на вызов insert, 'обратитесь к вашему администратору базы данных', вполне возможно пользователь был верно настроен для создания резервной копии (требуется только чтение) а на модификации нет