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

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

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

Есть ли где-нибудь пошаговое руководство, которому я могу следовать? Это крупное мероприятие?

Спасибо.


person Continuation    schedule 14.04.2010    source источник
comment
Предполагая, что API gevent-mysql соответствует MySQLdb, написать и использовать очень простой пользовательский сервер базы данных будет тривиально. Я знаю, что другим будет интересно, поэтому поделитесь, если/когда вы это сделаете. Бьюсь об заклад, люди из #gevent на freenode помогут с деталями.   -  person tmc    schedule 30.06.2011
comment
github.com/petehunt/PyMySQL — это клиентская библиотека, совместимая с API MySQLdb на чистом Python, которую использует Mozilla. с gevent для сервера Firefox Sync. Вы можете либо написать небольшой собственный движок базы данных (как я рекомендовал выше), либо просто использовать этот метод: github.com/petehunt/PyMySQL/blob/master/pymysql/ для исправления PyMySQL.   -  person tmc    schedule 23.08.2011


Ответы (2)


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

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

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

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

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

person egbutter    schedule 23.08.2011
comment
Я получаю ошибку Thing2Literal (не похоже, что это реализовано в pymysql?) - person Justin; 28.02.2013
comment
это не проблема, если вы используете достаточно новую версию mysqldb. stackoverflow.com/a/15315546/424380 - person egbutter; 03.03.2014
comment
кроме того, упомянутая выше ошибка 668664 (завершение запросов при завершении родительского процесса) никогда не была для меня заметной проблемой в производственной среде. Однако, пока я работал над этим, сайт не видел более нескольких тысяч запросов в день. - person egbutter; 03.03.2014
comment
Это только что сработало после больших усилий, пытаясь заставить драйверы mysql по умолчанию работать в Python 3.4 с Django. Спасибо! - person Ronnie; 11.11.2014
comment
Я использую OSX 10.11, использую Mamp, и это решение работает для Python 3.6 и Django. - person Telvin Nguyen; 03.06.2016

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

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

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

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

    python manage.py runserver
    
person user2305491    schedule 22.12.2013