This module should be
mostly compatible with an older interface written by Joe Skinner and
others. However, the older version is a) not thread-friendly (database
operations could cause all other threads to block), b) written for
MySQL 3.21 (does not compile against newer versions without patches),
c) apparently not actively maintained. MySQLdb is a completely new
module, distributed free of charge under the GNU Public License.
This module is developed on RedHat Linux (currently 7.1) for Intel. It
should build without much trouble on most platforms by using the
setup.py script. Supposedly it builds on MacOS X. Be aware that
you need the Distutils package which comes with Python 2.0. If you
don't have it (i.e. you have Python 1.5.2), you can find it over at
Windows (3.11, 95, 98, NT, 2000, CE, BSOD, XYZ, etc.)
Windows is not a supported platform. However, the setup.py
script reportedly gets the job done. There is probably a link on the
web page for getting a precompiled Windows installer from someone or
other. Be aware that this is a user-contributed package; the author
cannot help you with compiling and running under Windows.
MySQLdb requires Python 1.5.2 or newer. Earlier versions will not
work, because support for C long long is required by MySQL. If
you have an earlier version of Python, upgrade to 1.5.2 or beyond.
Current development is done with Python 2.2.1, but Python 1.5.2 will be
supported for the forseeable future.
Only versions 3.22.32 and up are guaranteed to work. Some older
versions may work; if you have an older version you should seriously
consider upgrading to get the bug fixes and particularly the security
MySQL-3.22 seems to have a problem trying to insert TIME values
with fractional seconds. Values like 12:56:13.00 are returned as
344:13:00, apparently interpreting the original input as 12 days, 56
hours, 13 minutes, 0 seconds. (12 days and 56 hours is 344 hours.) To
avoid this problem, use the DateTimeDelta type.
MySQL-3.23 is now stable (3.23.51 as of this writing). MySQLdb
supports transactions if the server supports them. Even then,
this does not guarantee that transactions will work. For that, you
must use a transaction-safe table (TST). Current TSTs are BDB and
InnoDB. Note that MySQL
generally operates in AUTOCOMMIT mode by default, and MySQLdb
assumes that AUTOCOMMIT is on by default. To change this, use the
SET AUTOCOMMIT=0 SQL statement.
If you have the
mx.DateTime package installed (recommended), MySQLdb will use
it for date-related objects. Otherwise, these will be returned to
Python as strings. You can also modify the type conversion
dictionary to return these as other object classes, if you prefer.
MySQLmodule, the older MySQL interface by Joe Skinner and others, is
also a split C/Python interface. MySQL, the C portion, has an
interface similar to perl's DBI internally. In addition, there is
Python portion, Mysqldb, which provides a DB API v1.0 interface,
written by James Henstridge. MySQLdb-0.2.2 and up include
CompatMysqldb, which is an adaptation of Mysqldb to
_mysql. It should be considered experimental.
In contrast, MySQLdb's C portion, _mysql, is
designed to mimic the MySQL C API in an object-oriented way; you
should not expect to move from MySQL to _mysql without a
fair amount of work. MySQLdb provides a DB API
v2.0 interface, which has some changes from the v1.0 interface. Things
to watch out for in particular:
db = Mysqldb.Mysqldb("db@host user pass")
db = MySQLdb.connect(db='db', host='host', user='user', passwd='pass')
implicit cursors dropped from DB API v2.0; always use c = db.cursor()
Fetch row as dictionary
c.fetchDict(),keys are "table.column"
not standard; alternate cursor class DictCursorprovides a dictionary interface,keys are "column" or "table.column" if there are two columnswith the same name; use SQL AS to rename fields.
db.commit() and db.rollback()both exist and silently do nothing
db.commit() and db.rollback() work if the MySQLserver can perform transactions; otherwise db.rollback()always fails