From: Rick Morrison Date: Wed, 27 Sep 2006 00:01:16 +0000 (+0000) Subject: NCHAR and NVARCHAR support for MS-SQL. Patch from Kent Johnson X-Git-Tag: rel_0_3_0~120 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=b4112538dbd46ee7d3c25fc35f3c43aed342e429;p=thirdparty%2Fsqlalchemy%2Fsqlalchemy.git NCHAR and NVARCHAR support for MS-SQL. Patch from Kent Johnson --- diff --git a/CHANGES b/CHANGES index 69abfce04b..65946b4c49 100644 --- a/CHANGES +++ b/CHANGES @@ -15,6 +15,7 @@ to orm to allow tracking of mapper configurations, row iteration. -- introduces new "auto_identity_insert" option for auto-switching between "SET IDENTITY_INSERT" mode when values specified for IDENTITY columns -- now supports multi-column foreign keys -- fix to reflecting date/datetime columns + -- NCHAR and NVARCHAR type support added - more rearrangements of unit-of-work commit scheme to better allow dependencies within circular flushes to work properly...updated task traversal/logging implementation diff --git a/lib/sqlalchemy/databases/mssql.py b/lib/sqlalchemy/databases/mssql.py index 1274174f04..0a6dfbe1f4 100644 --- a/lib/sqlalchemy/databases/mssql.py +++ b/lib/sqlalchemy/databases/mssql.py @@ -148,9 +148,15 @@ class MSText(sqltypes.TEXT): class MSString(sqltypes.String): def get_col_spec(self): return "VARCHAR(%(length)s)" % {'length' : self.length} +class MSUnicode(sqltypes.Unicode): + def get_col_spec(self): + return "NVARCHAR(%(length)s)" % {'length' : self.length} class MSChar(sqltypes.CHAR): def get_col_spec(self): return "CHAR(%(length)s)" % {'length' : self.length} +class MSNChar(sqltypes.NCHAR): + def get_col_spec(self): + return "NCHAR(%(length)s)" % {'length' : self.length} class MSBinary(sqltypes.Binary): def get_col_spec(self): return "IMAGE" @@ -179,10 +185,12 @@ colspecs = { sqltypes.DateTime : MSDateTime, sqltypes.Date : MSDate, sqltypes.String : MSString, + sqltypes.Unicode : MSUnicode, sqltypes.Binary : MSBinary, sqltypes.Boolean : MSBoolean, sqltypes.TEXT : MSText, sqltypes.CHAR: MSChar, + sqltypes.NCHAR: MSNChar, } ischema_names = { @@ -190,7 +198,9 @@ ischema_names = { 'smallint' : MSSmallInteger, 'tinyint' : MSTinyInteger, 'varchar' : MSString, + 'nvarchar' : MSUnicode, 'char' : MSChar, + 'nchar' : MSNChar, 'text' : MSText, 'decimal' : MSNumeric, 'numeric' : MSNumeric, @@ -237,8 +247,8 @@ class MSSQLExecutionContext(default.DefaultExecutionContext): break if self.IINSERT: proxy("SET IDENTITY_INSERT %s ON" % compiled.statement.table.name) - super(MSSQLExecutionContext, self).pre_exec(engine, proxy, compiled, parameters, **kwargs) - + super(MSSQLExecutionContext, self).pre_exec(engine, proxy, compiled, parameters, **kwargs) + def post_exec(self, engine, proxy, compiled, parameters, **kwargs): """ Turn off the INDENTITY_INSERT mode if it's been activated, and fetch recently inserted IDENTIFY values (works only for one column) """ if getattr(compiled, "isinsert", False): diff --git a/lib/sqlalchemy/types.py b/lib/sqlalchemy/types.py index 6f4892530f..31c6a232ed 100644 --- a/lib/sqlalchemy/types.py +++ b/lib/sqlalchemy/types.py @@ -5,7 +5,7 @@ # the MIT License: http://www.opensource.org/licenses/mit-license.php __all__ = [ 'TypeEngine', 'TypeDecorator', 'NullTypeEngine', - 'INT', 'CHAR', 'VARCHAR', 'TEXT', 'FLOAT', 'DECIMAL', + 'INT', 'CHAR', 'VARCHAR', 'NCHAR', 'TEXT', 'FLOAT', 'DECIMAL', 'TIMESTAMP', 'DATETIME', 'CLOB', 'BLOB', 'BOOLEAN', 'String', 'Integer', 'Smallinteger', 'Numeric', 'Float', 'DateTime', 'Date', 'Time', 'Binary', 'Boolean', 'Unicode', 'PickleType', 'NULLTYPE', 'SMALLINT', 'DATE', 'TIME' @@ -270,6 +270,7 @@ class TIME(Time): pass class CLOB(String): pass class VARCHAR(String): pass class CHAR(String):pass +class NCHAR(Unicode):pass class BLOB(Binary): pass class BOOLEAN(Boolean): pass