Ошибка подключения к MariaDB из Python: неизвестное сопоставление: 'utf8mb4_0900_ai_ci'

На моем рабочем сервере (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» по-прежнему не может добавить данные в таблицу сайтов.

что показывает select version(); в производственной и тестовой средах?

ysth 11.08.2024 21:30

Производство @ysth показывает «10.11.6-MariaDB-0+deb12u1», а тестирование показывает «11.4.2-MariaDB».

joshua 11.08.2024 21:39

Последняя система сортировки MySQL — Unicode 9 (0900). MariaDB пропустила 9 и реализовала 14.

Rick James 11.08.2024 21:40

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

danblack 12.08.2024 01:48

@danblack Переключение на mariadb с mysql.connector, похоже, помогло, но мне нужно проверить его еще в нескольких контекстах, чтобы знать наверняка. Спасибо! Я напишу решение более подробно, как только немного протестирую его и узнаю наверняка.

joshua 13.08.2024 00:40

Рад помочь. Я написал ответ на еще один вопрос если вы не хотите писать свой ответ, решать вам. Этот вопрос, вероятно, будет помечен как дубликат без ответа.

danblack 13.08.2024 02:53
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
7
59
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

@danblack внес предложение, которое решило эти проблемы, а именно переключиться с использования библиотеки mysql.connector на библиотеку под названием mariadb. Более подробную информацию об этой библиотеке можно найти здесь.

Однако я хотел бы отметить, что в этой библиотеке нет метода is_connected(). Чтобы учесть это, мне пришлось внести некоторые незначительные изменения в другие части моего кода. Если не считать этого небольшого недосмотра, сейчас все работает так, как и ожидалось.

Эта тема тоже была очень полезной.

Запросы на функции/совместимость принимаются на сайте jira.mariadb.org в проекте CONPY. Спасибо за рассказ о миграции.

danblack 13.08.2024 05:48

Объект соединения MariaDB Connector/Python имеет метод ping() для проверки состояния работоспособности. См. stackoverflow.com/questions/65808334/…

Georg Richter 13.08.2024 10:15

Другие вопросы по теме