48

I just solved some problems in my Django 1.3 app by using PyMySQL instead of MySQLdb. I followed this tutorial on how to make the switch: http://web-eng-help.blogspot.com/2010/09/install-mysql-5-for-python-26-and.html

Now I want to know what PyMySQL actually is and how it is different from MySQLdb.

I am using it on localhost and will then upload it to some hosting.

Is it fine to use PyMySQL on localhost and on hosting whatever they provide? Since I have changed "MySQLdb" in base.py and introspection.py to "PyMySQL", will I need to upload it to the server after changing these files? Or as it is Django's files, since Django will be uploaded there already, does it not matter much?

Mark Amery
  • 143,130
  • 81
  • 406
  • 459
Hafiz
  • 4,187
  • 12
  • 58
  • 111
  • 1
    `pymysql` is pure python port of `mysqldb` (`mysql-python`) package. So, `pymysql` can be installed on any system without needing a C compiler. Installing `mysqldb` may need a compiler and in windows can produce error(`error: Unable to find vcvarsall.bat`) if you do not have one. – skjoshi Oct 28 '14 at 02:48
  • This question would've been more useful if it had been less broad. You're asking several things: the difference between the two libraries, how to deploy PyMySQL to some kind of shared hosting environment (which you haven't told us anything about, and which we therefore can't possibly help you with), and, more broadly, what issues one needs to be aware of when using PyMySQL with Django. Those are three distinct questions and would've been better asked as such. – Mark Amery Jan 19 '16 at 19:22
  • Question was about whether should I use PyMySQL or not and I had two concerns that you are calling multiple questions. – Hafiz Jan 21 '16 at 11:42

5 Answers5

67

PyMySQL and MySQLdb provide the same functionality - they are both database connectors. The difference is in the implementation where MySQLdb is a C extension and PyMySQL is pure Python.

There are a few reasons to try PyMySQL:

  • it might be easier to get running on some systems
  • it works with PyPy
  • it can be "greened" and works with gevent

The proper way to use it with Django is to import it and tell it to impersonate MySQLdb in your top-level file, usually manage.py. Put the following code at the very top of your manage.py (or whatever file you call when starting your server):

try:
    import pymysql
    pymysql.install_as_MySQLdb()
except ImportError:
    pass
BenMorel
  • 34,448
  • 50
  • 182
  • 322
Daniel Eriksson
  • 3,814
  • 3
  • 16
  • 11
  • 1
    I should add that the official version of PyMySQL is not (currently) compatible with Django 1.4 using the method above. There is a fork that seems to work at https://github.com/CMGS/PyMySQL if you want to try it. – Daniel Eriksson Dec 30 '12 at 23:20
  • 7
    I would add one more reason: to support Python 3 – Alveoli Aug 19 '14 at 15:07
  • 4
    What does "greened" mean? – chishaku Nov 10 '14 at 21:02
  • @chisaku it can be "made compatible with green thread-based concurrency", for instance gevent, eventlet, etc. For green threads to work, the network bits of the driver need to be modified to release control of the thread while waiting for i/o. – Andrew Gorcester Dec 22 '14 at 20:21
  • 3
    Why the try/except? Surely you want an obvious error if you've forgotten to install pymysql? – Rob Grant Aug 31 '15 at 11:54
  • I believe the idea is to load PyMySQL to mimic MySQLdb if it is present, but fall back to MySQLdb otherwise. – ChrisGuest Dec 22 '16 at 02:57
  • 1
    +1 reason to use PyMySQL it is MIT license which is better if you intend to distribute commercial code then MySQLdbs GPL license. – gbtimmon Feb 01 '19 at 19:37
19

PyMySQL and MySQLdb are both database connectors for Python, libraries to enable Python programs to talk to a MySQL server.

You would normally never upload core Django files when deploying an app. If Django is working fine on your deployment server, you definitely don't need to change anything there. The DB driver is a step or two below the ORM even, and certainly none of the code you have written depends on which of these is in use.

Phil
  • 13,875
  • 21
  • 81
  • 126
Cole
  • 1,483
  • 1
  • 11
  • 20
10

Your first point:

According to pymysql wiki page:

MySQLdb, is a C extension module that has a reputation of being difficult to compile, especially if you're on a Mac. Additionally, end-users need to wait for new binaries to be compiled for each new release of Python, and MySQLdb will never run on Jython, IronPython, or PyPy (without something like cpyext or IronClad). We also maintain 100% compatibility between Python 2 and Python 3, so all advancements made on the 2.x trunk will be immediately available on Python 3.

Your second point:

If django is working fine on your localhost, then it should be fine on your development.

Tauquir
  • 6,613
  • 7
  • 37
  • 48
  • yah but my point is that while I have changed MySQLdb to pymysql in those two files told above that are of django, so will it create problem? Or django is already there on webhostings ? Or pymysql is there? – Hafiz Aug 29 '11 at 00:43
1

As per my experience I had difficulty in installing "MySQL-python" - (MySQLdb). It made me search for more alternatives so I found pymysql, and it also got installed easily and worked in first go like a charm. So I would suggest using pymysql only instead of MySQLdb.

Devendra Bhat
  • 1,149
  • 2
  • 14
  • 19
0

I am starting with these topic, I only want to say an observation: PyMSQL has CPYTHON as a requirement(is optionall perhaps for performance https://pypi.org/project/PyMySQL/#requirements) to install, and Cpyhton depend on 'C', I tested Cpython and I had trouble when installed for the version of C too... then both implementation depend on 'C' [if you want performance], is the same thing for me...if the performance is not problem, perhaps PyMySQL is good without Cpython, free of 'C'. Perhaps we can start with PyMySQL alone with Python and switch Python to Cpython to gain in performance that could be a good thing we have all the things running and after that we can try to switch to Cpython,,, We need to know the funcionality difference. Why in Django PyMySQL run better for you or give to you solutions for some problems, what problems? That is the important thing for change perhaps. MySQLdb perhaps depend directly from 'C' but PyMSQL indirectly thru Cpython(in case of similar performance), I prefer a direct dependence without limitations of jumps...Greetings.

Jose.m.g
  • 1
  • 3