]> git.ipfire.org Git - thirdparty/sqlalchemy/sqlalchemy.git/commitdiff
Do not specify type on mssql by default
authorFederico Caselli <cfederico87@gmail.com>
Fri, 7 Aug 2020 21:38:02 +0000 (23:38 +0200)
committerMike Bayer <mike_mp@zzzcomputing.com>
Sat, 12 Sep 2020 14:00:23 +0000 (10:00 -0400)
Make optional sequences render as identity in mssql
Remove unused dialect option sequence_default_column_type

Change-Id: I821eeffcb442f8d1b69186a9b798b15c3d8d6ff3

lib/sqlalchemy/dialects/mssql/base.py
lib/sqlalchemy/dialects/mysql/base.py
lib/sqlalchemy/dialects/postgresql/base.py
lib/sqlalchemy/engine/default.py
test/dialect/mssql/test_sequence.py
test/dialect/mssql/test_types.py
test/engine/test_execute.py
test/sql/test_defaults.py
test/sql/test_functions.py
test/sql/test_insert_exec.py

index d18fb72990ac2d1ccf68671626ad07d4330985bd..d265993cb9f4f323750304c03d2d23be6ecdf183 100644 (file)
@@ -242,9 +242,8 @@ SEQUENCE support
 
 The :class:`.Sequence` object now creates "real" sequences, i.e.,
 ``CREATE SEQUENCE``. To provide compatibility with other dialects,
-:class:`.Sequence` defaults to a data type of Integer and a start value of 1,
-even though the T-SQL defaults are BIGINT and -9223372036854775808,
-respectively.
+:class:`.Sequence` defaults to a start value of 1, even though the
+T-SQL defaults is -9223372036854775808.
 
 .. versionadded:: 1.4.0
 
@@ -751,7 +750,6 @@ from ...sql import expression
 from ...sql import func
 from ...sql import quoted_name
 from ...sql import util as sql_util
-from ...sql.type_api import to_instance
 from ...types import BIGINT
 from ...types import BINARY
 from ...types import CHAR
@@ -1633,6 +1631,16 @@ class MSExecutionContext(default.DefaultExecutionContext):
             type_,
         )
 
+    def get_insert_default(self, column):
+        if (
+            isinstance(column, sa_schema.Column)
+            and column is column.table._autoincrement_column
+            and isinstance(column.default, sa_schema.Sequence)
+            and column.default.optional
+        ):
+            return None
+        return super(MSExecutionContext, self).get_insert_default(column)
+
 
 class MSSQLCompiler(compiler.SQLCompiler):
     returning_precedes_values = True
@@ -2198,11 +2206,10 @@ class MSDDLCompiler(compiler.DDLCompiler):
         elif (
             column is column.table._autoincrement_column
             or column.autoincrement is True
+        ) and (
+            not isinstance(column.default, Sequence) or column.default.optional
         ):
-            if not isinstance(column.default, Sequence):
-                colspec += self.process(
-                    Identity(start=start, increment=increment)
-                )
+            colspec += self.process(Identity(start=start, increment=increment))
         else:
             default = self.get_column_default_string(column)
             if default is not None:
@@ -2322,13 +2329,10 @@ class MSDDLCompiler(compiler.DDLCompiler):
         return text
 
     def visit_create_sequence(self, create, **kw):
-
+        prefix = None
         if create.element.data_type is not None:
             data_type = create.element.data_type
-        else:
-            data_type = to_instance(self.dialect.sequence_default_column_type)
-
-        prefix = " AS %s" % self.type_compiler.process(data_type)
+            prefix = " AS %s" % self.type_compiler.process(data_type)
         return super(MSDDLCompiler, self).visit_create_sequence(
             create, prefix=prefix, **kw
         )
@@ -2537,8 +2541,7 @@ class MSDialect(default.DefaultDialect):
     ischema_names = ischema_names
 
     supports_sequences = True
-    # T-SQL's actual default is BIGINT
-    sequence_default_column_type = INTEGER
+    sequences_optional = True
     # T-SQL's actual default is -9223372036854775808
     default_sequence_base = 1
 
@@ -3088,7 +3091,6 @@ class MSDialect(default.DefaultDialect):
         RR = ischema.ref_constraints
         C = ischema.key_constraints.alias("C")
         R = ischema.key_constraints.alias("R")
