Skip to content

Commit 91a5116

Browse files
sk-zzzeek
authored andcommitted
fix(typings): improve typing for server_default
Fixed typing issue where the :paramref:`.AlterColumnOp.server_default` and :paramref:`.AlterColumnOp.existing_server_default` parameters failed to accommodate common SQLAlchemy SQL constructs such as ``null()`` and ``text()``. Pull request courtesy Sebastian Kreft. this sets up a standard type for the server default argument using an alias, and adds modifications to write_pyi for extremely basic ability to render type aliases (with limitations). Co-authored-by: Mike Bayer <mike_mp@zzzcomputing.com> Fixes: #1669 Closes: #1670 Pull-request: #1670 Pull-request-sha: e646464 Change-Id: Id25bf7fd706f91aa637adf9b67f0529f1d7d1080
1 parent b36174e commit 91a5116

12 files changed

Lines changed: 97 additions & 48 deletions

File tree

alembic/ddl/base.py

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
from __future__ import annotations
55

66
import functools
7+
from typing import Any
78
from typing import Optional
89
from typing import TYPE_CHECKING
910
from typing import Union
@@ -14,7 +15,10 @@
1415
from sqlalchemy.ext.compiler import compiles
1516
from sqlalchemy.schema import Column
1617
from sqlalchemy.schema import DDLElement
18+
from sqlalchemy.sql.elements import ColumnElement
1719
from sqlalchemy.sql.elements import quoted_name
20+
from sqlalchemy.sql.elements import TextClause
21+
from sqlalchemy.sql.schema import FetchedValue
1822

1923
from ..util.sqla_compat import _columns_for_constraint # noqa
2024
from ..util.sqla_compat import _find_columns # noqa
@@ -23,20 +27,16 @@
2327
from ..util.sqla_compat import _table_for_constraint # noqa
2428

2529
if TYPE_CHECKING:
26-
from typing import Any
2730

2831
from sqlalchemy import Computed
2932
from sqlalchemy import Identity
3033
from sqlalchemy.sql.compiler import Compiled
3134
from sqlalchemy.sql.compiler import DDLCompiler
32-
from sqlalchemy.sql.elements import TextClause
33-
from sqlalchemy.sql.functions import Function
34-
from sqlalchemy.sql.schema import FetchedValue
3535
from sqlalchemy.sql.type_api import TypeEngine
3636

3737
from .impl import DefaultImpl
3838

39-
_ServerDefault = Union["TextClause", "FetchedValue", "Function[Any]", str]
39+
_ServerDefaultType = Union[FetchedValue, str, TextClause, ColumnElement[Any]]
4040

4141

