summaryrefslogtreecommitdiff
path: root/lib/sqlalchemy
diff options
context:
space:
mode:
authorMike Bayer <mike_mp@zzzcomputing.com>2010-02-14 20:24:15 +0000
committerMike Bayer <mike_mp@zzzcomputing.com>2010-02-14 20:24:15 +0000
commit6a935a0e27dc7a196be2f325a2bf8e39486821b4 (patch)
treedb871c5f8d0cd51a30e9bfaa2c63a8b8a68b360c /lib/sqlalchemy
parent82e1e466e6cb176f35145b50fdadaaaddf737d84 (diff)
downloadsqlalchemy-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.py8
-rw-r--r--lib/sqlalchemy/dialects/mysql/mysqlconnector.py63
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