Change logΒΆ

Change Log

Version 2.1.0 - 2014-02-25 - `Marc Abramowitz <>`_


- Sphinx-based documentation (GH-149)

  Read it online at

  Thanks, Ramiro Morales!


- "Green" support (GH-135)

	Lets you use pymssql with cooperative multi-tasking systems like
	gevent and have pymssql call a callback when it is waiting for a
	response from the server. You can set this callback to yield to
	another greenlet, coroutine, etc. For example, for gevent, you could

        def wait_callback(read_fileno):


	The above is useful if you're say, running a gunicorn server with the
	gevent worker. With this callback in place, when you send a query to
	SQL server and are waiting for a response, you can yield to other
	greenlets and process other requests. This is super useful when you
	have high concurrency and/or slow database queries and lets you use
	less gunicorn worker processes and still handle high concurrency.


- Better error messages.

  E.g.: For a connection failure, instead of:

      pymssql.OperationalError: (20009, 'Net-Lib error during Connection

  the dberrstr is also included, resulting in:

      pymssql.OperationalError: (20009, 'DB-Lib error message 20009,
      severity 9:\nUnable to connect: Adaptive Server is unavailable or
      does not exist\nNet-Lib error during Connection refused\n')


	In the area of error messages, we also made this change:

	execute: Raise ColumnsWithoutNamesError when as_dict=True and missing
	column names (GH-160)

	because the previous behavior was very confusing; instead of raising
	an exception, we would just return row dicts with those columns
	missing. This prompted at least one question on the mailing list
	so we thought it was better to handle this explicitly by raising an
	exception, so the user would understand what went wrong.


- Performance improvements

	You are most likely to notice a difference from these when you are
	fetching a large number of rows.

	* Reworked row fetching (GH-159)

	  There was a rather large amount of type conversion occuring when
		fetching a row from pymssql. The number of conversions required have
		been cut down significantly with these changes.
	  Thanks Damien, Churchill!


	* Modify get_row() to use the CPython tuple API (GH-178)

    This drops the previous method of building up a row tuple and switches
    to using the CPython API, which allows you to create a correctly sized
    tuple at the beginning and simply fill it in. This appears to offer
    around a 10% boost when fetching rows from a table where the data is
    already in memory.
	  Thanks Damien, Churchill!


- MSSQLConnection: Add `with` (context manager) support (GH-171)

  This adds `with` statement support for MSSQLConnection in the `_mssql`
	module -- e.g.:

        with mssqlconn() as conn:
            conn.execute_query("SELECT @@version AS version")

	We already have `with` statement support for the `pymssql` module.


- Allow passing in binary data (GH-179)

	Use the bytesarray type added in Python 2.6 to signify that this is
	binary data and to quote it accordingly. Also modify the handling of
	str/bytes types checking the first 2 characters for b'0x' and insert
	that as binary data.


- Add support for binding uuid.UUID instances to stored procedures input
  params (GH-143)
	Thanks, Ramiro Morales!

- The version number is now stored in one place, in pymssql_version.h
  This makes it easier to update the version number and not forget any
	places, like I did with pymssql 2.0.1
	* See

- Improved support for using py.test as test runner (GH-183)
  * See:

- Improved PEP-8 and pylint compliance

Bug Fixes

- GH-142 ("Change how *.pyx files are included in package") - this
	should prevent pymssql.pyx and _mssql.pyx from getting copied into the
	root of your virtualenv. Thanks, @Arfrever!
	* See:

- GH-145 ("Prevent error string growing with repeated failed connection

- GH-151 ("err_handler: Don't clobber dberrstr with oserrstr")

- GH-152 ("_mssql.pyx: Zero init global last_msg_* vars")

- GH-177 ("binary columns sometimes are processed as varchar")
  Better mechanism for pymssql to detect that user is passing binary

- buffer overflow fix (GH-182)
  * See:
  * See:

- Return uniqueidentifer columns as uuid.UUID objects on Python 3

Version 2.0.1 - 2013-10-27 - `Marc Abramowitz <>`_
* Add "\*.rst" to prevent install error: "IOError: [Errno 2] No
  such file or directory: 'ChangeLog_highlights.rst'"

Version 2.0.0 - 2013-10-25 - `Marc Abramowitz <>`_
* First official release of pymssql 2.X (`Cython`_-based code) to `PyPI`_!
* Compared to pymssql 1.X, this version offers:

  * Better performance
  * Thread safety
  * Fuller test suite
  * Support for Python 3
  * Continuous integration via `Travis CI`_
  * Easier to understand code, due to `Cython`_

.. _PyPI:
.. _Travis CI:
.. _Cython:
.. _ChangeLog:

Version 2.0.0b1-dev-20130403 - 2013-04-03 - Marc Abramowitz <>
	* Added tag 2.0.0b1-dev-20130403 for changeset 5d0c980ef8b8
	* Fix issue 118 ("datetime conversion to sql is not converting
	sub-seconds correctly") - Pad microseconds to 3 digits so it gets
	converted correctly. Thanks, Ken Robbins (kenneth.robbins at gmail)!
	* Make tests/ actually run tests. It looked like it was
	half-finished and not working. This fills it out and makes it work and
	actually test a few things. (5373541eb899)
	* Make it possible to use `python test`
	* Bunch of fixes to eliminate build/install warnings (adb0fc75bfd0,
	fe6cb9aa5120, 446f0005e638, e8d4b19d87b1, 90b2aa2ea01f, 7bb29af4b22c)
	* Add `pymssql.get_dbversion` function that wraps the dbversion
	function in FreeTDS. (1158a5d2be9c)
	* Add a `get_freetds_version` function (a4286224dcf2)
	* Fix issue 109 ("Failure to pass Unicode characters to callproc;
	failing test:
	Skip test because it fails with some versions of FreeTDS but passes
	with others. (d05341273673)
	* Fix issue 116 ("A few tests fail if running on a system that has SQL
	Server available on port 1433") (0fc4086447fe)
	* Modify tests/ to use server='dontnameyourserverthis'
	when doing various tests so it doesn't try to connect to a SQL
	Server listening on localhost:1433 (0fc4086447fe)
	* tox.ini: Add {posargs:-w tests -v} to nosetests invocation so that
	we can pass arguments to tox -- e.g.: to run only specific tests
	* tox.ini: Add "ipdb" to deps, because the IPython debugger is very
	nice for debugging why tests are failing (be9ee40156cb)
	* Fix issue 114 ("Fix SP name handling in threaded test so we can
	actually run it.") (6ac2b75747ad)
	* Fix issue 100 (Error when executing {build,develop} on a
	system with no setuptools: "name 'STDevelopCmd' is not defined")
	* Issue 45 ("Make SQLAlchemy tests part of our testing process"): Add
	tests/ for running the SQLAlchemy test suite
	with pymssql using the server configured in tests/tests.cfg
	* Fix issue 92 ("Cursor fetch* methods return redundant keys for
	column names and column numbers.") (08ae783880dd)
	* tests/
	bug 18 ("FetchAll fails to return rows when running against a
	connection instantiated with as_dict=True."): Add a test which
	illustrates that the issue is resolved. (058d761cc761)
	* Fix issue 60 ("cursor.execute raise UnicodeDecodeError if query and
	params in unicode"): Add patch from tonal.promsoft and add tests.
	* Add *.c to so they get included in sdist and end-users
	don't need to run Cython. (25c1a84aac0c)
	* Fix issue 56 ("callproc do not accept None and unicode string in
	parameters"): Add patch from tonal.promsoft and add tests
  * version 2.0.0b1-dev-20130403

Version 2.0.0b1-dev-20130108 - 2013-01-08 - Marc Abramowitz <>
    * change: put compiled FreeTDS for Windows in pymmsql source, add build
	instructions to README, better Visual Studio support (#61)
    + feature: support hostname, port, tds_version connect params without freetds.config
    + feature: make pymssql.Cursor.rownumber give accurate results for executemany()
    + feature: bundle FreeTDS libraries & use static libary includes to avoid
        most end-user-developers needing to mess with FreeTDS
    * change: speed up handling of tuples/lists when quoting (dieterv77)
    - bug #46: better handling for byte strings that don't represent ascii data
    - bug: custom param handling avoids bugs when '%' is used in the SQL (modulus operator)
    - bug: fix pymssql.DBAPIType so that comparisons work as expected
    - bug: fetch*() functions would erroneously raise OperationalError when rows exhausted
    - bug #47: fix threaded tests crashing
    - bug #79: fix prevision problem with floats (dieterv77)
		- bug #14: Add voodoo that undoes setuptools monkeypatching
		that causes `pip install` to not work with setuptools unless pyrex
		is installed. (86a73a19d5bd)
		- bug #106 (OS X: "Symbol not found: _dbadata" error when importing
		pymssql): Fix OS X build by modifying so that on OS X we
		don't attempt to link with the bundled FreeTDS *Linux* library.
		+ feature: Add support for running tox ( to
		test across multiple Python versions. (5fa7a6548b31)
		- bug #44: Remove test_long_identifiers from
		because SQLAlchemy removed the 30 character limit on identifiers.
		- feature: Add voodoo so that Cython can automatially be
		downloaded if it's not installed instead of an ImportError
		- bug #105: Link with librt on Unix platforms that have it (like
		Linux, but not FreeBSD or OS X) to prevent 'undefined symbol:
		clock_gettime' error when importing pymssql. (2b255b1c035f)

Tue Nov 02 09:33:00 2010 Damien Churchill <>
	* _mssql.pyx:
		+ feature: add support for nullable ints and nullable bits in
		           stored procedure parameters.
		+ feature: add support for positional parameters in stored
		+ bugfix:  add support for using type subclasses as parameters
		+ bugfix:  correctly report incorrect logins.
		+ feature: add support for setting the application name
		+ bugfix:  accept more than just the decimal.Decimal type for
		           money and decimal parameters.
		+ bugfix:  fix raising exceptions from convert_python_value()
		+ bugfix:  fix binding parameters of int type when larger than
		           2^31 - 1 (raise exception).
		+ bugfix:  use sprintf rather than python strings in the msg_handler
		+ bugfix:  use sprintf rather than python strings in the err_handler
		+ bugfix:  make compatible with Cython 0.13
		+ feature: remove the trusted parameter to connect()
		+ bugfix:  fix issue 15, not setting implicit_transactions on connect
		+ bugfix:  fix issue 32, setting the wrong hostname on login
	* pymssql.pyx:
		+ feature: add initial support for callproc()
		+ feature: add support for setting the application name
		+ bugfix:  fix issue #7, thanks has.temp3
		+ bugfix:  fix issue #10, rowcount property being incorrect
		+ bugfix:  make compatible with Cython 0.13
		+ feature: remove the trusted parameter to connect()
		+ feature: add returnvalue property with the result of a callproc()
		+ feature: fix raising exceptions when args[0] is not a string
		+ feature: include the tests
		+ bugfix:  include
		+ bugfix:  fix issue #8, ZipFile don't has the attribute
		           'extractall' error for python2.5
	* version 1.9.909

Wed Apr 28 11:10:00 2010 Damien Churchill <>
		+ bugfix: fix recursive-include for .pyrex
	* version 1.9.908

Wed Apr 21 16:02:00 2010 Damien Churchill <>
		+ bugfix: include missing .pyrex folder
	* version 1.9.907

Fri Apr 09 13:16:00 2010 Damien Churchill <>
		+ bugfix: include hack faking that pyrex is installed to workaround
		          a bug in setuptools.
	* _mssql.pyx:
		+ bugfix: add support for connecting using "." and "(local)"
	* pymssql.pyx:
		+ feature: add the output type to be used with callproc()
		+ depreciate: the dsn keyword param to pymssql.connect()
		+ feature: add the get/set_max_connections to pymssql
	* sqlfront.pxd:
		+ feature: tidy up and remove all unused methods.
	* version 1.9.906

Mon Nov 23 13:37:00 2009 Damien Churchill <>
	* _mssql.pyx:
		+ feature: add support for varbinary types
		+ feature: add support for passing in charset to _quote_data
		+ bugfix: rename MSSQLConnection.next_result to
		          MSSQLConnection.nextresult as before
		+ bugfix: set the charset upon login
		+ feature: rewrite _remove_locale using C types instead, 20x faster
		+ feature: add a charset param to quote_data and relating funcs that
		           allows the charset to be specified for unicode encodes.
	* pymssql.pyx:
		+ feature: add DSN support that was missing
		+ bugfix: fix rowcount property
	* sqlfront.pxd:
	* tests:
		+ feature: add test for multiple results
		+ feature: fix building on windows
		+ feature: clean generated C files in the clean command
		+ feature: automatically extract on windows when
	* version 1.9.903

Fri Nov 20 13:03:00 2009 Damien Churchill <>
	* mssqldbmodule.c: deprecated in favour of _mssql.pyx
	* deprecated in favour of
	+ feature: added support for uniqueidentifier types
	+ feature: added support for calling remote procedures programmatically
	* version 1.9.901

Tue May 12 15:43:00 2009  Andrzej Kukula <>
	* mssqldbmodule.c:
		+ bugfix: pymssql didn't return second, third etc. result set
			in case of multi-result statements, e.g. 'SELECT 1; SELECT 2',
			thanks Damien Churchill <>

Wed Apr 29 19:31:00 2009  Andrzej Kukula <>
	* mssqldbmodule.c:
	  + fixed possible memory leak, thanks Evgeny Cherkashin

Tue Apr 23 23:00:00 2009  Andrzej Kukula <>
	+ bugfix: fixed rare quoting bug in select_db()
	+ feature: added 'max_conn' parameter to pymssql.connect() and
	  _mssql.connect() which defaults to 25, thanks Daniel Watrous
	* nagios-plugin update - thanks Josselin Mouette <>:
	  + Include a -P port option, to avoid having to passing it with the
		host name
	  + Fix the encoding of the comments; utf-8 is the declared encoding
		of the file and must be followed
	  + Fix a typo in the SQL syntax
	  + Connect explicitly to the "master" database (required since 1.0.0)
	  + Improve perfdata output.
	* version 1.0.2

Tue Apr 21 22:56:00 2009  Andrzej Kukula <>
	* mssqldbmodule.c:
	  + bugfix in format_and_run_query(): query strings were sometimes
		overwritten with garbage due to DECREF in wrong place; thanks
		Igor Nazarenko <>
	  + bugfix in get_result(): if a query batch contained DECLARE or
		possibly other T-SQL statements, no results were returned
		thanks Kay Schluehr <>
	  + bugfix in execute_scalar(): check if there are any columns in result
	  + bugfix: check for FAIL after each dbnextrow()
	  + feature: Add support for bigint - #2660972; thanks Alexandr
		Zamaraev <>
	* pymssql.c:
	  + bugfix in execute(): if execute is called without second argument,
		don't treat '%' in query string as formatting character; restored
		compatibility with common sense and with pymssql < 1.0.0; thanks
		Corey Bertram <>,
		Wes McKinney <>
	  + feature: it is possible to specify 'as_dict' to pymssql.connect
		and rows will be returned as dictionaries instead of tuples;
		thanks Daniel Watrous <>

Thu Jan 30 18:36:00 2009  Andrzej Kukula <>
	* mssqldbmodule.c:
	  + Pyssize_t error on x64 - thanks Josselin Mouette <>
	  + critical charset updates, thanks Josselin Mouette <>
	  + more Py_ssize_t updates, further code cleanups
	  + fixed some compiler warnings
	  + execute() failed, thanks Josselin Mouette <>
	  + critical charset updates, thanks Josselin Mouette <>
	  + removed warnings, users don't want them and they are not 'MUST'
		priority in DB-API spec
	* nagios-plugin: introducted Nagios plugin, thanks Julien Blache
	  and Josselin Mouette
	* version 1.0.1

Thu Jan 29 19:23:00 2009  Andrzej Kukula <>
	* version 1.0.0
	* so many changes I'll not put them here, I'll document
	  changes from now on.

Mon Sep 25 20:18:00 2006  Andrzej Kukula <>
	* fix for Fink (http://Fink.SF.Net) under OS X (thanks
	  Terrence Brannon <>)

Sun Sep 24 10:44:00 2006  Andrzej Kukula <>
	  + it can now dynamically determine the path to SQL 2000 Developer
		Tools, if win32api and win32con modules are available
	  + simple Python version check to prevent most frequently asked
	  + version 0.8.0

Wed Sep 13 01:20:00 2006  Andrzej Kukula <>
	* mssqldbmodule.c:
	  + corrected misspellings in docstrings
	  + fixed segfault on connection close with Python 2.5; thanks
		Justin Francis <>
	  + fixed two minor DB-API incompatibilities (thanks Matthew Good
	  + fixed datetime quoting (thanks Jan Finell <>)
	* pymssql should be able to build on cygwin (thanks
	* docstring fixes, webpage doc updates

Tue May 15 03:18:00 2006  Jooncheol Park <>
	*, PKG-INFO, README: license change to LGPL

Wed Mar 15 08:18:00 2006  Andrzej Kukula <>
	* fixed datetime issue (thanks Jan Finell

Fri Feb 24 16:11:00 2006  Andrzej Kukula <>
	* mssqldbmodule.c: fixed typos in docstrings (thanks Konstantin

Tue Dec 27 15:14:00 2005  Andrzej Kukula <>
	* mssqldbmodule.c: bug fixes, improvements and cleanups:
	  + implemented set_login_timeout() and set_query_timeout() functions;
	  + eliminated unnecessary ODBC code
	  + cleaned up exception code and improved exception handling,
		SF bug #1335560
	  + web page now correctly mentions FreeTDS 0.63 as the minimal
		required version
	  + stdmsg() method is now deprecated; all errors are concatenated
		in errmsg()
	  + implemented min_error_severity: all errors at or above that
		level will raise the exception; if the severity is lower, they
		will just accumulate in errmsg()
	  + added setting coltype to NUMBER for float types (found by
		Jakub Labath)
	  + reincarnated ntwdblib.dll which turned out to be redistributable
		after all; pymssql includes the latest version that allows
		connecting to SQL 2005; eliminated some stupid notes from the
		web page and will ease set up process for users
	* new file
	  + provided by Jakub Labath, this file performs some basic DB-API
		compliance tests; it immediately triggered the unicode bug
	* version 0.7.4

Sat Oct 22 19:41:00 2005  Andrzej Kukula <>
	* mssqldbmodule.c: multithreading improvements - from now on pymssql
	  is thread-safe, it releases GIL in proper places; idea and initial
	  patch by John-Peter Lee (thanks very much!)

Mon Sep 5 23:29:00 2005  Andrzej Kukula <>
	* fixed an installation issue regarding importing pymssql
	  that imports _mssql which isn't installed, and blows up with
	  AttributeError... (thanks Vsevolod Stakhov)
	* version 0.7.3

Mon Sep 5 00:32:00 2005  Andrzej Kukula <>
	* version 0.7.2

Sun Sep 4 23:12:00 2005  Andrzej Kukula <>

	* mssqldbmodule.c: improvements and cleanups:
	  + improved error handling: if the db function fails, the exception
		is thrown automatically and immediately; no need to check
		return value of conn.query(), just catch _mssql.error
	  + improved error handling: it is possible that MS SQL calls message
		handler twice; now _mssql catches and reports both of them at once
	  + improved error handling: in some cases _mssql.query() returns
		success but the results are invalid; now it is handled properly
		(example "SELECT CAST(1234.5678 AS NUMERIC(4,2))")
	  + added proper connection initialization: a number of SET statements
		are executed upon connection setup to set sensible SQL behaviour;
		see source for details; one needs to unset them if needed
	  + implemented min_{message|error}_severity as it is in php_mssql
		to ignore unimportant errors; it's work in progress
	  + new function rmv_lcl() initially by Mark Pettit, to strip locale
		crap from MONEY values converted to SQLCHAR while generating
		Decimal object
	  + other small fixes, improvements and janitorial work

Tue Aug 30 00:16:00 2005  Andrzej Kukula <>

	* mssqldbmodule.c: new features:
	  + large numbers (DECIMAL, NUMERIC, MONEY, SMALLMONEY) are returned
		as Decimal object -- this helps maintain accuracy; thanks to
		Mark Pettit for help
	  + COMPUTE clauses are supported (it wouldn't fetch data for those
		columns before)
	  + ROWID type has been removed from _mssql module
	  + new type DECIMAL to denote Decimal objects in result set

Mon Aug 29 21:59:00 2005  Andrzej Kukula <>

	* mssqldbmodule.c: some improvements:
	  + BIT values are returned as Python bool objects, suggested by
		Mark Pettit
	  + close() method returns None on success (not to be used at all)
		and throws exception on error
	  + fixed use of uninitialized value when parsing SMALLDATETIME
	  + another round of performance improvements in GetRow() - eliminated
		unnecessary data conversions and unneeded DB-Lib calls
	  + janitorial fixes

Mon Aug 22 04:35:00 2005  Andrzej Kukula <>

	* mssqldbmodule.c: massive diff:
	  + fixed bug with fetching query results of some data types;
		found by Mark Pettit
	  + fixed IndexError when query returns no rows; patch by Jakub Labath
	  + rewritten function GetRow() that fetches query results: performance
		improvements, better handling of result data types; datetime
		is returned as datetime object instead of string (it's more
		consistent with other values -- and more pythonic :)
	  + eliminated DetermineRowSize()
	  + cleanups: _mssql_init() further improvements w.r.t. Python API
	  + janitorial fixes
	  + added licensing information
	* docstring changed to look nicer with help()
	* version 0.7.2

Thu Aug 11 02:12:00 2005  Andrzej Kukula <>

	* mssqldbmodule.c: improved module init function: added doc string,
	  made compliant with Python 2.0+ module interface (there are no more
	  coredumps on help())
	* mssqldbmodule.c: documented that _mssql.connect() is not portable
	  between FreeTDS-dependent platforms and Windows platforms; documented
	  host:port usage

Sat Jul 23 14:20:00 2005  Andrzej Kukula <>

	* mssqldbmodule.c: eliminated problems with Python exiting upon
	  invalid login credentials with FreeTDS - the culprit was INT_EXIT
	  and FreeTDS setting DBDEAD
	* mssqldbmodule.c: added better error messages (esp. on Windows)
	* mssqldbmodule.c: added msg_handler and err_handler debugging
	* 0.7.1 packages re-released

Fri Jul 22 03:19:00 2005  Andrzej Kukula <>

	* mssqldbmodule.c: major change; module revamped to support some
	  more builtin Python features; some redundant code removed; memset()
	  removed as there were no benefits but performance decrease
	* mssqldbmodule.c: help(_mssql) works; help for conn object works too
	* _quote: removed escaping backslash -- with MSSQL it is
	  only needed to escape single quotes by duplicating them
	* pymssqlCnx class: added a few checks to properly support
	  DB-API 2.0 (see .close() in PEP 249)
	* version 0.7.1

Wed Jul 20 22:12:00 2005  Andrzej Kukula <>

	* mssqldbmodule.c: removed the workaround for date issue; there were
	  more problems than benefits
	* mssqldbmodule_tds.c: removed
	* some more cleanups and corrections

Tue Jul 19 14:23:00 2005  Andrzej Kukula <>

	* mssqldbmodule.c: major change; many portability problems fixed
	* mssqldbmodule.c: eliminated port setting; this is job for freetds.conf
	* mssqldbmodule_tds.c: module to get FreeTDS compile-time settings
	* build fixes; now it builds cleanly on FreeBSD, Linux and Windows
	* version 0.7.0

Mon Jul 18 15:21:00 2005  Andrzej Kukula <>

	* mssqldbmodule.c: fix build on Windows: changed MS_WIN32 to MS_WINDOWS
	  reported by Mirek Rusin <>
	* mssqldbmodule.c: many small fixes and cleanups; janitorial fixes;
	  indentation using indent(1L)
	* ChangeLog fix! 'mysql' was mentioned instead of 'mssql'...

Fri Feb 25 02:15:01 2005  Andrzej Kukula <>

	* Fix build on Windows with Visual Studio .NET 2003
	  and MS SQL Server 2000 SP3a
	* mssqldbmodule.c: Fix compile error with Visual Studio .NET 2003
	* mssqldbmodule.c: Add detection/workaround for date issue caused by
	  different dbdatecrack() prototypes
	* README.freetds: describe dbdatecrack()-related issue

Thu Feb 24 02:03:14 2005  Alejandro Dubrovsky  <>

	* Export column type names
	* mssqldbmodule.c:  Return column type information for headers
	* Use type information to make cursor.description conform to API 2

2005-02-17  Alejandro Dubrovsky  <>

	* Apply patch by Rob Nichols to get cursor.description closer to API 2 compliance

2005-02-08  Alejandro Dubrovsky  <>

	* Message changes in mssqldbmodule.c (typos, grammar, etc)

2005-02-07  Alejandro Dubrovsky  <>

	* Added ChangeLog
	* API Change:  add 6th parameter 'port' to connect
	* Don't close connection on cursor close (noted by Alberto Pastore on the sourceforge project page)
	* Make cursor.fetchone comply with DB-SIG return a tuple, not a list of tuples (report and patch by Chris Curvey)