diff options
author | Rick Morrison <rickmorrison@gmail.com> | 2007-03-18 16:25:19 +0000 |
---|---|---|
committer | Rick Morrison <rickmorrison@gmail.com> | 2007-03-18 16:25:19 +0000 |
commit | 1201de2eb5b7704acf1e7d24e615aaa6a0628795 (patch) | |
tree | 96f2794cf27a2f2f3c5e450c6b39f20e8a070e64 /lib/sqlalchemy/databases/mssql.py | |
parent | 037ee9fbf80279b4fc8e8d990860082c2f4dfea5 (diff) | |
download | sqlalchemy-1201de2eb5b7704acf1e7d24e615aaa6a0628795.tar.gz |
mssql: optionally use VARCHAR(max) instead of TEXT. [ticket:509]
Diffstat (limited to 'lib/sqlalchemy/databases/mssql.py')
-rw-r--r-- | lib/sqlalchemy/databases/mssql.py | 31 |
1 files changed, 23 insertions, 8 deletions
diff --git a/lib/sqlalchemy/databases/mssql.py b/lib/sqlalchemy/databases/mssql.py index 60d52d181..f7d64761a 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() + |