-
         # Foreign key constraints
         s = (
             sql.select(
index 1d032b600f5de580296357c03f1a6868ca0ad1b0..670c16c2b21ace608be3d8989fa70394251ba45a 100644 (file)
@@ -2369,7 +2369,7 @@ class MySQLDialect(default.DefaultDialect):
     supports_sequences = False  # default for MySQL ...
     # ... may be updated to True for MariaDB 10.3+ in initialize()
 
-    sequences_optional = True
+    sequences_optional = False
 
     supports_for_update_of = False  # default for MySQL ...
     # ... may be updated to True for MySQL 8+ in initialize()
index 53c54ab65e3bcd316b12fe44697a7d7163640153..21223a1dbca0b4e49013a7deed741bec9c883d0f 100644 (file)
@@ -2576,7 +2576,6 @@ class PGDialect(default.DefaultDialect):
 
     supports_sequences = True
     sequences_optional = True
-    sequence_default_column_type = INTEGER
     preexecute_autoincrement_sequences = True
     postfetch_lastrowid = False
 
index ec0f2ed9f012f413fa7320460f07a9bce078b984..d5d8eabf4a28857ede982b9f2e4f27793599de89 100644 (file)
@@ -22,7 +22,6 @@ from . import cursor as _cursor
 from . import interfaces
 from .. import event
 from .. import exc
-from .. import Integer
 from .. import pool
 from .. import processors
 from .. import types as sqltypes
@@ -64,8 +63,6 @@ class DefaultDialect(interfaces.Dialect):
     # not cx_oracle.
     execute_sequence_format = tuple
 
-    sequence_default_column_type = Integer
-
     supports_views = True
     supports_sequences = False
     sequences_optional = False
index 36e2edd6dd26b955418176e2d1a7eb661a1d38b5..2b1db0b413ec9661ecdd65f623dcc1c805847026 100644 (file)
@@ -21,7 +21,9 @@ class SequenceTest(fixtures.TablesTest):
         Table(
             "int_seq_t",
             metadata,
-            Column("id", Integer, default=Sequence("int_seq")),
+            Column(
+                "id", Integer, default=Sequence("int_seq", data_type=Integer())
+            ),
             Column("txt", String(50)),
         )
 
@@ -29,11 +31,7 @@ class SequenceTest(fixtures.TablesTest):
             "bigint_seq_t",
             metadata,
             Column(
-                "id",
-                BIGINT,
-                default=Sequence(
-                    "bigint_seq", data_type=BIGINT, start=3000000000
-                ),
+                "id", BIGINT, default=Sequence("bigint_seq", start=3000000000),
             ),
             Column("txt", String(50)),
         )
index 399e0ca9059217869ee40c2af9f01d7db101d4f7..6d4d3f55ca68b56092d7665a2a11d1c3a0932fed 100644 (file)
@@ -561,10 +561,9 @@ class TypeRoundTripTest(
             metadata,
             Column(
                 "id",
-                testing.db.dialect.sequence_default_column_type,
+                Integer,
                 Sequence("numeric_id_seq", optional=True),
                 primary_key=True,
-                autoincrement=False,
             ),
             Column(
                 "numericcol", Numeric(precision=38, scale=20, asdecimal=True)
@@ -652,7 +651,7 @@ class TypeRoundTripTest(
             metadata,
             Column(
                 "id",
-                testing.db.dialect.sequence_default_column_type,
+                Integer,
                 Sequence("numeric_id_seq", optional=True),
                 primary_key=True,
             ),
index 5b922a97d8cf2403d71fe84e719338456f3ee30d..417bcf5607b134225037538a2161bb350f65369e 100644 (file)
@@ -1931,12 +1931,7 @@ class EngineEventsTest(fixtures.TestBase):
         t = Table(
             "t",
             self.metadata,
-            Column(
-                "x",
-                testing.db.dialect.sequence_default_column_type,
-                Sequence("t_id_seq"),
-                primary_key=True,
-            ),
+            Column("x", Integer, Sequence("t_id_seq"), primary_key=True,),
             implicit_returning=False,
         )
         self.metadata.create_all(engine)
index aa1c0d48d722cf78f2a131ecccf2d80ffd9aa9cf..e23c58cec42ea7a1c2079cad3857384d57e0c03c 100644 (file)
@@ -998,7 +998,7 @@ class PKIncrementTest(fixtures.TablesTest):
             metadata,
             Column(
                 "id",
-                testing.db.dialect.sequence_default_column_type,
+                Integer,
                 Sequence("ai_id_seq", optional=True),
                 primary_key=True,
             ),
@@ -1229,7 +1229,7 @@ class SpecialTypePKTest(fixtures.TestBase):
     @classmethod
     def setup_class(cls):
         class MyInteger(TypeDecorator):
-            impl = testing.db.dialect.sequence_default_column_type
+            impl = Integer
 
             def process_bind_param(self, value, dialect):
                 if value is None:
index e0a0dd8a530d3dd554e86daa5f6bb9aacb6aee4f..ddb43871e20532cfb9fd77a564acae63da59d250 100644 (file)
@@ -993,7 +993,7 @@ class ExecuteTest(fixtures.TestBase):
             meta,
             Column(
                 "id",
-                testing.db.dialect.sequence_default_column_type,
+                Integer,
                 Sequence("t1idseq", optional=True),
                 primary_key=True,
             ),
@@ -1004,7 +1004,7 @@ class ExecuteTest(fixtures.TestBase):
             meta,
             Column(
                 "id",
-                testing.db.dialect.sequence_default_column_type,
+                Integer,
                 Sequence("t2idseq", optional=True),
                 primary_key=True,
             ),
index e27decd6f1badb20b2c8129c625adc415caabf96..85471e7eb0230ce9b2c197c55752be3d8d1e3cd4 100644 (file)
@@ -352,12 +352,7 @@ class TableInsertTest(fixtures.TablesTest):
         Table(
             "foo",
             metadata,
-            Column(
-                "id",
-                testing.db.dialect.sequence_default_column_type,
-                Sequence("t_id_seq"),
-                primary_key=True,
-            ),
+            Column("id", Integer, Sequence("t_id_seq"), primary_key=True,),
             Column("data", String(50)),
             Column("x", Integer),
         )