From: Rick Morrison Date: Sun, 18 Mar 2007 16:25:19 +0000 (+0000) Subject: mssql: optionally use VARCHAR(max) instead of TEXT. [ticket:509] X-Git-Tag: rel_0_3_6~15 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=1201de2eb5b7704acf1e7d24e615aaa6a0628795;p=thirdparty%2Fsqlalchemy%2Fsqlalchemy.git mssql: optionally use VARCHAR(max) instead of TEXT. [ticket:509] --- diff --git a/CHANGES b/CHANGES index 49e445aada..3eac53cfcb 100644 --- a/CHANGES +++ b/CHANGES @@ -159,6 +159,11 @@ - LIMIT with OFFSET now raises an error (MS-SQL has no OFFSET support) + - added an facility to use the MSSQL type VARCHAR(max) instead of TEXT + for large unsized string fields. Use the new "text_as_varchar" to + turn it on. [ticket:509] + + 0.3.5 diff --git a/lib/sqlalchemy/databases/mssql.py b/lib/sqlalchemy/databases/mssql.py index 60d52d1819..f7d64761af 100644 --- a/lib/sqlalchemy/databases/mssql.py +++ b/lib/sqlalchemy/databases/mssql.py @@ -222,7 +222,10 @@ class MSDate(sqltypes.Date): class MSText(sqltypes.TEXT): def get_col_spec(self): - return "TEXT" + if self.dialect.text_as_varchar: + return "VARCHAR(max)" + else: + return "TEXT" class MSString(sqltypes.String): def get_col_spec(self): @@ -238,7 +241,10 @@ class MSNVarchar(MSString): if self.length: return "NVARCHAR(%(length)s)" % {'length' : self.length} else: - return "NTEXT" + if self.dialect.text_as_varchar: + return "NVARCHAR(max)" + else: + return "NTEXT" class AdoMSNVarchar(MSNVarchar): def convert_bind_param(self, value, dialect): @@ -403,6 +409,7 @@ class MSSQLDialect(ansisql.ANSIDialect): def __init__(self, module=None, auto_identity_insert=True, **params): self.module = module or dbmodule or use_default() self.auto_identity_insert = auto_identity_insert + self.text_as_varchar = False ansisql.ANSIDialect.__init__(self, **params) self.set_default_schema_name("dbo") @@ -413,13 +420,19 @@ class MSSQLDialect(ansisql.ANSIDialect): self.auto_identity_insert = bool(opts.pop('auto_identity_insert')) if opts.has_key('query_timeout'): self.query_timeout = int(opts.pop('query_timeout')) + if opts.has_key('text_as_varchar'): + self.text_as_varchar = bool(opts.pop('text_as_varchar')) return make_connect_string(opts) def create_execution_context(self): return MSSQLExecutionContext(self) def type_descriptor(self, typeobj): - return sqltypes.adapt_type(typeobj, colspecs) + newobj = sqltypes.adapt_type(typeobj, colspecs) + # Some types need to know about the dialect + if isinstance(newobj, (MSText, MSNVarchar)): + newobj.dialect = self + return newobj def last_inserted_ids(self): return self.context.last_inserted_ids @@ -539,16 +552,17 @@ class MSSQLDialect(ansisql.ANSIDialect): row[columns.c.column_default] ) - # cope with varchar(max) - if charlen == -1: - charlen = None - args = [] for a in (charlen, numericprec, numericscale): if a is not None: args.append(a) coltype = ischema_names[type] - coltype = coltype(*args) + if coltype == MSString and charlen == -1: + coltype = MSText() + else: + if coltype == MSNVarchar and charlen == -1: + charlen = None + coltype = coltype(*args) colargs= [] if default is not None: colargs.append(schema.PassiveDefault(sql.text(default))) @@ -770,3 +784,4 @@ class MSSQLIdentifierPreparer(ansisql.ANSIIdentifierPreparer): use_default() +