Почему возникает ошибка SQL при импорте данных?

Как можно улучшить скрипт на 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}")
```

Где может быть ошибка?
  • 23 декабря 2023 г. 13:57
Ответы на вопрос 2
Ошибка возникает потому, что при выполнении команды `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. Проверьте и адаптируйте этот код под свою конкретную ситуацию.
Access denied for user
пользователю (в mysql это пара 'юзер%хост') не выданы права на вызов insert, 'обратитесь к вашему администратору базы данных', вполне возможно пользователь был верно настроен для создания резервной копии (требуется только чтение) а на модификации нет
Похожие вопросы