From: Mike Bayer Date: Wed, 9 Jan 2008 18:09:49 +0000 (+0000) Subject: redid the _for_ddl String/Text deprecation warning correctly [ticket:912] X-Git-Tag: rel_0_4_2p3~6 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=eefd1f78a2ead8245791140e54fa3c32c4b41794;p=thirdparty%2Fsqlalchemy%2Fsqlalchemy.git redid the _for_ddl String/Text deprecation warning correctly [ticket:912] --- diff --git a/CHANGES b/CHANGES index d90bbe6072..cbceea4d99 100644 --- a/CHANGES +++ b/CHANGES @@ -8,7 +8,8 @@ CHANGES number rules - sql - Text type is properly exported now and does not raise a warning - on DDL create + on DDL create; String types with no length only raise warnings during + CREATE TABLE [ticket:912] - fixed bug in union() so that select() statements which don't derive from FromClause objects can be unioned diff --git a/lib/sqlalchemy/databases/access.py b/lib/sqlalchemy/databases/access.py index 78e3a99970..bf972a1c34 100644 --- a/lib/sqlalchemy/databases/access.py +++ b/lib/sqlalchemy/databases/access.py @@ -378,7 +378,7 @@ class AccessCompiler(compiler.DefaultCompiler): class AccessSchemaGenerator(compiler.SchemaGenerator): def get_column_specification(self, column, **kwargs): - colspec = self.preparer.format_column(column) + " " + column.type.dialect_impl(self.dialect).get_col_spec() + colspec = self.preparer.format_column(column) + " " + column.type.dialect_impl(self.dialect, _for_ddl=True).get_col_spec() # install a sequence if we have an implicit IDENTITY column if (not getattr(column.table, 'has_sequence', False)) and column.primary_key and \ diff --git a/lib/sqlalchemy/databases/firebird.py b/lib/sqlalchemy/databases/firebird.py index 2474001794..5e231e8728 100644 --- a/lib/sqlalchemy/databases/firebird.py +++ b/lib/sqlalchemy/databases/firebird.py @@ -585,7 +585,7 @@ class FBSchemaGenerator(sql.compiler.SchemaGenerator): def get_column_specification(self, column, **kwargs): colspec = self.preparer.format_column(column) - colspec += " " + column.type.dialect_impl(self.dialect).get_col_spec() + colspec += " " + column.type.dialect_impl(self.dialect, _for_ddl=True).get_col_spec() default = self.get_column_default_string(column) if default is not None: diff --git a/lib/sqlalchemy/databases/informix.py b/lib/sqlalchemy/databases/informix.py index 3ad490f44b..f27e7a5b89 100644 --- a/lib/sqlalchemy/databases/informix.py +++ b/lib/sqlalchemy/databases/informix.py @@ -434,7 +434,7 @@ class InfoSchemaGenerator(compiler.SchemaGenerator): colspec += " SERIAL" self.has_serial = True else: - colspec += " " + column.type.dialect_impl(self.dialect).get_col_spec() + colspec += " " + column.type.dialect_impl(self.dialect, _for_ddl=True).get_col_spec() default = self.get_column_default_string(column) if default is not None: colspec += " DEFAULT " + default diff --git a/lib/sqlalchemy/databases/maxdb.py b/lib/sqlalchemy/databases/maxdb.py index b5d397d545..be1c4e70c1 100644 --- a/lib/sqlalchemy/databases/maxdb.py +++ b/lib/sqlalchemy/databases/maxdb.py @@ -953,7 +953,7 @@ class MaxDBIdentifierPreparer(compiler.IdentifierPreparer): class MaxDBSchemaGenerator(compiler.SchemaGenerator): def get_column_specification(self, column, **kw): colspec = [self.preparer.format_column(column), - column.type.dialect_impl(self.dialect).get_col_spec()] + column.type.dialect_impl(self.dialect, _for_ddl=True).get_col_spec()] if not column.nullable: colspec.append('NOT NULL') diff --git a/lib/sqlalchemy/databases/mssql.py b/lib/sqlalchemy/databases/mssql.py index d90c286b15..7aeedad981 100644 --- a/lib/sqlalchemy/databases/mssql.py +++ b/lib/sqlalchemy/databases/mssql.py @@ -956,7 +956,7 @@ class MSSQLCompiler(compiler.DefaultCompiler): class MSSQLSchemaGenerator(compiler.SchemaGenerator): def get_column_specification(self, column, **kwargs): - colspec = self.preparer.format_column(column) + " " + column.type.dialect_impl(self.dialect).get_col_spec() + colspec = self.preparer.format_column(column) + " " + column.type.dialect_impl(self.dialect, _for_ddl=True).get_col_spec() # install a IDENTITY Sequence if we have an implicit IDENTITY column if (not getattr(column.table, 'has_sequence', False)) and column.primary_key and \ diff --git a/lib/sqlalchemy/databases/mysql.py b/lib/sqlalchemy/databases/mysql.py index 41b35156ea..588ea341dc 100644 --- a/lib/sqlalchemy/databases/mysql.py +++ b/lib/sqlalchemy/databases/mysql.py @@ -1956,7 +1956,7 @@ class MySQLSchemaGenerator(compiler.SchemaGenerator): """Builds column DDL.""" colspec = [self.preparer.format_column(column), - column.type.dialect_impl(self.dialect).get_col_spec()] + column.type.dialect_impl(self.dialect, _for_ddl=True).get_col_spec()] default = self.get_column_default_string(column) if default is not None: diff --git a/lib/sqlalchemy/databases/oracle.py b/lib/sqlalchemy/databases/oracle.py index 79a276d62d..7ac8f89518 100644 --- a/lib/sqlalchemy/databases/oracle.py +++ b/lib/sqlalchemy/databases/oracle.py @@ -690,7 +690,7 @@ class OracleCompiler(compiler.DefaultCompiler): class OracleSchemaGenerator(compiler.SchemaGenerator): def get_column_specification(self, column, **kwargs): colspec = self.preparer.format_column(column) - colspec += " " + column.type.dialect_impl(self.dialect).get_col_spec() + colspec += " " + column.type.dialect_impl(self.dialect, _for_ddl=True).get_col_spec() default = self.get_column_default_string(column) if default is not None: colspec += " DEFAULT " + default diff --git a/lib/sqlalchemy/databases/postgres.py b/lib/sqlalchemy/databases/postgres.py index eacd0c7e11..3c0314e64a 100644 --- a/lib/sqlalchemy/databases/postgres.py +++ b/lib/sqlalchemy/databases/postgres.py @@ -115,7 +115,7 @@ class PGArray(sqltypes.Concatenable, sqltypes.TypeEngine): item_type = item_type() self.item_type = item_type - def dialect_impl(self, dialect): + def dialect_impl(self, dialect, **kwargs): impl = self.__class__.__new__(self.__class__) impl.__dict__.update(self.__dict__) impl.item_type = self.item_type.dialect_impl(dialect) @@ -694,7 +694,7 @@ class PGSchemaGenerator(compiler.SchemaGenerator): else: colspec += " SERIAL" else: - colspec += " " + column.type.dialect_impl(self.dialect).get_col_spec() + colspec += " " + column.type.dialect_impl(self.dialect, _for_ddl=True).get_col_spec() default = self.get_column_default_string(column) if default is not None: colspec += " DEFAULT " + default diff --git a/lib/sqlalchemy/databases/sqlite.py b/lib/sqlalchemy/databases/sqlite.py index b357f48dec..92645e524f 100644 --- a/lib/sqlalchemy/databases/sqlite.py +++ b/lib/sqlalchemy/databases/sqlite.py @@ -386,7 +386,7 @@ class SQLiteCompiler(compiler.DefaultCompiler): class SQLiteSchemaGenerator(compiler.SchemaGenerator): def get_column_specification(self, column, **kwargs): - colspec = self.preparer.format_column(column) + " " + column.type.dialect_impl(self.dialect).get_col_spec() + colspec = self.preparer.format_column(column) + " " + column.type.dialect_impl(self.dialect, _for_ddl=True).get_col_spec() default = self.get_column_default_string(column) if default is not None: colspec += " DEFAULT " + default diff --git a/lib/sqlalchemy/databases/sybase.py b/lib/sqlalchemy/databases/sybase.py index c170a9723c..f461125aa3 100644 --- a/lib/sqlalchemy/databases/sybase.py +++ b/lib/sqlalchemy/databases/sybase.py @@ -827,7 +827,7 @@ class SybaseSQLSchemaGenerator(compiler.SchemaGenerator): #colspec += " numeric(30,0) IDENTITY" colspec += " Integer IDENTITY" else: - colspec += " " + column.type.dialect_impl(self.dialect).get_col_spec() + colspec += " " + column.type.dialect_impl(self.dialect, _for_ddl=True).get_col_spec() if not column.nullable: colspec += " NOT NULL" diff --git a/lib/sqlalchemy/logging.py b/lib/sqlalchemy/logging.py index 7c2bd636c5..57e7bcfd7d 100644 --- a/lib/sqlalchemy/logging.py +++ b/lib/sqlalchemy/logging.py @@ -31,7 +31,7 @@ import sys, warnings # py2.5 absolute imports will fix.... logging = __import__('logging') - +# why is this in the "logging" module? class SADeprecationWarning(DeprecationWarning): pass diff --git a/lib/sqlalchemy/sql/compiler.py b/lib/sqlalchemy/sql/compiler.py index 70343a7b4d..35a12efe39 100644 --- a/lib/sqlalchemy/sql/compiler.py +++ b/lib/sqlalchemy/sql/compiler.py @@ -286,7 +286,7 @@ class DefaultCompiler(engine.Compiled): return index.name def visit_typeclause(self, typeclause, **kwargs): - return typeclause.type.dialect_impl(self.dialect, _for_ddl=True).get_col_spec() + return typeclause.type.dialect_impl(self.dialect).get_col_spec() def visit_textclause(self, textclause, **kwargs): if textclause.typemap is not None: diff --git a/lib/sqlalchemy/types.py b/lib/sqlalchemy/types.py index b2819ece0a..1a5d0ab561 100644 --- a/lib/sqlalchemy/types.py +++ b/lib/sqlalchemy/types.py @@ -392,7 +392,7 @@ class String(Concatenable, TypeEngine): def dialect_impl(self, dialect, **kwargs): _for_ddl = kwargs.pop('_for_ddl', False) - if self.length is None: + if _for_ddl and self.length is None: warn_deprecated("Using String type with no length for CREATE TABLE is deprecated; use the Text type explicitly") return TypeEngine.dialect_impl(self, dialect, **kwargs) diff --git a/test/engine/reflection.py b/test/engine/reflection.py index 9b560e6689..8b4fec50de 100644 --- a/test/engine/reflection.py +++ b/test/engine/reflection.py @@ -7,6 +7,7 @@ from sqlalchemy import types as sqltypes from testlib import * from testlib import engines + class ReflectionTest(PersistTest): @testing.exclude('mysql', '<', (4, 1, 1)) @@ -24,7 +25,7 @@ class ReflectionTest(PersistTest): deftype = Integer if use_string_defaults: - deftype2 = String + deftype2 = Text defval2 = "im a default" deftype3 = Date if testing.against('oracle'): @@ -44,12 +45,12 @@ class ReflectionTest(PersistTest): Column('user_name', VARCHAR(20), nullable = False), Column('test1', CHAR(5), nullable = False), Column('test2', FLOAT(5), nullable = False), - Column('test3', TEXT), + Column('test3', Text), Column('test4', DECIMAL, nullable = False), Column('test5', TIMESTAMP), Column('parent_user_id', Integer, ForeignKey('engine_users.user_id')), Column('test6', DateTime, nullable = False), - Column('test7', String), + Column('test7', Text), Column('test8', Binary), Column('test_passivedefault', deftype, PassiveDefault(defval)), Column('test_passivedefault2', Integer, PassiveDefault("5")), diff --git a/test/sql/testtypes.py b/test/sql/testtypes.py index fc1da5578b..7bd012f42f 100644 --- a/test/sql/testtypes.py +++ b/test/sql/testtypes.py @@ -660,7 +660,40 @@ class DateTest(AssertMixin): finally: t.drop(checkfirst=True) +class StringTest(AssertMixin): + def test_nolen_string_deprecated(self): + metadata = MetaData(testbase.db) + foo =Table('foo', metadata, + Column('one', String)) + + import warnings + from sqlalchemy.logging import SADeprecationWarning + + warnings.filterwarnings("error", r"Using String type with no length.*") + + # no warning + select([func.count("*")], bind=testbase.db).execute() + + try: + # warning during CREATE + foo.create() + assert False + except SADeprecationWarning, e: + assert "Using String type with no length" in str(e) + + bar = Table('bar', metadata, Column('one', String(40))) + + try: + # no warning + bar.create() + # no warning for non-lengthed string + select([func.count("*")], from_obj=bar).execute() + finally: + bar.drop() + warnings.filterwarnings("always", r"Using String type with no length.*") + + class NumericTest(AssertMixin): def setUpAll(self): global numeric_table, metadata