Hi, The following patch replaces the previous one with the fix mentioned in the previous thread included. It also fixes the test cases to handle pymysql properly (that is exactly as MySQLdb) as well as a small typo in Saint Exupéry's snippet :)
As the google groups web interface will probably mangle it, the patch can also be found here: http://code.google.com/p/pymysql/issues/detail?id=41#c0 Along with the PyMySQL patch also found at the URL above, PyMySQL now behaves exactly as MySQLdb in SQLAlchemy's test suite. diff -r b29164cca942 lib/sqlalchemy/dialects/mysql/__init__.py --- a/lib/sqlalchemy/dialects/mysql/__init__.py Tue Nov 30 13:55:17 2010 -0500 +++ b/lib/sqlalchemy/dialects/mysql/__init__.py Mon Dec 06 20:27:47 2010 +0100 @@ -1,5 +1,5 @@ from sqlalchemy.dialects.mysql import base, mysqldb, oursql, \ - pyodbc, zxjdbc, mysqlconnector + pyodbc, zxjdbc, mysqlconnector, pymysql # default dialect base.dialect = mysqldb.dialect diff -r b29164cca942 lib/sqlalchemy/dialects/mysql/mysqldb.py --- a/lib/sqlalchemy/dialects/mysql/mysqldb.py Tue Nov 30 13:55:17 2010 -0500 +++ b/lib/sqlalchemy/dialects/mysql/mysqldb.py Mon Dec 06 20:27:47 2010 +0100 @@ -137,7 +137,9 @@ client_flag = opts.get('client_flag', 0) if self.dbapi is not None: try: - from MySQLdb.constants import CLIENT as CLIENT_FLAGS + CLIENT_FLAGS = __import__(self.dbapi.__package__ +'.constants', + globals(), locals(), + ['CLIENT'], 0).CLIENT client_flag |= CLIENT_FLAGS.FOUND_ROWS except: pass diff -r b29164cca942 lib/sqlalchemy/dialects/mysql/pymysql.py --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/lib/sqlalchemy/dialects/mysql/pymysql.py Mon Dec 06 20:27:47 2010 +0100 @@ -0,0 +1,10 @@ +from sqlalchemy.dialects.mysql.mysqldb import MySQLDialect_mysqldb + +class MySQLDialect_pymysql(MySQLDialect_mysqldb): + driver = 'pymysql' + + @classmethod + def dbapi(cls): + return __import__('pymysql') + +dialect = MySQLDialect_pymysql diff -r b29164cca942 lib/sqlalchemy/test/engines.py --- a/lib/sqlalchemy/test/engines.py Tue Nov 30 13:55:17 2010 -0500 +++ b/lib/sqlalchemy/test/engines.py Mon Dec 06 20:27:47 2010 +0100 @@ -151,7 +151,7 @@ from sqlalchemy.engine import url as engine_url - if config.db.driver == 'mysqldb': + if config.db.driver in ['mysqldb', 'pymysql']: dbapi_ver = config.db.dialect.dbapi.version_info if (dbapi_ver < (1, 2, 1) or dbapi_ver in ((1, 2, 1, 'gamma', 1), (1, 2, 1, 'gamma', 2), diff -r b29164cca942 lib/sqlalchemy/test/requires.py --- a/lib/sqlalchemy/test/requires.py Tue Nov 30 13:55:17 2010 -0500 +++ b/lib/sqlalchemy/test/requires.py Mon Dec 06 20:27:47 2010 +0100 @@ -261,7 +261,8 @@ def dbapi_lastrowid(fn): return _chain_decorators_on( fn, - fails_on_everything_except('mysql+mysqldb', 'mysql+oursql', 'sqlite+pysqlite') + fails_on_everything_except('mysql+mysqldb', 'mysql+oursql', + 'sqlite+pysqlite', 'mysql +pymysql') ) def sane_multi_rowcount(fn): diff -r b29164cca942 test/dialect/test_mysql.py --- a/test/dialect/test_mysql.py Tue Nov 30 13:55:17 2010 -0500 +++ b/test/dialect/test_mysql.py Mon Dec 06 20:27:47 2010 +0100 @@ -1398,6 +1398,7 @@ "MATCH (matchtable.title) AGAINST (%s IN BOOLEAN MODE)" % format) @testing.fails_on('mysql+mysqldb', 'uses format') + @testing.fails_on('mysql+pymysql', 'uses format') @testing.fails_on('mysql+oursql', 'uses format') @testing.fails_on('mysql+pyodbc', 'uses format') @testing.fails_on('mysql+zxjdbc', 'uses format') diff -r b29164cca942 test/engine/test_execute.py --- a/test/engine/test_execute.py Tue Nov 30 13:55:17 2010 -0500 +++ b/test/engine/test_execute.py Mon Dec 06 20:27:47 2010 +0100 @@ -63,7 +63,7 @@ conn.execute('delete from users') # some psycopg2 versions bomb this. - @testing.fails_on_everything_except('mysql+mysqldb', + @testing.fails_on_everything_except('mysql+mysqldb', 'mysql +pymysql', 'mysql+mysqlconnector', 'postgresql') @testing.fails_on('postgresql+zxjdbc', 'sprintf not supported') def test_raw_sprintf(self): diff -r b29164cca942 test/engine/test_reconnect.py --- a/test/engine/test_reconnect.py Tue Nov 30 13:55:17 2010 -0500 +++ b/test/engine/test_reconnect.py Mon Dec 06 20:27:47 2010 +0100 @@ -403,6 +403,9 @@ meta.drop_all() engine.dispose() + @testing.fails_on('+pymysql', + "Buffers the result set and doesn't check for " + "connection close") @testing.fails_on('+mysqldb', "Buffers the result set and doesn't check for " "connection close") diff -r b29164cca942 test/sql/test_types.py --- a/test/sql/test_types.py Tue Nov 30 13:55:17 2010 -0500 +++ b/test/sql/test_types.py Mon Dec 06 20:27:47 2010 +0100 @@ -421,7 +421,7 @@ def test_round_trip(self): unicodedata = u"Alors vous imaginez ma surprise, au lever du jour, "\ - u"quand une drôle de petit voix m’a réveillé. Elle "\ + u"quand une drôle de petite voix m’a réveillé. Elle "\ u"disait: « S’il vous plaît… dessine-moi un mouton! »" unicode_table.insert().execute(unicode_varchar=unicodedata,unicode_text=unicodedata) @@ -437,7 +437,7 @@ # vs. cursor.execute() unicodedata = u"Alors vous imaginez ma surprise, au lever du jour, quand "\ - u"une drôle de petit voix m’a réveillé. "\ + u"une drôle de petite voix m’a réveillé. "\ u"Elle disait: « S’il vous plaît… dessine-moi un mouton! »" unicode_table.insert().execute( @@ -455,7 +455,7 @@ """ensure compiler processing works for UNIONs""" unicodedata = u"Alors vous imaginez ma surprise, au lever du jour, quand "\ - u"une drôle de petit voix m’a réveillé. "\ + u"une drôle de petite voix m’a réveillé. "\ u"Elle disait: « S’il vous plaît… dessine-moi un mouton! »" unicode_table.insert().execute(unicode_varchar=unicodedata,unicode_text=unicodedata) @@ -477,7 +477,7 @@ """test the warnings raised when SQLA must coerce unicode binds.""" unicodedata = u"Alors vous imaginez ma surprise, au lever du jour, quand "\ - u"une drôle de petit voix m’a réveillé. "\ + u"une drôle de petite voix m’a réveillé. "\ u"Elle disait: « S’il vous plaît… dessine-moi un mouton! »" u = Unicode() @@ -526,7 +526,7 @@ """checks String(unicode_error='ignore') is passed to underlying codec.""" unicodedata = u"Alors vous imaginez ma surprise, au lever du jour, quand "\ - u"une drôle de petit voix m’a réveillé. "\ + u"une drôle de petite voix m’a réveillé. "\ u"Elle disait: « S’il vous plaît… dessine-moi un mouton! »" asciidata = unicodedata.encode('ascii', 'ignore') @@ -603,7 +603,7 @@ eq_( x, u'Alors vous imaginez ma surprise, au lever du jour, quand une ' - u'drle de petit voix ma rveill. Elle disait: Sil vous plat ' + u'drle de petite voix ma rveill. Elle disait: Sil vous plat ' u'dessine-moi un mouton! ' ) elif engine.dialect.returns_unicode_strings: @@ -691,6 +691,7 @@ eq_(e1.adapt(ENUM).schema, 'bar') @testing.fails_on('mysql+mysqldb', "MySQL seems to issue a 'data truncated' warning.") + @testing.fails_on('mysql+pymysql', "MySQL seems to issue a 'data truncated' warning.") def test_constraint(self): assert_raises(exc.DBAPIError, enum_table.insert().execute, -- Evax Software -- You received this message because you are subscribed to the Google Groups "sqlalchemy" group. To post to this group, send email to [email protected]. To unsubscribe from this group, send email to [email protected]. For more options, visit this group at http://groups.google.com/group/sqlalchemy?hl=en.
