Next Previous Contents

1. Introduction

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 a license derived from the Python license.

1.1 Platforms


This module is developed on RedHat Linux 5.2 for Intel. It should build without much trouble on most UNIX-like platforms by using the script.

Windows (3.11, 95, 98, NT, 2000, CE, BSOD, XYZ, etc.)

Windows is not a supported platform. However, the script reportedly gets the job done, probably just on NT, maybe others.

1.2 Python

MySQLdb requires Python 1.5.2. 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.

1.3 MySQL


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 updates.

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.


MySQLdb has only been lightly tested. MySQL-3.23 is presently in alpha (unstable) release. Several API additions have been made so far. These will be incorporated into MySQLdb as work progresses.

1.4 DateTime

If you have the DateTime module 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 dictionaries to return these as other object classes, if you prefer.

1.5 MySQLmodule

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.

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:

Mysqldb MySQLdb
Connecting db = Mysqldb.Mysqldb("db@host user pass") db = MySQLdb.connect(db='db', host='host', user='user', passwd='pass')
Implicit cursor db.execute(SQL) 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.
Transactions db.commit() and db.rollback()both exist and silently do nothing (danger!) db.commit() and db.rollback() work if the MySQLclient library can perform transactions; otherwise db.rollback()is not defined
Mysqldb to MySQLdb changes

1.6 Zope and ZMySQLDA

The distribution contains a patch to modify the Zope ZMySQLDA to use MySQLdb instead of MySQLmodule. Read the instructions in the patch. If that fails, read the FAQ.

1.7 Documentation

The web page documentation may be slightly ahead of the latest release and may reflect features of the next release.

1.8 FAQs

A FAQ is available at

Next Previous Contents