diff options
| author | Mike Bayer <mike_mp@zzzcomputing.com> | 2010-02-14 20:24:15 +0000 |
|---|---|---|
| committer | Mike Bayer <mike_mp@zzzcomputing.com> | 2010-02-14 20:24:15 +0000 |
| commit | 6a935a0e27dc7a196be2f325a2bf8e39486821b4 (patch) | |
| tree | db871c5f8d0cd51a30e9bfaa2c63a8b8a68b360c /lib/sqlalchemy | |
| parent | 82e1e466e6cb176f35145b50fdadaaaddf737d84 (diff) | |
| download | sqlalchemy-6a935a0e27dc7a196be2f325a2bf8e39486821b4.tar.gz | |
- Further fixes for the mysql-connector dialect. [ticket:1668]
Diffstat (limited to 'lib/sqlalchemy')
| -rw-r--r-- | lib/sqlalchemy/dialects/mysql/base.py | 8 | ||||
| -rw-r--r-- | lib/sqlalchemy/dialects/mysql/mysqlconnector.py | 63 |
2 files changed, 60 insertions, 11 deletions
diff --git a/lib/sqlalchemy/dialects/mysql/base.py b/lib/sqlalchemy/dialects/mysql/base.py index 82a4af941..686e3da62 100644 --- a/lib/sqlalchemy/dialects/mysql/base.py +++ b/lib/sqlalchemy/dialects/mysql/base.py @@ -554,7 +554,13 @@ class BIT(sqltypes.TypeEngine): self.length = length def result_processor(self, dialect, coltype): - """Convert a MySQL's 64 bit, variable length binary string to a long.""" + """Convert a MySQL's 64 bit, variable length binary string to a long. + + TODO: this is MySQL-db, pyodbc specific. OurSQL and mysqlconnector + already do this, so this logic should be moved to those dialects. + + """ + def process(value): if value is not None: v = 0L diff --git a/lib/sqlalchemy/dialects/mysql/mysqlconnector.py b/lib/sqlalchemy/dialects/mysql/mysqlconnector.py index 3ac207109..165c7b73e 100644 --- a/lib/sqlalchemy/dialects/mysql/mysqlconnector.py +++ b/lib/sqlalchemy/dialects/mysql/mysqlconnector.py @@ -6,12 +6,14 @@ import re -from sqlalchemy.dialects.mysql.base import MySQLDialect, MySQLExecutionContext,\ - MySQLCompiler, MySQLIdentifierPreparer +from sqlalchemy.dialects.mysql.base import (MySQLDialect, + MySQLExecutionContext, MySQLCompiler, MySQLIdentifierPreparer, + BIT, NUMERIC) from sqlalchemy.engine import base as engine_base, default from sqlalchemy.sql import operators as sql_operators from sqlalchemy import exc, log, schema, sql, types as sqltypes, util +from sqlalchemy import processors class MySQL_mysqlconnectorExecutionContext(MySQLExecutionContext): @@ -33,10 +35,23 @@ class MySQL_mysqlconnectorIdentifierPreparer(MySQLIdentifierPreparer): value = value.replace(self.escape_quote, self.escape_to_quote) return value.replace("%", "%%") +class _myconnpyNumeric(NUMERIC): + def result_processor(self, dialect, coltype): + if self.asdecimal: + return None + return processors.to_float + +class _myconnpyBIT(BIT): + def result_processor(self, dialect, coltype): + """MySQL-connector already converts mysql bits, so.""" + + return None + class MySQL_mysqlconnector(MySQLDialect): driver = 'mysqlconnector' supports_unicode_statements = False - supports_sane_rowcount = True + supports_unicode_binds = True + supports_sane_rowcount = False supports_sane_multi_rowcount = True default_paramstyle = 'format' @@ -45,6 +60,14 @@ class MySQL_mysqlconnector(MySQLDialect): preparer = MySQL_mysqlconnectorIdentifierPreparer + colspecs = util.update_copy( + MySQLDialect.colspecs, + { + sqltypes.Numeric: _myconnpyNumeric, + BIT: _myconnpyBIT, + } + ) + @classmethod def dbapi(cls): from mysql import connector @@ -53,24 +76,44 @@ class MySQL_mysqlconnector(MySQLDialect): def create_connect_args(self, url): opts = url.translate_connect_args(username='user') opts.update(url.query) + + util.coerce_kw_type(opts, 'buffered', bool) + util.coerce_kw_type(opts, 'raise_on_warnings', bool) + opts['buffered'] = True + opts['raise_on_warnings'] = True + return [[], opts] def _get_server_version_info(self, connection): dbapi_con = connection.connection + + from mysql.connector.constants import ClientFlag + dbapi_con.set_client_flag(ClientFlag.FOUND_ROWS) + version = dbapi_con.get_server_version() return tuple(version) def _detect_charset(self, connection): - """Sniff out the character set in use for connection results.""" - return connection.connection.get_characterset_info() def _extract_error_code(self, exception): - m = re.compile(r"\(.*\)\s+(\d+)").search(str(exception)) - c = m.group(1) - if c: - return int(c) - else: + try: + return exception.orig.errno + except AttributeError: return None + + def is_disconnect(self, e): + errnos = (2006, 2013, 2014, 2045, 2055, 2048) + exceptions = (self.dbapi.OperationalError,self.dbapi.InterfaceError) + if isinstance(e, exceptions): + return e.errno in errnos + else: + return False + + def _compat_fetchall(self, rp, charset=None): + return rp.fetchall() + def _compat_fetchone(self, rp, charset=None): + return rp.fetchone() + dialect = MySQL_mysqlconnector |
