Как заставить Django работать с неподдерживаемыми драйверами MySQL, такими как gevent-mysql или драйвер Concurrence MySQL?

Я заинтересован в запуске Django в рамках async, например Concurrence или gevent. Оба фреймворка имеют свой собственный драйвер async MySQL.

Проблема заключается в том, что Django официально поддерживает MySQLdb. Что мне нужно сделать, чтобы Django работал с драйверами MySQL, которые поставляются с gevent или Concurrence?

Есть ли пошаговое руководство, где я могу следовать? Является ли это важным делом?

Спасибо.

Ответ 1

три ура для предложения @traviscline для pymysql. его предложение было основано на этом сообщении от mozilla. все, что требуется, это простой патч для вашего файла manage.py

#!/usr/bin/env python
+try:
+    import pymysql
+    pymysql.install_as_MySQLdb()
+except ImportError:
+    pass 

изменение импорта в файле настроек и monkeypatch(), поскольку pymysql является чистым драйвером python.

travis отметил, что он тестирует совместимость, меняя импорт и запуская unittests для pymysql, mysqldb и myconnpy.

обратите внимание, что уже есть примеры более тонких деталей, чтобы следить за - но в целом это элегантное, поддерживаемое решение. я буду обновлять, когда я получу это в процессе производства!

Ответ 2

с базой данных с низкой задержкой, MySQLdb достаточно хорош, даже если используется с gevent. Несмотря на то, что он не является патчевым, он может достичь хорошей производительности за счет повторного использования соединения с базой данных и увеличения числа работников gevent. База данных тяжелая, и обычно вам не нужно создавать тысячи одновременных подключений, чтобы использовать ее производительность, а соотношение 1:1 рабочего к соединению - не очень плохой выбор. Но для кэша памяти это совершенно другая история.

Ответ 3

Мне удалось получить pymysql для работы с Django, выполнив следующие действия:

  • Прокомментируйте блок try-except в начале файла base.py, где импортируется MySQLdb.
  • Добавьте следующие четыре строки в base.py

    try:
        import pymysql as Database
    except ImportError:
        pass
    
  • Как упоминалось в ссылке, опубликованной egbutter, перейдите в файл base.py и найдите-замените MySQLdb на pymysql в соответствующие части файла, то есть не беспокойтесь об изменении сообщений об ошибках (вы могли бы, но это до вас).

  • Сохраните base.py и запустите следующую команду из apt-местоположения, чтобы увидеть запуск сервера.

    python manage.py runserver