На моем рабочем сервере (Debian 12) у меня есть база данных mariadb «sasquatch_index», которая работает, как и ожидалось, с несколькими скриптами Python, которые с ней взаимодействуют. Я настраиваю свое приложение для работы в среде тестирования и хочу скопировать эту базу данных в свою локальную систему (Manjaro). На моем рабочем сервере я использую команду типа mariadb-dump -u [username] -p[password] sasquatch_index > ./site_dump.sql
Чтобы создать файл site_dump.sql. Затем я извлекаю этот файл со своего локального компьютера с помощью rsync. Я запускаю базу данных на своем локальном компьютере с помощью mariadb -u [user] -p sasquatch_index < ~/site_dump.sql
. Я могу получить доступ к этой базе данных и ее содержимому через клиент mariadb. Все идет нормально.
Однако проблемы возникают, когда я пытаюсь использовать любой из существующих скриптов Python для взаимодействия с этой базой данных на моем локальном компьютере (среда тестирования, которую я настраиваю). В указанных сценариях используется модуль mysql.connector, который был установлен с помощью команды pacman -S python-mysql-connector
. Например, search.py существует для выполнения сложного поиска в базе данных. Он запускается с помощью команды типа search.py -s "hello world"
и возвращает ошибочный вывод, подобный следующему:
Error connecting to database: 1273 (HY000): Unknown collation: 'utf8mb4_0900_ai_ci'
Traceback (most recent call last):
File "/home/josh/git/github/search-sasquatch/./search.py", line 270, in <module>
main()
File "/home/josh/git/github/search-sasquatch/./search.py", line 262, in main
results = performSearch(arguments['searchString'], arguments['safe'], creds)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/josh/git/github/search-sasquatch/./search.py", line 185, in performSearch
if conn is not None and conn.is_connected():
^^^^
UnboundLocalError: cannot access local variable 'conn' where it is not associated with a value
(обратите внимание на часть вывода, относящуюся к «Неизвестному параметру сортировки». Значение переменной с именем «conn» зависит от успешного подключения к базе данных.)
Другой случай появления этой ошибки «Неизвестное сопоставление» — это попытка использовать другой из этих сценариев Python. Этот конкретный файл, «extractor.py», добавляет новые данные в таблицу базы данных «sasquatch_index», называемую «sites». Результат запуска этого сценария в локальной системе выглядит следующим образом:
Parsing https://example.com/index.php...
Error updating the database for url 'https://example.com/index.php': 1273 (HY000): Unknown collation: 'utf8mb4_0900_ai_ci'
Parsing https://josh.example.com...
Error updating the database for url 'https://josh.example.com': 1273 (HY000): Unknown collation: 'utf8mb4_0900_ai_ci'
Эти сценарии работают идеально, как и ожидалось, в производственной среде, но локально они выдают подобные ошибки.
Я попытался изменить команду, которую я выполнил на рабочем сервере, чтобы явно не использовать параметры сортировки «utf8mb4_0900_ai_ci», т.е. mariadb-dump --default-character-set=utf8mb --skip-set-charset -u [user] -p[password] sasquatch_index > site_dump.sql
Я также искал в файле site_dump.sql строку «utf8mb4_0900_ai_ci» и обнаружил, что указанный текст никогда не встречается внутри этого файла. Все это время эти ошибки все еще происходят.
Совсем недавно я пытался запустить «extractor.py», ничего не импортируя (я создал базу данных и таблицу, используя другие сценарии из моего проекта), и продолжаю получать те же ошибки. «extractor.py» по-прежнему не может добавить данные в таблицу сайтов.
🤔 А знаете ли вы, что...
Python позволяет создавать сценарии для автоматизации задач и обработки данных.
@danblack внес предложение, которое решило эти проблемы, а именно переключиться с использования библиотеки mysql.connector на библиотеку под названием mariadb. Более подробную информацию об этой библиотеке можно найти здесь.
Однако я хотел бы отметить, что в этой библиотеке нет метода is_connected(). Чтобы учесть это, мне пришлось внести некоторые незначительные изменения в другие части моего кода. Если не считать этого небольшого недосмотра, сейчас все работает так, как и ожидалось.
Эта тема тоже была очень полезной.