From cd33d09ce08f04078840b322d203a9f262513a3f Mon Sep 17 00:00:00 2001 From: Philip Jenvey Date: Tue, 11 Aug 2009 04:16:48 +0000 Subject: [PATCH] o default Connector/J's characterEncoding=UTF-8 for generally better JDBC unicode handling o pass url query params down as jdbc connect opts --- lib/sqlalchemy/connectors/zxJDBC.py | 17 ++++++++++------- lib/sqlalchemy/dialects/mysql/zxjdbc.py | 11 ++++++++++- lib/sqlalchemy/dialects/oracle/zxjdbc.py | 9 ++------- 3 files changed, 22 insertions(+), 15 deletions(-) diff --git a/lib/sqlalchemy/connectors/zxJDBC.py b/lib/sqlalchemy/connectors/zxJDBC.py index 3cdfeb32e4..69f48082f1 100644 --- a/lib/sqlalchemy/connectors/zxJDBC.py +++ b/lib/sqlalchemy/connectors/zxJDBC.py @@ -21,16 +21,19 @@ class ZxJDBCConnector(Connector): return zxJDBC def _driver_kwargs(self): - """return kw arg dict to be sent to connect().""" + """Return kw arg dict to be sent to connect().""" return {} - def create_connect_args(self, url): - hostname = url.host - dbname = url.database - d, u, p, v = ("jdbc:%s://%s/%s" % (self.jdbc_db_name, hostname, dbname), - url.username, url.password, self.jdbc_driver_name) - return [[d, u, p, v], self._driver_kwargs()] + def _create_jdbc_url(self, url): + """Create a JDBC url from a :class:`~sqlalchemy.engine.url.URL`""" + return "jdbc:%s://%s/%s" % (self.jdbc_db_name, url.host, url.database) + def create_connect_args(self, url): + opts = self._driver_kwargs() + opts.update(url.query) + return [[self._create_jdbc_url(url), url.username, url.password, self.jdbc_driver_name], + opts] + def is_disconnect(self, e): if not isinstance(e, self.dbapi.ProgrammingError): return False diff --git a/lib/sqlalchemy/dialects/mysql/zxjdbc.py b/lib/sqlalchemy/dialects/mysql/zxjdbc.py index 6cdc6f4386..fddbfaabd3 100644 --- a/lib/sqlalchemy/dialects/mysql/zxjdbc.py +++ b/lib/sqlalchemy/dialects/mysql/zxjdbc.py @@ -6,6 +6,15 @@ JDBC Driver The official MySQL JDBC driver is at http://dev.mysql.com/downloads/connector/j/. +Character Sets +-------------- + +SQLAlchemy zxjdbc dialects pass unicode straight through to the +zxjdbc/JDBC layer. To allow multiple character sets to be sent from the +MySQL Connector/J JDBC driver, by default SQLAlchemy sets its +``characterEncoding`` connection property to ``UTF-8``. It may be +overriden via a ``create_engine`` URL parameter. + """ import re @@ -71,7 +80,7 @@ class MySQL_jdbc(ZxJDBCConnector, MySQLDialect): def _driver_kwargs(self): """return kw arg dict to be sent to connect().""" - return dict(CHARSET=self.encoding, yearIsDateType='false') + return dict(characterEncoding='UTF-8', yearIsDateType='false') def _extract_error_code(self, exception): # e.g.: DBAPIError: (Error) Table 'test.u2' doesn't exist diff --git a/lib/sqlalchemy/dialects/oracle/zxjdbc.py b/lib/sqlalchemy/dialects/oracle/zxjdbc.py index 0956d7ab65..9b0761f60b 100644 --- a/lib/sqlalchemy/dialects/oracle/zxjdbc.py +++ b/lib/sqlalchemy/dialects/oracle/zxjdbc.py @@ -64,13 +64,8 @@ class Oracle_jdbc(ZxJDBCConnector, OracleDialect): super(Oracle_jdbc, self).initialize(connection) self.implicit_returning = False - def create_connect_args(self, url): - hostname = url.host - port = url.port or '1521' - dbname = url.database - jdbc_url = 'jdbc:oracle:thin:@%s:%s:%s' % (hostname, port, dbname) - return [[jdbc_url, url.username, url.password, self.jdbc_driver_name], - self._driver_kwargs()] + def _create_jdbc_url(self, url): + return 'jdbc:oracle:thin:@%s:%s:%s' % (url.host, url.port or 1521, url.database) def _get_server_version_info(self, connection): version = re.search(r'Release ([\d\.]+)', connection.connection.dbversion).group(1) -- 2.47.3