SQLAlchemy 2.0.47__cp313-cp313t-win32.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.
- sqlalchemy/__init__.py +283 -0
- sqlalchemy/connectors/__init__.py +18 -0
- sqlalchemy/connectors/aioodbc.py +184 -0
- sqlalchemy/connectors/asyncio.py +429 -0
- sqlalchemy/connectors/pyodbc.py +250 -0
- sqlalchemy/cyextension/__init__.py +6 -0
- sqlalchemy/cyextension/collections.cp313t-win32.pyd +0 -0
- sqlalchemy/cyextension/collections.pyx +409 -0
- sqlalchemy/cyextension/immutabledict.cp313t-win32.pyd +0 -0
- sqlalchemy/cyextension/immutabledict.pxd +8 -0
- sqlalchemy/cyextension/immutabledict.pyx +133 -0
- sqlalchemy/cyextension/processors.cp313t-win32.pyd +0 -0
- sqlalchemy/cyextension/processors.pyx +68 -0
- sqlalchemy/cyextension/resultproxy.cp313t-win32.pyd +0 -0
- sqlalchemy/cyextension/resultproxy.pyx +102 -0
- sqlalchemy/cyextension/util.cp313t-win32.pyd +0 -0
- sqlalchemy/cyextension/util.pyx +90 -0
- sqlalchemy/dialects/__init__.py +62 -0
- sqlalchemy/dialects/_typing.py +30 -0
- sqlalchemy/dialects/mssql/__init__.py +88 -0
- sqlalchemy/dialects/mssql/aioodbc.py +63 -0
- sqlalchemy/dialects/mssql/base.py +4093 -0
- sqlalchemy/dialects/mssql/information_schema.py +285 -0
- sqlalchemy/dialects/mssql/json.py +129 -0
- sqlalchemy/dialects/mssql/provision.py +185 -0
- sqlalchemy/dialects/mssql/pymssql.py +126 -0
- sqlalchemy/dialects/mssql/pyodbc.py +760 -0
- sqlalchemy/dialects/mysql/__init__.py +104 -0
- sqlalchemy/dialects/mysql/aiomysql.py +250 -0
- sqlalchemy/dialects/mysql/asyncmy.py +231 -0
- sqlalchemy/dialects/mysql/base.py +3949 -0
- sqlalchemy/dialects/mysql/cymysql.py +106 -0
- sqlalchemy/dialects/mysql/dml.py +225 -0
- sqlalchemy/dialects/mysql/enumerated.py +282 -0
- sqlalchemy/dialects/mysql/expression.py +146 -0
- sqlalchemy/dialects/mysql/json.py +91 -0
- sqlalchemy/dialects/mysql/mariadb.py +72 -0
- sqlalchemy/dialects/mysql/mariadbconnector.py +322 -0
- sqlalchemy/dialects/mysql/mysqlconnector.py +302 -0
- sqlalchemy/dialects/mysql/mysqldb.py +314 -0
- sqlalchemy/dialects/mysql/provision.py +153 -0
- sqlalchemy/dialects/mysql/pymysql.py +158 -0
- sqlalchemy/dialects/mysql/pyodbc.py +157 -0
- sqlalchemy/dialects/mysql/reflection.py +727 -0
- sqlalchemy/dialects/mysql/reserved_words.py +570 -0
- sqlalchemy/dialects/mysql/types.py +835 -0
- sqlalchemy/dialects/oracle/__init__.py +81 -0
- sqlalchemy/dialects/oracle/base.py +3802 -0
- sqlalchemy/dialects/oracle/cx_oracle.py +1555 -0
- sqlalchemy/dialects/oracle/dictionary.py +507 -0
- sqlalchemy/dialects/oracle/oracledb.py +941 -0
- sqlalchemy/dialects/oracle/provision.py +297 -0
- sqlalchemy/dialects/oracle/types.py +316 -0
- sqlalchemy/dialects/oracle/vector.py +365 -0
- sqlalchemy/dialects/postgresql/__init__.py +167 -0
- sqlalchemy/dialects/postgresql/_psycopg_common.py +189 -0
- sqlalchemy/dialects/postgresql/array.py +519 -0
- sqlalchemy/dialects/postgresql/asyncpg.py +1284 -0
- sqlalchemy/dialects/postgresql/base.py +5378 -0
- sqlalchemy/dialects/postgresql/dml.py +339 -0
- sqlalchemy/dialects/postgresql/ext.py +540 -0
- sqlalchemy/dialects/postgresql/hstore.py +406 -0
- sqlalchemy/dialects/postgresql/json.py +404 -0
- sqlalchemy/dialects/postgresql/named_types.py +524 -0
- sqlalchemy/dialects/postgresql/operators.py +129 -0
- sqlalchemy/dialects/postgresql/pg8000.py +669 -0
- sqlalchemy/dialects/postgresql/pg_catalog.py +326 -0
- sqlalchemy/dialects/postgresql/provision.py +183 -0
- sqlalchemy/dialects/postgresql/psycopg.py +862 -0
- sqlalchemy/dialects/postgresql/psycopg2.py +892 -0
- sqlalchemy/dialects/postgresql/psycopg2cffi.py +61 -0
- sqlalchemy/dialects/postgresql/ranges.py +1031 -0
- sqlalchemy/dialects/postgresql/types.py +313 -0
- sqlalchemy/dialects/sqlite/__init__.py +57 -0
- sqlalchemy/dialects/sqlite/aiosqlite.py +482 -0
- sqlalchemy/dialects/sqlite/base.py +3056 -0
- sqlalchemy/dialects/sqlite/dml.py +263 -0
- sqlalchemy/dialects/sqlite/json.py +92 -0
- sqlalchemy/dialects/sqlite/provision.py +229 -0
- sqlalchemy/dialects/sqlite/pysqlcipher.py +157 -0
- sqlalchemy/dialects/sqlite/pysqlite.py +756 -0
- sqlalchemy/dialects/type_migration_guidelines.txt +145 -0
- sqlalchemy/engine/__init__.py +62 -0
- sqlalchemy/engine/_py_processors.py +136 -0
- sqlalchemy/engine/_py_row.py +128 -0
- sqlalchemy/engine/_py_util.py +74 -0
- sqlalchemy/engine/base.py +3390 -0
- sqlalchemy/engine/characteristics.py +155 -0
- sqlalchemy/engine/create.py +893 -0
- sqlalchemy/engine/cursor.py +2298 -0
- sqlalchemy/engine/default.py +2394 -0
- sqlalchemy/engine/events.py +965 -0
- sqlalchemy/engine/interfaces.py +3471 -0
- sqlalchemy/engine/mock.py +134 -0
- sqlalchemy/engine/processors.py +61 -0
- sqlalchemy/engine/reflection.py +2102 -0
- sqlalchemy/engine/result.py +2399 -0
- sqlalchemy/engine/row.py +400 -0
- sqlalchemy/engine/strategies.py +16 -0
- sqlalchemy/engine/url.py +924 -0
- sqlalchemy/engine/util.py +167 -0
- sqlalchemy/event/__init__.py +26 -0
- sqlalchemy/event/api.py +220 -0
- sqlalchemy/event/attr.py +676 -0
- sqlalchemy/event/base.py +472 -0
- sqlalchemy/event/legacy.py +258 -0
- sqlalchemy/event/registry.py +390 -0
- sqlalchemy/events.py +17 -0
- sqlalchemy/exc.py +832 -0
- sqlalchemy/ext/__init__.py +11 -0
- sqlalchemy/ext/associationproxy.py +2027 -0
- sqlalchemy/ext/asyncio/__init__.py +25 -0
- sqlalchemy/ext/asyncio/base.py +281 -0
- sqlalchemy/ext/asyncio/engine.py +1471 -0
- sqlalchemy/ext/asyncio/exc.py +21 -0
- sqlalchemy/ext/asyncio/result.py +965 -0
- sqlalchemy/ext/asyncio/scoping.py +1599 -0
- sqlalchemy/ext/asyncio/session.py +1947 -0
- sqlalchemy/ext/automap.py +1701 -0
- sqlalchemy/ext/baked.py +570 -0
- sqlalchemy/ext/compiler.py +600 -0
- sqlalchemy/ext/declarative/__init__.py +65 -0
- sqlalchemy/ext/declarative/extensions.py +564 -0
- sqlalchemy/ext/horizontal_shard.py +478 -0
- sqlalchemy/ext/hybrid.py +1535 -0
- sqlalchemy/ext/indexable.py +364 -0
- sqlalchemy/ext/instrumentation.py +450 -0
- sqlalchemy/ext/mutable.py +1085 -0
- sqlalchemy/ext/mypy/__init__.py +6 -0
- sqlalchemy/ext/mypy/apply.py +324 -0
- sqlalchemy/ext/mypy/decl_class.py +515 -0
- sqlalchemy/ext/mypy/infer.py +590 -0
- sqlalchemy/ext/mypy/names.py +335 -0
- sqlalchemy/ext/mypy/plugin.py +303 -0
- sqlalchemy/ext/mypy/util.py +357 -0
- sqlalchemy/ext/orderinglist.py +439 -0
- sqlalchemy/ext/serializer.py +185 -0
- sqlalchemy/future/__init__.py +16 -0
- sqlalchemy/future/engine.py +15 -0
- sqlalchemy/inspection.py +174 -0
- sqlalchemy/log.py +288 -0
- sqlalchemy/orm/__init__.py +171 -0
- sqlalchemy/orm/_orm_constructors.py +2661 -0
- sqlalchemy/orm/_typing.py +179 -0
- sqlalchemy/orm/attributes.py +2845 -0
- sqlalchemy/orm/base.py +971 -0
- sqlalchemy/orm/bulk_persistence.py +2135 -0
- sqlalchemy/orm/clsregistry.py +571 -0
- sqlalchemy/orm/collections.py +1627 -0
- sqlalchemy/orm/context.py +3334 -0
- sqlalchemy/orm/decl_api.py +2004 -0
- sqlalchemy/orm/decl_base.py +2192 -0
- sqlalchemy/orm/dependency.py +1302 -0
- sqlalchemy/orm/descriptor_props.py +1092 -0
- sqlalchemy/orm/dynamic.py +300 -0
- sqlalchemy/orm/evaluator.py +379 -0
- sqlalchemy/orm/events.py +3252 -0
- sqlalchemy/orm/exc.py +237 -0
- sqlalchemy/orm/identity.py +302 -0
- sqlalchemy/orm/instrumentation.py +754 -0
- sqlalchemy/orm/interfaces.py +1496 -0
- sqlalchemy/orm/loading.py +1686 -0
- sqlalchemy/orm/mapped_collection.py +557 -0
- sqlalchemy/orm/mapper.py +4444 -0
- sqlalchemy/orm/path_registry.py +809 -0
- sqlalchemy/orm/persistence.py +1788 -0
- sqlalchemy/orm/properties.py +935 -0
- sqlalchemy/orm/query.py +3459 -0
- sqlalchemy/orm/relationships.py +3508 -0
- sqlalchemy/orm/scoping.py +2148 -0
- sqlalchemy/orm/session.py +5280 -0
- sqlalchemy/orm/state.py +1168 -0
- sqlalchemy/orm/state_changes.py +196 -0
- sqlalchemy/orm/strategies.py +3470 -0
- sqlalchemy/orm/strategy_options.py +2568 -0
- sqlalchemy/orm/sync.py +164 -0
- sqlalchemy/orm/unitofwork.py +796 -0
- sqlalchemy/orm/util.py +2403 -0
- sqlalchemy/orm/writeonly.py +674 -0
- sqlalchemy/pool/__init__.py +44 -0
- sqlalchemy/pool/base.py +1524 -0
- sqlalchemy/pool/events.py +375 -0
- sqlalchemy/pool/impl.py +588 -0
- sqlalchemy/py.typed +0 -0
- sqlalchemy/schema.py +69 -0
- sqlalchemy/sql/__init__.py +145 -0
- sqlalchemy/sql/_dml_constructors.py +132 -0
- sqlalchemy/sql/_elements_constructors.py +1872 -0
- sqlalchemy/sql/_orm_types.py +20 -0
- sqlalchemy/sql/_py_util.py +75 -0
- sqlalchemy/sql/_selectable_constructors.py +763 -0
- sqlalchemy/sql/_typing.py +482 -0
- sqlalchemy/sql/annotation.py +587 -0
- sqlalchemy/sql/base.py +2293 -0
- sqlalchemy/sql/cache_key.py +1057 -0
- sqlalchemy/sql/coercions.py +1404 -0
- sqlalchemy/sql/compiler.py +8081 -0
- sqlalchemy/sql/crud.py +1752 -0
- sqlalchemy/sql/ddl.py +1444 -0
- sqlalchemy/sql/default_comparator.py +551 -0
- sqlalchemy/sql/dml.py +1850 -0
- sqlalchemy/sql/elements.py +5589 -0
- sqlalchemy/sql/events.py +458 -0
- sqlalchemy/sql/expression.py +159 -0
- sqlalchemy/sql/functions.py +2158 -0
- sqlalchemy/sql/lambdas.py +1442 -0
- sqlalchemy/sql/naming.py +209 -0
- sqlalchemy/sql/operators.py +2623 -0
- sqlalchemy/sql/roles.py +323 -0
- sqlalchemy/sql/schema.py +6222 -0
- sqlalchemy/sql/selectable.py +7265 -0
- sqlalchemy/sql/sqltypes.py +3930 -0
- sqlalchemy/sql/traversals.py +1024 -0
- sqlalchemy/sql/type_api.py +2368 -0
- sqlalchemy/sql/util.py +1485 -0
- sqlalchemy/sql/visitors.py +1164 -0
- sqlalchemy/testing/__init__.py +96 -0
- sqlalchemy/testing/assertions.py +994 -0
- sqlalchemy/testing/assertsql.py +520 -0
- sqlalchemy/testing/asyncio.py +135 -0
- sqlalchemy/testing/config.py +434 -0
- sqlalchemy/testing/engines.py +483 -0
- sqlalchemy/testing/entities.py +117 -0
- sqlalchemy/testing/exclusions.py +476 -0
- sqlalchemy/testing/fixtures/__init__.py +28 -0
- sqlalchemy/testing/fixtures/base.py +384 -0
- sqlalchemy/testing/fixtures/mypy.py +332 -0
- sqlalchemy/testing/fixtures/orm.py +227 -0
- sqlalchemy/testing/fixtures/sql.py +482 -0
- sqlalchemy/testing/pickleable.py +155 -0
- sqlalchemy/testing/plugin/__init__.py +6 -0
- sqlalchemy/testing/plugin/bootstrap.py +51 -0
- sqlalchemy/testing/plugin/plugin_base.py +828 -0
- sqlalchemy/testing/plugin/pytestplugin.py +892 -0
- sqlalchemy/testing/profiling.py +329 -0
- sqlalchemy/testing/provision.py +603 -0
- sqlalchemy/testing/requirements.py +1945 -0
- sqlalchemy/testing/schema.py +198 -0
- sqlalchemy/testing/suite/__init__.py +19 -0
- sqlalchemy/testing/suite/test_cte.py +237 -0
- sqlalchemy/testing/suite/test_ddl.py +389 -0
- sqlalchemy/testing/suite/test_deprecations.py +153 -0
- sqlalchemy/testing/suite/test_dialect.py +776 -0
- sqlalchemy/testing/suite/test_insert.py +630 -0
- sqlalchemy/testing/suite/test_reflection.py +3557 -0
- sqlalchemy/testing/suite/test_results.py +504 -0
- sqlalchemy/testing/suite/test_rowcount.py +258 -0
- sqlalchemy/testing/suite/test_select.py +2010 -0
- sqlalchemy/testing/suite/test_sequence.py +317 -0
- sqlalchemy/testing/suite/test_types.py +2147 -0
- sqlalchemy/testing/suite/test_unicode_ddl.py +189 -0
- sqlalchemy/testing/suite/test_update_delete.py +139 -0
- sqlalchemy/testing/util.py +535 -0
- sqlalchemy/testing/warnings.py +52 -0
- sqlalchemy/types.py +74 -0
- sqlalchemy/util/__init__.py +162 -0
- sqlalchemy/util/_collections.py +712 -0
- sqlalchemy/util/_concurrency_py3k.py +288 -0
- sqlalchemy/util/_has_cy.py +40 -0
- sqlalchemy/util/_py_collections.py +541 -0
- sqlalchemy/util/compat.py +421 -0
- sqlalchemy/util/concurrency.py +110 -0
- sqlalchemy/util/deprecations.py +401 -0
- sqlalchemy/util/langhelpers.py +2203 -0
- sqlalchemy/util/preloaded.py +150 -0
- sqlalchemy/util/queue.py +322 -0
- sqlalchemy/util/tool_support.py +201 -0
- sqlalchemy/util/topological.py +120 -0
- sqlalchemy/util/typing.py +734 -0
- sqlalchemy-2.0.47.dist-info/METADATA +243 -0
- sqlalchemy-2.0.47.dist-info/RECORD +274 -0
- sqlalchemy-2.0.47.dist-info/WHEEL +5 -0
- sqlalchemy-2.0.47.dist-info/licenses/LICENSE +19 -0
- sqlalchemy-2.0.47.dist-info/top_level.txt +1 -0
sqlalchemy/sql/naming.py
ADDED
|
@@ -0,0 +1,209 @@
|
|
|
1
|
+
# sql/naming.py
|
|
2
|
+
# Copyright (C) 2005-2026 the SQLAlchemy authors and contributors
|
|
3
|
+
# <see AUTHORS file>
|
|
4
|
+
#
|
|
5
|
+
# This module is part of SQLAlchemy and is released under
|
|
6
|
+
# the MIT License: https://www.opensource.org/licenses/mit-license.php
|
|
7
|
+
# mypy: allow-untyped-defs, allow-untyped-calls
|
|
8
|
+
|
|
9
|
+
"""Establish constraint and index naming conventions."""
|
|
10
|
+
|
|
11
|
+
from __future__ import annotations
|
|
12
|
+
|
|
13
|
+
import re
|
|
14
|
+
|
|
15
|
+
from . import events # noqa
|
|
16
|
+
from .base import _NONE_NAME
|
|
17
|
+
from .elements import conv as conv
|
|
18
|
+
from .schema import CheckConstraint
|
|
19
|
+
from .schema import Column
|
|
20
|
+
from .schema import Constraint
|
|
21
|
+
from .schema import ForeignKeyConstraint
|
|
22
|
+
from .schema import Index
|
|
23
|
+
from .schema import PrimaryKeyConstraint
|
|
24
|
+
from .schema import Table
|
|
25
|
+
from .schema import UniqueConstraint
|
|
26
|
+
from .. import event
|
|
27
|
+
from .. import exc
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
class ConventionDict:
|
|
31
|
+
def __init__(self, const, table, convention):
|
|
32
|
+
self.const = const
|
|
33
|
+
self._is_fk = isinstance(const, ForeignKeyConstraint)
|
|
34
|
+
self.table = table
|
|
35
|
+
self.convention = convention
|
|
36
|
+
self._const_name = const.name
|
|
37
|
+
|
|
38
|
+
def _key_table_name(self):
|
|
39
|
+
return self.table.name
|
|
40
|
+
|
|
41
|
+
def _column_X(self, idx, attrname):
|
|
42
|
+
if self._is_fk:
|
|
43
|
+
try:
|
|
44
|
+
fk = self.const.elements[idx]
|
|
45
|
+
except IndexError:
|
|
46
|
+
return ""
|
|
47
|
+
else:
|
|
48
|
+
return getattr(fk.parent, attrname)
|
|
49
|
+
else:
|
|
50
|
+
cols = list(self.const.columns)
|
|
51
|
+
try:
|
|
52
|
+
col = cols[idx]
|
|
53
|
+
except IndexError:
|
|
54
|
+
return ""
|
|
55
|
+
else:
|
|
56
|
+
return getattr(col, attrname)
|
|
57
|
+
|
|
58
|
+
def _key_constraint_name(self):
|
|
59
|
+
if self._const_name in (None, _NONE_NAME):
|
|
60
|
+
raise exc.InvalidRequestError(
|
|
61
|
+
"Naming convention including "
|
|
62
|
+
"%(constraint_name)s token requires that "
|
|
63
|
+
"constraint is explicitly named."
|
|
64
|
+
)
|
|
65
|
+
if not isinstance(self._const_name, conv):
|
|
66
|
+
self.const.name = None
|
|
67
|
+
return self._const_name
|
|
68
|
+
|
|
69
|
+
def _key_column_X_key(self, idx):
|
|
70
|
+
# note this method was missing before
|
|
71
|
+
# [ticket:3989], meaning tokens like ``%(column_0_key)s`` weren't
|
|
72
|
+
# working even though documented.
|
|
73
|
+
return self._column_X(idx, "key")
|
|
74
|
+
|
|
75
|
+
def _key_column_X_name(self, idx):
|
|
76
|
+
return self._column_X(idx, "name")
|
|
77
|
+
|
|
78
|
+
def _key_column_X_label(self, idx):
|
|
79
|
+
return self._column_X(idx, "_ddl_label")
|
|
80
|
+
|
|
81
|
+
def _key_referred_table_name(self):
|
|
82
|
+
fk = self.const.elements[0]
|
|
83
|
+
refs = fk.target_fullname.split(".")
|
|
84
|
+
if len(refs) == 3:
|
|
85
|
+
refschema, reftable, refcol = refs
|
|
86
|
+
else:
|
|
87
|
+
reftable, refcol = refs
|
|
88
|
+
return reftable
|
|
89
|
+
|
|
90
|
+
def _key_referred_column_X_name(self, idx):
|
|
91
|
+
fk = self.const.elements[idx]
|
|
92
|
+
# note that before [ticket:3989], this method was returning
|
|
93
|
+
# the specification for the :class:`.ForeignKey` itself, which normally
|
|
94
|
+
# would be using the ``.key`` of the column, not the name.
|
|
95
|
+
return fk.column.name
|
|
96
|
+
|
|
97
|
+
def __getitem__(self, key):
|
|
98
|
+
if key in self.convention:
|
|
99
|
+
return self.convention[key](self.const, self.table)
|
|
100
|
+
elif hasattr(self, "_key_%s" % key):
|
|
101
|
+
return getattr(self, "_key_%s" % key)()
|
|
102
|
+
else:
|
|
103
|
+
col_template = re.match(r".*_?column_(\d+)(_?N)?_.+", key)
|
|
104
|
+
if col_template:
|
|
105
|
+
idx = col_template.group(1)
|
|
106
|
+
multiples = col_template.group(2)
|
|
107
|
+
|
|
108
|
+
if multiples:
|
|
109
|
+
if self._is_fk:
|
|
110
|
+
elems = self.const.elements
|
|
111
|
+
else:
|
|
112
|
+
elems = list(self.const.columns)
|
|
113
|
+
tokens = []
|
|
114
|
+
for idx, elem in enumerate(elems):
|
|
115
|
+
attr = "_key_" + key.replace("0" + multiples, "X")
|
|
116
|
+
try:
|
|
117
|
+
tokens.append(getattr(self, attr)(idx))
|
|
118
|
+
except AttributeError:
|
|
119
|
+
raise KeyError(key)
|
|
120
|
+
sep = "_" if multiples.startswith("_") else ""
|
|
121
|
+
return sep.join(tokens)
|
|
122
|
+
else:
|
|
123
|
+
attr = "_key_" + key.replace(idx, "X")
|
|
124
|
+
idx = int(idx)
|
|
125
|
+
if hasattr(self, attr):
|
|
126
|
+
return getattr(self, attr)(idx)
|
|
127
|
+
raise KeyError(key)
|
|
128
|
+
|
|
129
|
+
|
|
130
|
+
_prefix_dict = {
|
|
131
|
+
Index: "ix",
|
|
132
|
+
PrimaryKeyConstraint: "pk",
|
|
133
|
+
CheckConstraint: "ck",
|
|
134
|
+
UniqueConstraint: "uq",
|
|
135
|
+
ForeignKeyConstraint: "fk",
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
|
|
139
|
+
def _get_convention(dict_, key):
|
|
140
|
+
for super_ in key.__mro__:
|
|
141
|
+
if super_ in _prefix_dict and _prefix_dict[super_] in dict_:
|
|
142
|
+
return dict_[_prefix_dict[super_]]
|
|
143
|
+
elif super_ in dict_:
|
|
144
|
+
return dict_[super_]
|
|
145
|
+
else:
|
|
146
|
+
return None
|
|
147
|
+
|
|
148
|
+
|
|
149
|
+
def _constraint_name_for_table(const, table):
|
|
150
|
+
metadata = table.metadata
|
|
151
|
+
convention = _get_convention(metadata.naming_convention, type(const))
|
|
152
|
+
|
|
153
|
+
if isinstance(const.name, conv):
|
|
154
|
+
return const.name
|
|
155
|
+
elif (
|
|
156
|
+
convention is not None
|
|
157
|
+
and not isinstance(const.name, conv)
|
|
158
|
+
and (
|
|
159
|
+
const.name is None
|
|
160
|
+
or "constraint_name" in convention
|
|
161
|
+
or const.name is _NONE_NAME
|
|
162
|
+
)
|
|
163
|
+
):
|
|
164
|
+
return conv(
|
|
165
|
+
convention
|
|
166
|
+
% ConventionDict(const, table, metadata.naming_convention)
|
|
167
|
+
)
|
|
168
|
+
elif convention is _NONE_NAME:
|
|
169
|
+
return None
|
|
170
|
+
|
|
171
|
+
|
|
172
|
+
@event.listens_for(
|
|
173
|
+
PrimaryKeyConstraint, "_sa_event_column_added_to_pk_constraint"
|
|
174
|
+
)
|
|
175
|
+
def _column_added_to_pk_constraint(pk_constraint, col):
|
|
176
|
+
if pk_constraint._implicit_generated:
|
|
177
|
+
# only operate upon the "implicit" pk constraint for now,
|
|
178
|
+
# as we have to force the name to None to reset it. the
|
|
179
|
+
# "implicit" constraint will only have a naming convention name
|
|
180
|
+
# if at all.
|
|
181
|
+
table = pk_constraint.table
|
|
182
|
+
pk_constraint.name = None
|
|
183
|
+
newname = _constraint_name_for_table(pk_constraint, table)
|
|
184
|
+
if newname:
|
|
185
|
+
pk_constraint.name = newname
|
|
186
|
+
|
|
187
|
+
|
|
188
|
+
@event.listens_for(Constraint, "after_parent_attach")
|
|
189
|
+
@event.listens_for(Index, "after_parent_attach")
|
|
190
|
+
def _constraint_name(const, table):
|
|
191
|
+
if isinstance(table, Column):
|
|
192
|
+
# this path occurs for a CheckConstraint linked to a Column
|
|
193
|
+
|
|
194
|
+
# for column-attached constraint, set another event
|
|
195
|
+
# to link the column attached to the table as this constraint
|
|
196
|
+
# associated with the table.
|
|
197
|
+
event.listen(
|
|
198
|
+
table,
|
|
199
|
+
"after_parent_attach",
|
|
200
|
+
lambda col, table: _constraint_name(const, table),
|
|
201
|
+
)
|
|
202
|
+
|
|
203
|
+
elif isinstance(table, Table):
|
|
204
|
+
if isinstance(const.name, conv) or const.name is _NONE_NAME:
|
|
205
|
+
return
|
|
206
|
+
|
|
207
|
+
newname = _constraint_name_for_table(const, table)
|
|
208
|
+
if newname:
|
|
209
|
+
const.name = newname
|