4242
class AlterTable(DDLElement):
@@ -75,7 +75,7 @@ def __init__(
7575
schema: Optional[str] = None,
7676
existing_type: Optional[TypeEngine] = None,
7777
existing_nullable: Optional[bool] = None,
78-
existing_server_default: Optional[_ServerDefault] = None,
78+
existing_server_default: Optional[_ServerDefaultType] = None,
7979
existing_comment: Optional[str] = None,
8080
) -> None:
8181
super().__init__(name, schema=schema)
@@ -119,7 +119,7 @@ def __init__(
119119
self,
120120
name: str,
121121
column_name: str,
122-
default: Optional[_ServerDefault],
122+
default: Optional[_ServerDefaultType],
123123
**kw,
124124
) -> None:
125125
super().__init__(name, column_name, **kw)
@@ -308,7 +308,7 @@ def format_column_name(
308308

309309
def format_server_default(
310310
compiler: DDLCompiler,
311-
default: Optional[_ServerDefault],
311+
default: Optional[_ServerDefaultType],
312312
) -> str:
313313
# this can be updated to use compiler.render_default_string
314314
# for SQLAlchemy 2.0 and above; not in 1.4

alembic/ddl/impl.py

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,7 @@
5858
from sqlalchemy.sql.selectable import TableClause
5959
from sqlalchemy.sql.type_api import TypeEngine
6060

61-
from .base import _ServerDefault
61+
from .base import _ServerDefaultType
6262
from ..autogenerate.api import AutogenContext
6363
from ..operations.batch import ApplyBatchImpl
6464
from ..operations.batch import BatchOperationsImpl
@@ -269,7 +269,7 @@ def alter_column(
269269
*,
270270
nullable: Optional[bool] = None,
271271
server_default: Optional[
272-
Union[_ServerDefault, Literal[False]]
272+
Union[_ServerDefaultType, Literal[False]]
273273
] = False,
274274
name: Optional[str] = None,
275275
type_: Optional[TypeEngine] = None,
@@ -278,7 +278,9 @@ def alter_column(
278278
comment: Optional[Union[str, Literal[False]]] = False,
279279
existing_comment: Optional[str] = None,
280280
existing_type: Optional[TypeEngine] = None,
281-
existing_server_default: Optional[_ServerDefault] = None,
281+
existing_server_default: Optional[
282+
Union[_ServerDefaultType, Literal[False]]
283+
] = None,
282284
existing_nullable: Optional[bool] = None,
283285
existing_autoincrement: Optional[bool] = None,
284286
**kw: Any,

alembic/ddl/mssql.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@
4646
from sqlalchemy.sql.selectable import TableClause
4747
from sqlalchemy.sql.type_api import TypeEngine
4848

49-
from .base import _ServerDefault
49+
from .base import _ServerDefaultType
5050
from .impl import _ReflectedConstraint
5151

5252

@@ -92,14 +92,14 @@ def alter_column(
9292
*,
9393
nullable: Optional[bool] = None,
9494
server_default: Optional[
95-
Union[_ServerDefault, Literal[False]]
95+
Union[_ServerDefaultType, Literal[False]]
9696
] = False,
9797
name: Optional[str] = None,
9898
type_: Optional[TypeEngine] = None,
9999
schema: Optional[str] = None,
100100
existing_type: Optional[TypeEngine] = None,
101101
existing_server_default: Union[
102-
_ServerDefault, Literal[False], None
102+
_ServerDefaultType, Literal[False], None
103103
] = None,
104104
existing_nullable: Optional[bool] = None,
105105
**kw: Any,

alembic/ddl/mysql.py

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@
3838
from sqlalchemy.sql.schema import Constraint
3939
from sqlalchemy.sql.type_api import TypeEngine
4040

41-
from .base import _ServerDefault
41+
from .base import _ServerDefaultType
4242

4343

4444
class MySQLImpl(DefaultImpl):
@@ -83,13 +83,15 @@ def alter_column(
8383
*,
8484
nullable: Optional[bool] = None,
8585
server_default: Optional[
86-
Union[_ServerDefault, Literal[False]]
86+
Union[_ServerDefaultType, Literal[False]]
8787
] = False,
8888
name: Optional[str] = None,
8989
type_: Optional[TypeEngine] = None,
9090
schema: Optional[str] = None,
9191
existing_type: Optional[TypeEngine] = None,
92-
existing_server_default: Optional[_ServerDefault] = None,
92+
existing_server_default: Optional[
93+
Union[_ServerDefaultType, Literal[False]]
94+
] = None,
9395
existing_nullable: Optional[bool] = None,
9496
autoincrement: Optional[bool] = None,
9597
existing_autoincrement: Optional[bool] = None,
@@ -207,7 +209,7 @@ def drop_constraint(
207209
def _is_mysql_allowed_functional_default(
208210
self,
209211
type_: Optional[TypeEngine],
210-
server_default: Optional[Union[_ServerDefault, Literal[False]]],
212+
server_default: Optional[Union[_ServerDefaultType, Literal[False]]],
211213
) -> bool:
212214
return (
213215
type_ is not None
@@ -358,7 +360,7 @@ def __init__(
358360
self,
359361
name: str,
360362
column_name: str,
361-
default: Optional[_ServerDefault],
363+
default: Optional[_ServerDefaultType],
362364
schema: Optional[str] = None,
363365
) -> None:
364366
super(AlterColumn, self).__init__(name, schema=schema)
@@ -375,7 +377,7 @@ def __init__(
375377
newname: Optional[str] = None,
376378
type_: Optional[TypeEngine] = None,
377379
nullable: Optional[bool] = None,
378-
default: Optional[Union[_ServerDefault, Literal[False]]] = False,
380+
default: Optional[Union[_ServerDefaultType, Literal[False]]] = False,
379381
autoincrement: Optional[bool] = None,
380382
comment: Optional[Union[str, Literal[False]]] = False,
381383
) -> None:
@@ -464,7 +466,7 @@ def _mysql_change_column(
464466
def _mysql_colspec(
465467
compiler: MySQLDDLCompiler,
466468
nullable: Optional[bool],
467-
server_default: Optional[Union[_ServerDefault, Literal[False]]],
469+
server_default: Optional[Union[_ServerDefaultType, Literal[False]]],
468470
type_: TypeEngine,
469471
autoincrement: Optional[bool],
470472
comment: Optional[Union[str, Literal[False]]],

alembic/ddl/postgresql.py

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,7 @@
7070
from sqlalchemy.sql.schema import Table
7171
from sqlalchemy.sql.type_api import TypeEngine
7272

73-
from .base import _ServerDefault
73+
from .base import _ServerDefaultType
7474
from .impl import _ReflectedConstraint
7575
from ..autogenerate.api import AutogenContext
7676
from ..autogenerate.render import _f_name
@@ -164,14 +164,16 @@ def alter_column(
164164
*,
165165
nullable: Optional[bool] = None,
166166
server_default: Optional[
167-
Union[_ServerDefault, Literal[False]]
167+
Union[_ServerDefaultType, Literal[False]]
168168
] = False,
169169
name: Optional[str] = None,
170170
type_: Optional[TypeEngine] = None,
171171
schema: Optional[str] = None,
172172
autoincrement: Optional[bool] = None,
173173
existing_type: Optional[TypeEngine] = None,
174-
existing_server_default: Optional[_ServerDefault] = None,
174+
existing_server_default: Optional[
175+
Union[_ServerDefaultType, Literal[False]]
176+
] = None,
175177
existing_nullable: Optional[bool] = None,
176178
existing_autoincrement: Optional[bool] = None,
177179
**kw: Any,

alembic/op.pyi

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -28,13 +28,12 @@ if TYPE_CHECKING:
2828
from sqlalchemy.sql.elements import TextClause
2929
from sqlalchemy.sql.expression import TableClause
3030
from sqlalchemy.sql.schema import Column
31-
from sqlalchemy.sql.schema import Computed
32-
from sqlalchemy.sql.schema import Identity
3331
from sqlalchemy.sql.schema import SchemaItem
3432
from sqlalchemy.sql.schema import Table
3533
from sqlalchemy.sql.type_api import TypeEngine
3634
from sqlalchemy.util import immutabledict
3735

36+
from .ddl.base import _ServerDefaultType
3837
from .operations.base import BatchOperations
3938
from .operations.ops import AddColumnOp
4039
from .operations.ops import AddConstraintOp
@@ -154,14 +153,12 @@ def alter_column(
154153
*,
155154
nullable: Optional[bool] = None,
156155
comment: Union[str, Literal[False], None] = False,
157-
server_default: Union[
158-
str, bool, Identity, Computed, TextClause, None
159-
] = False,
156+
server_default: Union[_ServerDefaultType, None, Literal[False]] = False,
160157
new_column_name: Optional[str] = None,
161158
type_: Union[TypeEngine[Any], Type[TypeEngine[Any]], None] = None,
162159
existing_type: Union[TypeEngine[Any], Type[TypeEngine[Any]], None] = None,
163160
existing_server_default: Union[
164-
str, bool, Identity, Computed, TextClause, None
161+
_ServerDefaultType, None, Literal[False]
165162
] = False,
166163
existing_nullable: Optional[bool] = None,
167164
existing_comment: Optional[str] = None,

alembic/operations/base.py

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -27,13 +27,13 @@
2727
from . import batch
2828
from . import schemaobj
2929
from .. import util
30+
from ..ddl.base import _ServerDefaultType
3031
from ..util import sqla_compat
3132
from ..util.compat import formatannotation_fwdref
3233
from ..util.compat import inspect_formatargspec
3334
from ..util.compat import inspect_getfullargspec
3435
from ..util.sqla_compat import _literal_bindparam
3536

36-
3737
if TYPE_CHECKING:
3838
from typing import Literal
3939

@@ -44,8 +44,6 @@
4444
from sqlalchemy.sql.expression import TableClause
4545
from sqlalchemy.sql.expression import TextClause
4646
from sqlalchemy.sql.schema import Column
47-
from sqlalchemy.sql.schema import Computed
48-
from sqlalchemy.sql.schema import Identity
4947
from sqlalchemy.sql.schema import SchemaItem
5048
from sqlalchemy.types import TypeEngine
5149

@@ -724,15 +722,15 @@ def alter_column(
724722
nullable: Optional[bool] = None,
725723
comment: Union[str, Literal[False], None] = False,
726724
server_default: Union[
727-
str, bool, Identity, Computed, TextClause, None
725+
_ServerDefaultType, None, Literal[False]
728726
] = False,
729727
new_column_name: Optional[str] = None,
730728
type_: Union[TypeEngine[Any], Type[TypeEngine[Any]], None] = None,
731729
existing_type: Union[
732730
TypeEngine[Any], Type[TypeEngine[Any]], None
733731
] = None,
734732
existing_server_default: Union[
735-
str, bool, Identity, Computed, TextClause, None
733+
_ServerDefaultType, None, Literal[False]
736734
] = False,
737735
existing_nullable: Optional[bool] = None,
738736
existing_comment: Optional[str] = None,
@@ -1691,14 +1689,16 @@ def alter_column(
16911689
*,
16921690
nullable: Optional[bool] = None,
16931691
comment: Union[str, Literal[False], None] = False,
1694-
server_default: Any = False,
1692+
server_default: Union[
1693+
_ServerDefaultType, None, Literal[False]
1694+
] = False,
16951695
new_column_name: Optional[str] = None,
16961696
type_: Union[TypeEngine[Any], Type[TypeEngine[Any]], None] = None,
16971697
existing_type: Union[
16981698
TypeEngine[Any], Type[TypeEngine[Any]], None
16991699
] = None,
17001700
existing_server_default: Union[
1701-
str, bool, Identity, Computed, None
1701+
_ServerDefaultType, None, Literal[False]
17021702
] = False,
17031703
existing_nullable: Optional[bool] = None,
17041704
existing_comment: Optional[str] = None,

alembic/operations/batch.py

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -44,10 +44,10 @@
4444
from sqlalchemy.engine import Dialect
4545
from sqlalchemy.sql.elements import ColumnClause
4646
from sqlalchemy.sql.elements import quoted_name
47-
from sqlalchemy.sql.functions import Function
4847
from sqlalchemy.sql.schema import Constraint
4948
from sqlalchemy.sql.type_api import TypeEngine
5049

50+
from ..ddl.base import _ServerDefaultType
5151
from ..ddl.impl import DefaultImpl
5252

5353

@@ -485,7 +485,9 @@ def alter_column(
485485
table_name: str,
486486
column_name: str,
487487
nullable: Optional[bool] = None,
488-
server_default: Optional[Union[Function[Any], str, bool]] = False,
488+
server_default: Union[
489+
_ServerDefaultType, None, Literal[False]
490+
] = False,
489491
name: Optional[str] = None,
490492
type_: Optional[TypeEngine] = None,
491493
autoincrement: Optional[Union[bool, Literal["auto"]]] = None,

alembic/operations/ops.py

Lines changed: 11 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -39,10 +39,8 @@
3939
from sqlalchemy.sql.elements import TextClause
4040
from sqlalchemy.sql.schema import CheckConstraint
4141
from sqlalchemy.sql.schema import Column
42-
from sqlalchemy.sql.schema import Computed
4342
from sqlalchemy.sql.schema import Constraint
4443
from sqlalchemy.sql.schema import ForeignKeyConstraint
45-
from sqlalchemy.sql.schema import Identity
4644
from sqlalchemy.sql.schema import Index
4745
from sqlalchemy.sql.schema import MetaData
4846
from sqlalchemy.sql.schema import PrimaryKeyConstraint
@@ -53,6 +51,7 @@
5351
from sqlalchemy.sql.type_api import TypeEngine
5452

5553
from ..autogenerate.rewriter import Rewriter
54+
from ..ddl.base import _ServerDefaultType
5655
from ..runtime.migration import MigrationContext
5756
from ..script.revision import _RevIdType
5857

@@ -1696,7 +1695,9 @@ def __init__(
16961695
*,
16971696
schema: Optional[str] = None,
16981697
existing_type: Optional[Any] = None,
1699-
existing_server_default: Any = False,
1698+
existing_server_default: Union[
1699+
_ServerDefaultType, None, Literal[False]
1700+
] = False,
17001701
existing_nullable: Optional[bool] = None,
17011702
existing_comment: Optional[str] = None,
17021703
modify_nullable: Optional[bool] = None,
@@ -1856,15 +1857,15 @@ def alter_column(
18561857
nullable: Optional[bool] = None,
18571858
comment: Optional[Union[str, Literal[False]]] = False,
18581859
server_default: Union[
1859-
str, bool, Identity, Computed, TextClause, None
1860+
_ServerDefaultType, None, Literal[False]
18601861
] = False,
18611862
new_column_name: Optional[str] = None,
18621863
type_: Optional[Union[TypeEngine[Any], Type[TypeEngine[Any]]]] = None,
18631864
existing_type: Optional[
18641865
Union[TypeEngine[Any], Type[TypeEngine[Any]]]
18651866
] = None,
18661867
existing_server_default: Union[
1867-
str, bool, Identity, Computed, TextClause, None
1868+
_ServerDefaultType, None, Literal[False]
18681869
] = False,
18691870
existing_nullable: Optional[bool] = None,
18701871
existing_comment: Optional[str] = None,
@@ -1980,14 +1981,16 @@ def batch_alter_column(
19801981
*,
19811982
nullable: Optional[bool] = None,
19821983
comment: Optional[Union[str, Literal[False]]] = False,
1983-
server_default: Any = False,
1984+
server_default: Union[
1985+
_ServerDefaultType, None, Literal[False]
1986+
] = False,
19841987
new_column_name: Optional[str] = None,
19851988
type_: Optional[Union[TypeEngine[Any], Type[TypeEngine[Any]]]] = None,
19861989
existing_type: Optional[
19871990
Union[TypeEngine[Any], Type[TypeEngine[Any]]]
19881991
] = None,
1989-
existing_server_default: Optional[
1990-
Union[str, bool, Identity, Computed]
1992+
existing_server_default: Union[
1993+
_ServerDefaultType, None, Literal[False]
19911994
] = False,
19921995
existing_nullable: Optional[bool] = None,
19931996
existing_comment: Optional[str] = None,

0 commit comments

Comments
 (0)