Files
Federico Caselli 974b1bd0fc Revert automatic set of sequence start to 1
The :class:`.Sequence` construct restores itself to the DDL behavior it
had prior to the 1.4 series, where creating a :class:`.Sequence` with
no additional arguments will emit a simple ``CREATE SEQUENCE`` instruction
**without** any additional parameters for "start value".   For most backends,
this is how things worked previously in any case; **however**, for
MS SQL Server, the default value on this database is
``-2**63``; to prevent this generally impractical default
from taking effect on SQL Server, the :paramref:`.Sequence.start` parameter
should be provided.   As usage of :class:`.Sequence` is unusual
for SQL Server which for many years has standardized on ``IDENTITY``,
it is hoped that this change has minimal impact.

Fixes: #7211
Change-Id: I1207ea10c8cb1528a1519a0fb3581d9621c27b31
2022-10-17 15:36:25 -04:00

89 lines
2.6 KiB
Python

from decimal import Decimal
from sqlalchemy import BIGINT
from sqlalchemy import Column
from sqlalchemy import DECIMAL
from sqlalchemy import Integer
from sqlalchemy import select
from sqlalchemy import Sequence
from sqlalchemy import String
from sqlalchemy import Table
from sqlalchemy.testing import config
from sqlalchemy.testing import eq_
from sqlalchemy.testing import fixtures
from sqlalchemy.testing.provision import normalize_sequence
class SequenceTest(fixtures.TablesTest):
__only_on__ = "mssql"
__backend__ = True
@classmethod
def define_tables(cls, metadata):
Table(
"int_seq_t",
metadata,
Column(
"id", Integer, default=Sequence("int_seq", data_type=Integer())
),
Column(
"id_provision",
Integer,
default=normalize_sequence(
config, Sequence("id_provision", data_type=Integer())
),
),
Column(
"id_start",
Integer,
default=Sequence("id_start", data_type=Integer(), start=42),
),
Column("txt", String(50)),
)
Table(
"bigint_seq_t",
metadata,
Column(
"id",
BIGINT,
default=Sequence("bigint_seq", start=3000000000),
),
Column("txt", String(50)),
)
Table(
"decimal_seq_t",
metadata,
Column(
"id",
DECIMAL(10, 0),
default=Sequence(
"decimal_seq",
data_type=DECIMAL(10, 0),
start=3000000000,
),
),
Column("txt", String(50)),
)
def test_int_seq(self, connection):
t = self.tables.int_seq_t
connection.execute(t.insert().values({"txt": "int_seq test"}))
result = connection.execute(select(t)).first()
eq_(result.id, -(2**31))
eq_(result.id_provision, 1)
eq_(result.id_start, 42)
def test_bigint_seq(self, connection):
t = self.tables.bigint_seq_t
connection.execute(t.insert().values({"txt": "bigint_seq test"}))
result = connection.scalar(select(t.c.id))
eq_(result, 3000000000)
def test_decimal_seq(self, connection):
t = self.tables.decimal_seq_t
connection.execute(t.insert().values({"txt": "decimal_seq test"}))
result = connection.scalar(select(t.c.id))
eq_(result, Decimal("3000000000"))