alembic 1.14.1__py3-none-any.whl → 1.15.0__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- alembic/__init__.py +1 -1
- alembic/autogenerate/compare.py +11 -23
- alembic/autogenerate/render.py +25 -19
- alembic/command.py +3 -1
- alembic/context.pyi +5 -2
- alembic/ddl/base.py +2 -2
- alembic/ddl/impl.py +8 -9
- alembic/ddl/mysql.py +1 -2
- alembic/ddl/postgresql.py +5 -5
- alembic/ddl/sqlite.py +2 -1
- alembic/op.pyi +1 -2
- alembic/operations/base.py +1 -2
- alembic/operations/batch.py +5 -4
- alembic/operations/ops.py +1 -2
- alembic/operations/toimpl.py +0 -13
- alembic/runtime/environment.py +2 -2
- alembic/runtime/migration.py +4 -4
- alembic/testing/assertions.py +2 -3
- alembic/testing/env.py +62 -78
- alembic/testing/fixtures.py +3 -15
- alembic/testing/requirements.py +1 -35
- alembic/testing/suite/test_autogen_computed.py +2 -62
- alembic/testing/warnings.py +0 -9
- alembic/util/__init__.py +0 -7
- alembic/util/exc.py +20 -1
- alembic/util/messaging.py +1 -4
- alembic/util/sqla_compat.py +72 -238
- {alembic-1.14.1.dist-info → alembic-1.15.0.dist-info}/METADATA +7 -11
- {alembic-1.14.1.dist-info → alembic-1.15.0.dist-info}/RECORD +33 -42
- {alembic-1.14.1.dist-info → alembic-1.15.0.dist-info}/WHEEL +1 -1
- alembic/templates/async/README +0 -1
- alembic/templates/async/alembic.ini.mako +0 -117
- alembic/templates/async/script.py.mako +0 -26
- alembic/templates/generic/README +0 -1
- alembic/templates/generic/alembic.ini.mako +0 -119
- alembic/templates/generic/script.py.mako +0 -26
- alembic/templates/multidb/README +0 -12
- alembic/templates/multidb/alembic.ini.mako +0 -124
- alembic/templates/multidb/script.py.mako +0 -47
- {alembic-1.14.1.dist-info → alembic-1.15.0.dist-info}/LICENSE +0 -0
- {alembic-1.14.1.dist-info → alembic-1.15.0.dist-info}/entry_points.txt +0 -0
- {alembic-1.14.1.dist-info → alembic-1.15.0.dist-info}/top_level.txt +0 -0
alembic/util/sqla_compat.py
CHANGED
@@ -10,7 +10,6 @@ from typing import Callable
|
|
10
10
|
from typing import Dict
|
11
11
|
from typing import Iterable
|
12
12
|
from typing import Iterator
|
13
|
-
from typing import Mapping
|
14
13
|
from typing import Optional
|
15
14
|
from typing import Protocol
|
16
15
|
from typing import Set
|
@@ -20,11 +19,9 @@ from typing import TypeVar
|
|
20
19
|
from typing import Union
|
21
20
|
|
22
21
|
from sqlalchemy import __version__
|
23
|
-
from sqlalchemy import inspect
|
24
22
|
from sqlalchemy import schema
|
25
23
|
from sqlalchemy import sql
|
26
24
|
from sqlalchemy import types as sqltypes
|
27
|
-
from sqlalchemy.engine import url
|
28
25
|
from sqlalchemy.schema import CheckConstraint
|
29
26
|
from sqlalchemy.schema import Column
|
30
27
|
from sqlalchemy.schema import ForeignKeyConstraint
|
@@ -32,28 +29,27 @@ from sqlalchemy.sql import visitors
|
|
32
29
|
from sqlalchemy.sql.base import DialectKWArgs
|
33
30
|
from sqlalchemy.sql.elements import BindParameter
|
34
31
|
from sqlalchemy.sql.elements import ColumnClause
|
35
|
-
from sqlalchemy.sql.elements import quoted_name
|
36
32
|
from sqlalchemy.sql.elements import TextClause
|
37
33
|
from sqlalchemy.sql.elements import UnaryExpression
|
38
34
|
from sqlalchemy.sql.visitors import traverse
|
39
35
|
from typing_extensions import TypeGuard
|
40
36
|
|
37
|
+
if True:
|
38
|
+
from sqlalchemy.sql.naming import _NONE_NAME as _NONE_NAME # type: ignore[attr-defined] # noqa: E501
|
39
|
+
|
41
40
|
if TYPE_CHECKING:
|
42
41
|
from sqlalchemy import ClauseElement
|
42
|
+
from sqlalchemy import Identity
|
43
43
|
from sqlalchemy import Index
|
44
44
|
from sqlalchemy import Table
|
45
45
|
from sqlalchemy.engine import Connection
|
46
46
|
from sqlalchemy.engine import Dialect
|
47
47
|
from sqlalchemy.engine import Transaction
|
48
|
-
from sqlalchemy.engine.reflection import Inspector
|
49
48
|
from sqlalchemy.sql.base import ColumnCollection
|
50
49
|
from sqlalchemy.sql.compiler import SQLCompiler
|
51
|
-
from sqlalchemy.sql.dml import Insert
|
52
50
|
from sqlalchemy.sql.elements import ColumnElement
|
53
51
|
from sqlalchemy.sql.schema import Constraint
|
54
52
|
from sqlalchemy.sql.schema import SchemaItem
|
55
|
-
from sqlalchemy.sql.selectable import Select
|
56
|
-
from sqlalchemy.sql.selectable import TableClause
|
57
53
|
|
58
54
|
_CE = TypeVar("_CE", bound=Union["ColumnElement[Any]", "SchemaItem"])
|
59
55
|
|
@@ -72,24 +68,12 @@ def _safe_int(value: str) -> Union[int, str]:
|
|
72
68
|
_vers = tuple(
|
73
69
|
[_safe_int(x) for x in re.findall(r"(\d+|[abc]\d)", __version__)]
|
74
70
|
)
|
75
|
-
sqla_13 = _vers >= (1, 3)
|
76
|
-
sqla_14 = _vers >= (1, 4)
|
77
71
|
# https://docs.sqlalchemy.org/en/latest/changelog/changelog_14.html#change-0c6e0cc67dfe6fac5164720e57ef307d
|
78
72
|
sqla_14_18 = _vers >= (1, 4, 18)
|
79
73
|
sqla_14_26 = _vers >= (1, 4, 26)
|
80
74
|
sqla_2 = _vers >= (2,)
|
81
75
|
sqlalchemy_version = __version__
|
82
76
|
|
83
|
-
try:
|
84
|
-
from sqlalchemy.sql.naming import _NONE_NAME as _NONE_NAME # type: ignore[attr-defined] # noqa: E501
|
85
|
-
except ImportError:
|
86
|
-
from sqlalchemy.sql.elements import _NONE_NAME as _NONE_NAME # type: ignore # noqa: E501
|
87
|
-
|
88
|
-
|
89
|
-
class _Unsupported:
|
90
|
-
"Placeholder for unsupported SQLAlchemy classes"
|
91
|
-
|
92
|
-
|
93
77
|
if TYPE_CHECKING:
|
94
78
|
|
95
79
|
def compiles(
|
@@ -99,72 +83,50 @@ if TYPE_CHECKING:
|
|
99
83
|
else:
|
100
84
|
from sqlalchemy.ext.compiler import compiles
|
101
85
|
|
102
|
-
try:
|
103
|
-
from sqlalchemy import Computed as Computed
|
104
|
-
except ImportError:
|
105
|
-
if not TYPE_CHECKING:
|
106
86
|
|
107
|
-
|
108
|
-
pass
|
87
|
+
identity_has_dialect_kwargs = issubclass(schema.Identity, DialectKWArgs)
|
109
88
|
|
110
|
-
has_computed = False
|
111
|
-
has_computed_reflection = False
|
112
|
-
else:
|
113
|
-
has_computed = True
|
114
|
-
has_computed_reflection = _vers >= (1, 3, 16)
|
115
|
-
|
116
|
-
try:
|
117
|
-
from sqlalchemy import Identity as Identity
|
118
|
-
except ImportError:
|
119
|
-
if not TYPE_CHECKING:
|
120
89
|
|
121
|
-
|
122
|
-
|
90
|
+
def _get_identity_options_dict(
|
91
|
+
identity: Union[Identity, schema.Sequence, None],
|
92
|
+
dialect_kwargs: bool = False,
|
93
|
+
) -> Dict[str, Any]:
|
94
|
+
if identity is None:
|
95
|
+
return {}
|
96
|
+
elif identity_has_dialect_kwargs:
|
97
|
+
assert hasattr(identity, "_as_dict")
|
98
|
+
as_dict = identity._as_dict()
|
99
|
+
if dialect_kwargs:
|
100
|
+
assert isinstance(identity, DialectKWArgs)
|
101
|
+
as_dict.update(identity.dialect_kwargs)
|
102
|
+
else:
|
103
|
+
as_dict = {}
|
104
|
+
if isinstance(identity, schema.Identity):
|
105
|
+
# always=None means something different than always=False
|
106
|
+
as_dict["always"] = identity.always
|
107
|
+
if identity.on_null is not None:
|
108
|
+
as_dict["on_null"] = identity.on_null
|
109
|
+
# attributes common to Identity and Sequence
|
110
|
+
attrs = (
|
111
|
+
"start",
|
112
|
+
"increment",
|
113
|
+
"minvalue",
|
114
|
+
"maxvalue",
|
115
|
+
"nominvalue",
|
116
|
+
"nomaxvalue",
|
117
|
+
"cycle",
|
118
|
+
"cache",
|
119
|
+
"order",
|
120
|
+
)
|
121
|
+
as_dict.update(
|
122
|
+
{
|
123
|
+
key: getattr(identity, key, None)
|
124
|
+
for key in attrs
|
125
|
+
if getattr(identity, key, None) is not None
|
126
|
+
}
|
127
|
+
)
|
128
|
+
return as_dict
|
123
129
|
|
124
|
-
has_identity = False
|
125
|
-
else:
|
126
|
-
identity_has_dialect_kwargs = issubclass(Identity, DialectKWArgs)
|
127
|
-
|
128
|
-
def _get_identity_options_dict(
|
129
|
-
identity: Union[Identity, schema.Sequence, None],
|
130
|
-
dialect_kwargs: bool = False,
|
131
|
-
) -> Dict[str, Any]:
|
132
|
-
if identity is None:
|
133
|
-
return {}
|
134
|
-
elif identity_has_dialect_kwargs:
|
135
|
-
as_dict = identity._as_dict() # type: ignore
|
136
|
-
if dialect_kwargs:
|
137
|
-
assert isinstance(identity, DialectKWArgs)
|
138
|
-
as_dict.update(identity.dialect_kwargs)
|
139
|
-
else:
|
140
|
-
as_dict = {}
|
141
|
-
if isinstance(identity, Identity):
|
142
|
-
# always=None means something different than always=False
|
143
|
-
as_dict["always"] = identity.always
|
144
|
-
if identity.on_null is not None:
|
145
|
-
as_dict["on_null"] = identity.on_null
|
146
|
-
# attributes common to Identity and Sequence
|
147
|
-
attrs = (
|
148
|
-
"start",
|
149
|
-
"increment",
|
150
|
-
"minvalue",
|
151
|
-
"maxvalue",
|
152
|
-
"nominvalue",
|
153
|
-
"nomaxvalue",
|
154
|
-
"cycle",
|
155
|
-
"cache",
|
156
|
-
"order",
|
157
|
-
)
|
158
|
-
as_dict.update(
|
159
|
-
{
|
160
|
-
key: getattr(identity, key, None)
|
161
|
-
for key in attrs
|
162
|
-
if getattr(identity, key, None) is not None
|
163
|
-
}
|
164
|
-
)
|
165
|
-
return as_dict
|
166
|
-
|
167
|
-
has_identity = True
|
168
130
|
|
169
131
|
if sqla_2:
|
170
132
|
from sqlalchemy.sql.base import _NoneName
|
@@ -173,7 +135,6 @@ else:
|
|
173
135
|
|
174
136
|
|
175
137
|
_ConstraintName = Union[None, str, _NoneName]
|
176
|
-
|
177
138
|
_ConstraintNameDefined = Union[str, _NoneName]
|
178
139
|
|
179
140
|
|
@@ -183,15 +144,11 @@ def constraint_name_defined(
|
|
183
144
|
return name is _NONE_NAME or isinstance(name, (str, _NoneName))
|
184
145
|
|
185
146
|
|
186
|
-
def constraint_name_string(
|
187
|
-
name: _ConstraintName,
|
188
|
-
) -> TypeGuard[str]:
|
147
|
+
def constraint_name_string(name: _ConstraintName) -> TypeGuard[str]:
|
189
148
|
return isinstance(name, str)
|
190
149
|
|
191
150
|
|
192
|
-
def constraint_name_or_none(
|
193
|
-
name: _ConstraintName,
|
194
|
-
) -> Optional[str]:
|
151
|
+
def constraint_name_or_none(name: _ConstraintName) -> Optional[str]:
|
195
152
|
return name if constraint_name_string(name) else None
|
196
153
|
|
197
154
|
|
@@ -221,17 +178,10 @@ def _ensure_scope_for_ddl(
|
|
221
178
|
yield
|
222
179
|
|
223
180
|
|
224
|
-
def url_render_as_string(url, hide_password=True):
|
225
|
-
if sqla_14:
|
226
|
-
return url.render_as_string(hide_password=hide_password)
|
227
|
-
else:
|
228
|
-
return url.__to_string__(hide_password=hide_password)
|
229
|
-
|
230
|
-
|
231
181
|
def _safe_begin_connection_transaction(
|
232
182
|
connection: Connection,
|
233
183
|
) -> Transaction:
|
234
|
-
transaction =
|
184
|
+
transaction = connection.get_transaction()
|
235
185
|
if transaction:
|
236
186
|
return transaction
|
237
187
|
else:
|
@@ -241,7 +191,7 @@ def _safe_begin_connection_transaction(
|
|
241
191
|
def _safe_commit_connection_transaction(
|
242
192
|
connection: Connection,
|
243
193
|
) -> None:
|
244
|
-
transaction =
|
194
|
+
transaction = connection.get_transaction()
|
245
195
|
if transaction:
|
246
196
|
transaction.commit()
|
247
197
|
|
@@ -249,7 +199,7 @@ def _safe_commit_connection_transaction(
|
|
249
199
|
def _safe_rollback_connection_transaction(
|
250
200
|
connection: Connection,
|
251
201
|
) -> None:
|
252
|
-
transaction =
|
202
|
+
transaction = connection.get_transaction()
|
253
203
|
if transaction:
|
254
204
|
transaction.rollback()
|
255
205
|
|
@@ -275,65 +225,29 @@ def _copy(schema_item: _CE, **kw) -> _CE:
|
|
275
225
|
return schema_item.copy(**kw) # type: ignore[union-attr]
|
276
226
|
|
277
227
|
|
278
|
-
def _get_connection_transaction(
|
279
|
-
connection: Connection,
|
280
|
-
) -> Optional[Transaction]:
|
281
|
-
if sqla_14:
|
282
|
-
return connection.get_transaction()
|
283
|
-
else:
|
284
|
-
r = connection._root # type: ignore[attr-defined]
|
285
|
-
return r._Connection__transaction
|
286
|
-
|
287
|
-
|
288
|
-
def _create_url(*arg, **kw) -> url.URL:
|
289
|
-
if hasattr(url.URL, "create"):
|
290
|
-
return url.URL.create(*arg, **kw)
|
291
|
-
else:
|
292
|
-
return url.URL(*arg, **kw)
|
293
|
-
|
294
|
-
|
295
228
|
def _connectable_has_table(
|
296
229
|
connectable: Connection, tablename: str, schemaname: Union[str, None]
|
297
230
|
) -> bool:
|
298
|
-
|
299
|
-
return inspect(connectable).has_table(tablename, schemaname)
|
300
|
-
else:
|
301
|
-
return connectable.dialect.has_table(
|
302
|
-
connectable, tablename, schemaname
|
303
|
-
)
|
231
|
+
return connectable.dialect.has_table(connectable, tablename, schemaname)
|
304
232
|
|
305
233
|
|
306
234
|
def _exec_on_inspector(inspector, statement, **params):
|
307
|
-
|
308
|
-
|
309
|
-
return conn.execute(statement, params)
|
310
|
-
else:
|
311
|
-
return inspector.bind.execute(statement, params)
|
235
|
+
with inspector._operation_context() as conn:
|
236
|
+
return conn.execute(statement, params)
|
312
237
|
|
313
238
|
|
314
239
|
def _nullability_might_be_unset(metadata_column):
|
315
|
-
|
316
|
-
return metadata_column.nullable
|
317
|
-
else:
|
318
|
-
from sqlalchemy.sql import schema
|
240
|
+
from sqlalchemy.sql import schema
|
319
241
|
|
320
|
-
|
321
|
-
metadata_column._user_defined_nullable is schema.NULL_UNSPECIFIED
|
322
|
-
)
|
242
|
+
return metadata_column._user_defined_nullable is schema.NULL_UNSPECIFIED
|
323
243
|
|
324
244
|
|
325
245
|
def _server_default_is_computed(*server_default) -> bool:
|
326
|
-
|
327
|
-
return False
|
328
|
-
else:
|
329
|
-
return any(isinstance(sd, Computed) for sd in server_default)
|
246
|
+
return any(isinstance(sd, schema.Computed) for sd in server_default)
|
330
247
|
|
331
248
|
|
332
249
|
def _server_default_is_identity(*server_default) -> bool:
|
333
|
-
|
334
|
-
return False
|
335
|
-
else:
|
336
|
-
return any(isinstance(sd, Identity) for sd in server_default)
|
250
|
+
return any(isinstance(sd, schema.Identity) for sd in server_default)
|
337
251
|
|
338
252
|
|
339
253
|
def _table_for_constraint(constraint: Constraint) -> Table:
|
@@ -354,15 +268,6 @@ def _columns_for_constraint(constraint):
|
|
354
268
|
return list(constraint.columns)
|
355
269
|
|
356
270
|
|
357
|
-
def _reflect_table(inspector: Inspector, table: Table) -> None:
|
358
|
-
if sqla_14:
|
359
|
-
return inspector.reflect_table(table, None)
|
360
|
-
else:
|
361
|
-
return inspector.reflecttable( # type: ignore[attr-defined]
|
362
|
-
table, None
|
363
|
-
)
|
364
|
-
|
365
|
-
|
366
271
|
def _resolve_for_variant(type_, dialect):
|
367
272
|
if _type_has_variants(type_):
|
368
273
|
base_type, mapping = _get_variant_mapping(type_)
|
@@ -371,7 +276,7 @@ def _resolve_for_variant(type_, dialect):
|
|
371
276
|
return type_
|
372
277
|
|
373
278
|
|
374
|
-
if hasattr(sqltypes.TypeEngine, "_variant_mapping"):
|
279
|
+
if hasattr(sqltypes.TypeEngine, "_variant_mapping"): # 2.0
|
375
280
|
|
376
281
|
def _type_has_variants(type_):
|
377
282
|
return bool(type_._variant_mapping)
|
@@ -549,103 +454,32 @@ def _render_literal_bindparam(
|
|
549
454
|
return compiler.render_literal_bindparam(element, **kw)
|
550
455
|
|
551
456
|
|
552
|
-
def _column_kwargs(col: Column) -> Mapping:
|
553
|
-
if sqla_13:
|
554
|
-
return col.kwargs
|
555
|
-
else:
|
556
|
-
return {}
|
557
|
-
|
558
|
-
|
559
457
|
def _get_constraint_final_name(
|
560
458
|
constraint: Union[Index, Constraint], dialect: Optional[Dialect]
|
561
459
|
) -> Optional[str]:
|
562
460
|
if constraint.name is None:
|
563
461
|
return None
|
564
462
|
assert dialect is not None
|
565
|
-
|
566
|
-
|
567
|
-
|
568
|
-
|
569
|
-
|
570
|
-
|
571
|
-
|
572
|
-
|
573
|
-
)
|
574
|
-
else:
|
575
|
-
# prior to SQLAlchemy 1.4, work around quoting logic to get at the
|
576
|
-
# final compiled name without quotes.
|
577
|
-
if hasattr(constraint.name, "quote"):
|
578
|
-
# might be quoted_name, might be truncated_name, keep it the
|
579
|
-
# same
|
580
|
-
quoted_name_cls: type = type(constraint.name)
|
581
|
-
else:
|
582
|
-
quoted_name_cls = quoted_name
|
583
|
-
|
584
|
-
new_name = quoted_name_cls(str(constraint.name), quote=False)
|
585
|
-
constraint = constraint.__class__(name=new_name)
|
586
|
-
|
587
|
-
if isinstance(constraint, schema.Index):
|
588
|
-
# name should not be quoted.
|
589
|
-
d = dialect.ddl_compiler(dialect, None) # type: ignore[arg-type]
|
590
|
-
return d._prepared_index_name(constraint)
|
591
|
-
else:
|
592
|
-
# name should not be quoted.
|
593
|
-
return dialect.identifier_preparer.format_constraint(constraint)
|
463
|
+
# for SQLAlchemy 1.4 we would like to have the option to expand
|
464
|
+
# the use of "deferred" names for constraints as well as to have
|
465
|
+
# some flexibility with "None" name and similar; make use of new
|
466
|
+
# SQLAlchemy API to return what would be the final compiled form of
|
467
|
+
# the name for this dialect.
|
468
|
+
return dialect.identifier_preparer.format_constraint(
|
469
|
+
constraint, _alembic_quote=False
|
470
|
+
)
|
594
471
|
|
595
472
|
|
596
473
|
def _constraint_is_named(
|
597
474
|
constraint: Union[Constraint, Index], dialect: Optional[Dialect]
|
598
475
|
) -> bool:
|
599
|
-
if
|
600
|
-
|
601
|
-
|
602
|
-
|
603
|
-
|
604
|
-
|
605
|
-
|
606
|
-
return name is not None
|
607
|
-
else:
|
608
|
-
return constraint.name is not None
|
609
|
-
|
610
|
-
|
611
|
-
def _is_mariadb(mysql_dialect: Dialect) -> bool:
|
612
|
-
if sqla_14:
|
613
|
-
return mysql_dialect.is_mariadb # type: ignore[attr-defined]
|
614
|
-
else:
|
615
|
-
return bool(
|
616
|
-
mysql_dialect.server_version_info
|
617
|
-
and mysql_dialect._is_mariadb # type: ignore[attr-defined]
|
618
|
-
)
|
619
|
-
|
620
|
-
|
621
|
-
def _mariadb_normalized_version_info(mysql_dialect):
|
622
|
-
return mysql_dialect._mariadb_normalized_version_info
|
623
|
-
|
624
|
-
|
625
|
-
def _insert_inline(table: Union[TableClause, Table]) -> Insert:
|
626
|
-
if sqla_14:
|
627
|
-
return table.insert().inline()
|
628
|
-
else:
|
629
|
-
return table.insert(inline=True) # type: ignore[call-arg]
|
630
|
-
|
631
|
-
|
632
|
-
if sqla_14:
|
633
|
-
from sqlalchemy import create_mock_engine
|
634
|
-
|
635
|
-
# weird mypy workaround
|
636
|
-
from sqlalchemy import select as _sa_select
|
637
|
-
|
638
|
-
_select = _sa_select
|
639
|
-
else:
|
640
|
-
from sqlalchemy import create_engine
|
641
|
-
|
642
|
-
def create_mock_engine(url, executor, **kw): # type: ignore[misc]
|
643
|
-
return create_engine(
|
644
|
-
"postgresql://", strategy="mock", executor=executor
|
645
|
-
)
|
646
|
-
|
647
|
-
def _select(*columns, **kw) -> Select:
|
648
|
-
return sql.select(list(columns), **kw) # type: ignore[call-overload]
|
476
|
+
if constraint.name is None:
|
477
|
+
return False
|
478
|
+
assert dialect is not None
|
479
|
+
name = dialect.identifier_preparer.format_constraint(
|
480
|
+
constraint, _alembic_quote=False
|
481
|
+
)
|
482
|
+
return name is not None
|
649
483
|
|
650
484
|
|
651
485
|
def is_expression_index(index: Index) -> bool:
|
@@ -1,11 +1,10 @@
|
|
1
1
|
Metadata-Version: 2.2
|
2
2
|
Name: alembic
|
3
|
-
Version: 1.
|
3
|
+
Version: 1.15.0
|
4
4
|
Summary: A database migration tool for SQLAlchemy.
|
5
|
-
|
6
|
-
Author: Mike Bayer
|
7
|
-
Author-email: mike_mp@zzzcomputing.com
|
5
|
+
Author-email: Mike Bayer <mike_mp@zzzcomputing.com>
|
8
6
|
License: MIT
|
7
|
+
Project-URL: Homepage, https://alembic.sqlalchemy.org
|
9
8
|
Project-URL: Documentation, https://alembic.sqlalchemy.org/en/latest/
|
10
9
|
Project-URL: Changelog, https://alembic.sqlalchemy.org/en/latest/changelog.html
|
11
10
|
Project-URL: Source, https://github.com/sqlalchemy/alembic/
|
@@ -17,24 +16,21 @@ Classifier: License :: OSI Approved :: MIT License
|
|
17
16
|
Classifier: Operating System :: OS Independent
|
18
17
|
Classifier: Programming Language :: Python
|
19
18
|
Classifier: Programming Language :: Python :: 3
|
20
|
-
Classifier: Programming Language :: Python :: 3.8
|
21
19
|
Classifier: Programming Language :: Python :: 3.9
|
22
20
|
Classifier: Programming Language :: Python :: 3.10
|
23
21
|
Classifier: Programming Language :: Python :: 3.11
|
24
22
|
Classifier: Programming Language :: Python :: 3.12
|
23
|
+
Classifier: Programming Language :: Python :: 3.13
|
25
24
|
Classifier: Programming Language :: Python :: Implementation :: CPython
|
26
25
|
Classifier: Programming Language :: Python :: Implementation :: PyPy
|
27
26
|
Classifier: Topic :: Database :: Front-Ends
|
28
|
-
Requires-Python: >=3.
|
27
|
+
Requires-Python: >=3.9
|
29
28
|
Description-Content-Type: text/x-rst
|
30
29
|
License-File: LICENSE
|
31
|
-
Requires-Dist: SQLAlchemy>=1.
|
30
|
+
Requires-Dist: SQLAlchemy>=1.4.0
|
32
31
|
Requires-Dist: Mako
|
33
|
-
Requires-Dist:
|
34
|
-
Requires-Dist: importlib-resources; python_version < "3.9"
|
35
|
-
Requires-Dist: typing-extensions>=4
|
32
|
+
Requires-Dist: typing-extensions>=4.12
|
36
33
|
Provides-Extra: tz
|
37
|
-
Requires-Dist: backports.zoneinfo; python_version < "3.9" and extra == "tz"
|
38
34
|
Requires-Dist: tzdata; extra == "tz"
|
39
35
|
|
40
36
|
Alembic is a database migrations tool written by the author
|
@@ -1,83 +1,74 @@
|
|
1
|
-
alembic/__init__.py,sha256=
|
1
|
+
alembic/__init__.py,sha256=U6xTcFJLMMVlT6XG5LhmoaEwQcFpNuAJx5iLHaYybuU,63
|
2
2
|
alembic/__main__.py,sha256=373m7-TBh72JqrSMYviGrxCHZo-cnweM8AGF8A22PmY,78
|
3
|
-
alembic/command.py,sha256=
|
3
|
+
alembic/command.py,sha256=HIRFQFUG_A9ZgLBC-MG2WmE_eX0QxvvX2Os-_eL2zBQ,22242
|
4
4
|
alembic/config.py,sha256=BZ7mwFRk2gq8GFNxxy9qvMUFx43YbDbQTC99OnjqiKY,22216
|
5
5
|
alembic/context.py,sha256=hK1AJOQXJ29Bhn276GYcosxeG7pC5aZRT5E8c4bMJ4Q,195
|
6
|
-
alembic/context.pyi,sha256=
|
6
|
+
alembic/context.pyi,sha256=fdeFNTRc0bUgi7n2eZWVFh6NG-TzIv_0gAcapbfHnKY,31773
|
7
7
|
alembic/environment.py,sha256=MM5lPayGT04H3aeng1H7GQ8HEAs3VGX5yy6mDLCPLT4,43
|
8
8
|
alembic/migration.py,sha256=MV6Fju6rZtn2fTREKzXrCZM6aIBGII4OMZFix0X-GLs,41
|
9
9
|
alembic/op.py,sha256=flHtcsVqOD-ZgZKK2pv-CJ5Cwh-KJ7puMUNXzishxLw,167
|
10
|
-
alembic/op.pyi,sha256=
|
10
|
+
alembic/op.pyi,sha256=TDNBVs8GwfmJaNYYW0v32el0rD6nMlCl_Q4zl_WP1K8,50123
|
11
11
|
alembic/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
12
12
|
alembic/autogenerate/__init__.py,sha256=ntmUTXhjLm4_zmqIwyVaECdpPDn6_u1yM9vYk6-553E,543
|
13
13
|
alembic/autogenerate/api.py,sha256=L4qkapSJO1Ypymx8HsjLl0vFFt202agwMYsQbIe6ZtI,22219
|
14
|
-
alembic/autogenerate/compare.py,sha256=
|
15
|
-
alembic/autogenerate/render.py,sha256=
|
14
|
+
alembic/autogenerate/compare.py,sha256=FKmfogZOLXp4EIx9eQ-q_DzlnI4-jZYqyxw2yOw_84A,44341
|
15
|
+
alembic/autogenerate/render.py,sha256=jt9AaIptES-PX7fsITRjXNNYiJ77nuuCt24IEyOmtaw,35758
|
16
16
|
alembic/autogenerate/rewriter.py,sha256=uZWRkTYJoncoEJ5WY1QBRiozjyChqZDJPy4LtcRibjM,7846
|
17
17
|
alembic/ddl/__init__.py,sha256=Df8fy4Vn_abP8B7q3x8gyFwEwnLw6hs2Ljt_bV3EZWE,152
|
18
18
|
alembic/ddl/_autogen.py,sha256=Blv2RrHNyF4cE6znCQXNXG5T9aO-YmiwD4Fz-qfoaWA,9275
|
19
|
-
alembic/ddl/base.py,sha256=
|
20
|
-
alembic/ddl/impl.py,sha256=
|
19
|
+
alembic/ddl/base.py,sha256=qXHSkROV3Z0CDGIg-6PY9q7PUQc39QTUEC_cNfCxEjg,9772
|
20
|
+
alembic/ddl/impl.py,sha256=Rf3LrJJvgaLA1r3psX_mKdQGuj0ZA7zbWcJAuAPuVJ4,30127
|
21
21
|
alembic/ddl/mssql.py,sha256=ydvgBSaftKYjaBaMyqius66Ta4CICQSj79Og3Ed2atY,14219
|
22
|
-
alembic/ddl/mysql.py,sha256=
|
22
|
+
alembic/ddl/mysql.py,sha256=9OOAmtg4GpEqWSbATT6FCq0xLnU8PMjr0VlRB171-EI,17301
|
23
23
|
alembic/ddl/oracle.py,sha256=669YlkcZihlXFbnXhH2krdrvDry8q5pcUGfoqkg_R6Y,6243
|
24
|
-
alembic/ddl/postgresql.py,sha256=
|
25
|
-
alembic/ddl/sqlite.py,sha256=
|
24
|
+
alembic/ddl/postgresql.py,sha256=D4oCA2xCrKV-82aAEmXgEe-llyDtL4xc9_tAZgznkuU,29931
|
25
|
+
alembic/ddl/sqlite.py,sha256=9p9dlXbGMZACqeFnSuhm7eSapFDGJNd6WhBhZrdpqFg,7995
|
26
26
|
alembic/operations/__init__.py,sha256=e0KQSZAgLpTWvyvreB7DWg7RJV_MWSOPVDgCqsd2FzY,318
|
27
|
-
alembic/operations/base.py,sha256=
|
28
|
-
alembic/operations/batch.py,sha256=
|
29
|
-
alembic/operations/ops.py,sha256=
|
27
|
+
alembic/operations/base.py,sha256=C97XgIYquKovofHQfxZDI3O5kSKx5qqeOObV-WrMwpM,74429
|
28
|
+
alembic/operations/batch.py,sha256=1UmCFcsFWObinQWFRWoGZkjynl54HKpldbPs67aR4wg,26923
|
29
|
+
alembic/operations/ops.py,sha256=O_y5nds3I8JGdRrRz0yz_j5WKzcax-mgidWzUyGz9E0,94908
|
30
30
|
alembic/operations/schemaobj.py,sha256=Wp-bBe4a8lXPTvIHJttBY0ejtpVR5Jvtb2kI-U2PztQ,9468
|
31
|
-
alembic/operations/toimpl.py,sha256=
|
31
|
+
alembic/operations/toimpl.py,sha256=DhydxHxPlPejzFPHsN1VR2tHINUdlJw3eKOjjmJCyu0,7114
|
32
32
|
alembic/runtime/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
33
|
-
alembic/runtime/environment.py,sha256=
|
34
|
-
alembic/runtime/migration.py,sha256=
|
33
|
+
alembic/runtime/environment.py,sha256=W9Y_9tiecmYq885xqMZOrxZs80tN0M_ovXOdCLjGI5A,41524
|
34
|
+
alembic/runtime/migration.py,sha256=X0O-sEuU54aNujyG_nxk1vs3BRBy2f-QwRJQmTucuVY,49874
|
35
35
|
alembic/script/__init__.py,sha256=lSj06O391Iy5avWAiq8SPs6N8RBgxkSPjP8wpXcNDGg,100
|
36
36
|
alembic/script/base.py,sha256=XLNpdsLnBBSz4ZKMFUArFUdtL1HcjtuUDHNbA-5VlZA,37809
|
37
37
|
alembic/script/revision.py,sha256=NTu-eu5Y78u4NoVXpT0alpD2oL40SGATA2sEMEf1el4,62306
|
38
38
|
alembic/script/write_hooks.py,sha256=NGB6NGgfdf7HK6XNNpSKqUCfzxazj-NRUePgFx7MJSM,5036
|
39
|
-
alembic/templates/async/README,sha256=ISVtAOvqvKk_5ThM5ioJE-lMkvf9IbknFUFVU_vPma4,58
|
40
|
-
alembic/templates/async/alembic.ini.mako,sha256=lYN5fP_fIX3FWtTcOy86Xznr6P5r1f0rlkdDhxLhVN4,3658
|
41
39
|
alembic/templates/async/env.py,sha256=zbOCf3Y7w2lg92hxSwmG1MM_7y56i_oRH4AKp0pQBYo,2389
|
42
|
-
alembic/templates/async/script.py.mako,sha256=MEqL-2qATlST9TAOeYgscMn1uy6HUS9NFvDgl93dMj8,635
|
43
|
-
alembic/templates/generic/README,sha256=MVlc9TYmr57RbhXET6QxgyCcwWP7w-vLkEsirENqiIQ,38
|
44
|
-
alembic/templates/generic/alembic.ini.mako,sha256=TPnqGqwg9QG8uCvBY5jaz32U2pqVqLK1dG1e8i2yDYM,3766
|
45
40
|
alembic/templates/generic/env.py,sha256=TLRWOVW3Xpt_Tpf8JFzlnoPn_qoUu8UV77Y4o9XD6yI,2103
|
46
|
-
alembic/templates/generic/script.py.mako,sha256=MEqL-2qATlST9TAOeYgscMn1uy6HUS9NFvDgl93dMj8,635
|
47
|
-
alembic/templates/multidb/README,sha256=dWLDhnBgphA4Nzb7sNlMfCS3_06YqVbHhz-9O5JNqyI,606
|
48
|
-
alembic/templates/multidb/alembic.ini.mako,sha256=cVrikS0KRB46GVcjSO8xKYm7rqUngqTnd06pCozm1Pw,3860
|
49
41
|
alembic/templates/multidb/env.py,sha256=6zNjnW8mXGUk7erTsAvrfhvqoczJ-gagjVq1Ypg2YIQ,4230
|
50
|
-
alembic/templates/multidb/script.py.mako,sha256=N06nMtNSwHkgl0EBXDyMt8njp9tlOesR583gfq21nbY,1090
|
51
42
|
alembic/testing/__init__.py,sha256=kOxOh5nwmui9d-_CCq9WA4Udwy7ITjm453w74CTLZDo,1159
|
52
|
-
alembic/testing/assertions.py,sha256=
|
53
|
-
alembic/testing/env.py,sha256=
|
54
|
-
alembic/testing/fixtures.py,sha256
|
55
|
-
alembic/testing/requirements.py,sha256=
|
43
|
+
alembic/testing/assertions.py,sha256=_zaiHj0RcmJs0u1EjrfELWUSi8aUu6xKvzdZ6hDuYUc,5196
|
44
|
+
alembic/testing/env.py,sha256=IkQnQmp6g5U82iZHkcndr7MndO3_UBn2TF_40TZ2ua0,10537
|
45
|
+
alembic/testing/fixtures.py,sha256=-0oudpWWZMGbwoeXSu1tlu5v8lLtl6eeKU8dMRUOWaU,9127
|
46
|
+
alembic/testing/requirements.py,sha256=gNnnvgPCuiqKeHmiNymdQuYIjQ0BrxiPxu_in4eHEsc,4180
|
56
47
|
alembic/testing/schemacompare.py,sha256=N5UqSNCOJetIKC4vKhpYzQEpj08XkdgIoqBmEPQ3tlc,4838
|
57
48
|
alembic/testing/util.py,sha256=CQrcQDA8fs_7ME85z5ydb-Bt70soIIID-qNY1vbR2dg,3350
|
58
|
-
alembic/testing/warnings.py,sha256=
|
49
|
+
alembic/testing/warnings.py,sha256=cDDWzvxNZE6x9dME2ACTXSv01G81JcIbE1GIE_s1kvg,831
|
59
50
|
alembic/testing/plugin/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
60
51
|
alembic/testing/plugin/bootstrap.py,sha256=9C6wtjGrIVztZ928w27hsQE0KcjDLIUtUN3dvZKsMVk,50
|
61
52
|
alembic/testing/suite/__init__.py,sha256=MvE7-hwbaVN1q3NM-ztGxORU9dnIelUCINKqNxewn7Y,288
|
62
53
|
alembic/testing/suite/_autogen_fixtures.py,sha256=cDq1pmzHe15S6dZPGNC6sqFaCQ3hLT_oPV2IDigUGQ0,9880
|
63
54
|
alembic/testing/suite/test_autogen_comments.py,sha256=aEGqKUDw4kHjnDk298aoGcQvXJWmZXcIX_2FxH4cJK8,6283
|
64
|
-
alembic/testing/suite/test_autogen_computed.py,sha256
|
55
|
+
alembic/testing/suite/test_autogen_computed.py,sha256=-5wran56qXo3afAbSk8cuSDDpbQweyJ61RF-GaVuZbA,4126
|
65
56
|
alembic/testing/suite/test_autogen_diffs.py,sha256=T4SR1n_kmcOKYhR4W1-dA0e5sddJ69DSVL2HW96kAkE,8394
|
66
57
|
alembic/testing/suite/test_autogen_fks.py,sha256=AqFmb26Buex167HYa9dZWOk8x-JlB1OK3bwcvvjDFaU,32927
|
67
58
|
alembic/testing/suite/test_autogen_identity.py,sha256=kcuqngG7qXAKPJDX4U8sRzPKHEJECHuZ0DtuaS6tVkk,5824
|
68
59
|
alembic/testing/suite/test_environment.py,sha256=OwD-kpESdLoc4byBrGrXbZHvqtPbzhFCG4W9hJOJXPQ,11877
|
69
60
|
alembic/testing/suite/test_op.py,sha256=2XQCdm_NmnPxHGuGj7hmxMzIhKxXNotUsKdACXzE1mM,1343
|
70
|
-
alembic/util/__init__.py,sha256=
|
61
|
+
alembic/util/__init__.py,sha256=Afa20opZHVV6pH8HJDBOZpImPH9cWenrG-PaBnY_Xxc,1461
|
71
62
|
alembic/util/compat.py,sha256=eoR9ReCTV_l0xGgGlr_OJmVvJecttBYXRKfDhoK8zKU,2630
|
72
63
|
alembic/util/editor.py,sha256=JIz6_BdgV8_oKtnheR6DZoB7qnrHrlRgWjx09AsTsUw,2546
|
73
|
-
alembic/util/exc.py,sha256=
|
64
|
+
alembic/util/exc.py,sha256=ZBlTQ8g-Jkb1iYFhFHs9djilRz0SSQ0Foc5SSoENs5o,564
|
74
65
|
alembic/util/langhelpers.py,sha256=LpOcovnhMnP45kTt8zNJ4BHpyQrlF40OL6yDXjqKtsE,10026
|
75
|
-
alembic/util/messaging.py,sha256=
|
66
|
+
alembic/util/messaging.py,sha256=aLF6xbRiOCOEW1UY5vA9AAlfkGeNLqPPGSs-3c8-bfc,3166
|
76
67
|
alembic/util/pyfiles.py,sha256=zltVdcwEJJCPS2gHsQvkHkQakuF6wXiZ6zfwHbGNT0g,3489
|
77
|
-
alembic/util/sqla_compat.py,sha256=
|
78
|
-
alembic-1.
|
79
|
-
alembic-1.
|
80
|
-
alembic-1.
|
81
|
-
alembic-1.
|
82
|
-
alembic-1.
|
83
|
-
alembic-1.
|
68
|
+
alembic/util/sqla_compat.py,sha256=SWAL4hJck4XLnUpe-oI3AGiH8w9kgDBe1_oakCfdT_Q,14785
|
69
|
+
alembic-1.15.0.dist-info/LICENSE,sha256=NeqcNBmyYfrxvkSMT0fZJVKBv2s2tf_qVQUiJ9S6VN4,1059
|
70
|
+
alembic-1.15.0.dist-info/METADATA,sha256=ZoH-DAa3CusjU3tdoyPMFeL74EariuOcdWArcts9YcY,7237
|
71
|
+
alembic-1.15.0.dist-info/WHEEL,sha256=jB7zZ3N9hIM9adW7qlTAyycLYW9npaWKLRzaoVcLKcM,91
|
72
|
+
alembic-1.15.0.dist-info/entry_points.txt,sha256=aykM30soxwGN0pB7etLc1q0cHJbL9dy46RnK9VX4LLw,48
|
73
|
+
alembic-1.15.0.dist-info/top_level.txt,sha256=FwKWd5VsPFC8iQjpu1u9Cn-JnK3-V1RhUCmWqz1cl-s,8
|
74
|
+
alembic-1.15.0.dist-info/RECORD,,
|
alembic/templates/async/README
DELETED
@@ -1 +0,0 @@
|
|
1
|
-
Generic single-database configuration with an async dbapi.
|