mirror of
https://github.com/sqlalchemy/sqlalchemy.git
synced 2026-05-06 17:01:07 -04:00
974b1bd0fc
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
89 lines
2.6 KiB
Python
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"))
|