SQLAlchemy 2.0.50__py3-none-any.whl → 2.0.51__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.
- sqlalchemy/__init__.py +1 -1
- sqlalchemy/dialects/postgresql/_psycopg_common.py +1 -1
- sqlalchemy/dialects/postgresql/base.py +16 -1
- sqlalchemy/dialects/postgresql/hstore.py +2 -2
- sqlalchemy/dialects/sqlite/pysqlcipher.py +0 -1
- sqlalchemy/engine/cursor.py +6 -0
- sqlalchemy/engine/result.py +27 -0
- sqlalchemy/orm/scoping.py +2 -3
- sqlalchemy/orm/session.py +5 -4
- sqlalchemy/orm/strategies.py +1 -1
- sqlalchemy/sql/elements.py +7 -3
- sqlalchemy/sql/lambdas.py +1 -1
- sqlalchemy/sql/selectable.py +12 -26
- sqlalchemy/testing/fixtures/base.py +10 -5
- {sqlalchemy-2.0.50.dist-info → sqlalchemy-2.0.51.dist-info}/METADATA +1 -1
- {sqlalchemy-2.0.50.dist-info → sqlalchemy-2.0.51.dist-info}/RECORD +19 -19
- {sqlalchemy-2.0.50.dist-info → sqlalchemy-2.0.51.dist-info}/WHEEL +0 -0
- {sqlalchemy-2.0.50.dist-info → sqlalchemy-2.0.51.dist-info}/licenses/LICENSE +0 -0
- {sqlalchemy-2.0.50.dist-info → sqlalchemy-2.0.51.dist-info}/top_level.txt +0 -0
sqlalchemy/__init__.py
CHANGED
|
@@ -1198,6 +1198,21 @@ constraints, enabling table inheritance hierarchies in PostgreSQL.
|
|
|
1198
1198
|
|
|
1199
1199
|
Table("some_table", metadata, ..., postgresql_inherits=("t1", "t2", ...))
|
|
1200
1200
|
|
|
1201
|
+
For schema-qualified parent table names, use :class:`.quoted_name` with
|
|
1202
|
+
``quote=False`` to prevent the dotted name from being quoted as a single
|
|
1203
|
+
identifier::
|
|
1204
|
+
|
|
1205
|
+
from sqlalchemy.sql import quoted_name
|
|
1206
|
+
|
|
1207
|
+
Table(
|
|
1208
|
+
"some_table",
|
|
1209
|
+
metadata,
|
|
1210
|
+
...,
|
|
1211
|
+
postgresql_inherits=quoted_name(
|
|
1212
|
+
"my_schema.some_supertable", quote=False
|
|
1213
|
+
),
|
|
1214
|
+
)
|
|
1215
|
+
|
|
1201
1216
|
``ON COMMIT``
|
|
1202
1217
|
^^^^^^^^^^^^^
|
|
1203
1218
|
|
|
@@ -3502,7 +3517,7 @@ class PGDialect(default.DefaultDialect):
|
|
|
3502
3517
|
|
|
3503
3518
|
def do_prepare_twophase(self, connection, xid):
|
|
3504
3519
|
connection.execute(
|
|
3505
|
-
sql.text("PREPARE TRANSACTION :xid
|
|
3520
|
+
sql.text("PREPARE TRANSACTION :xid").bindparams(
|
|
3506
3521
|
sql.bindparam("xid", xid, literal_execute=True)
|
|
3507
3522
|
)
|
|
3508
3523
|
)
|
|
@@ -302,12 +302,12 @@ class _HStoreMatrixFunction(sqlfunc.GenericFunction):
|
|
|
302
302
|
HSTORE_PAIR_RE = re.compile(
|
|
303
303
|
r"""
|
|
304
304
|
(
|
|
305
|
-
"(?P<key> (\\ . | [^"])* )"
|
|
305
|
+
"(?P<key> (\\ . | [^"\\])* )" # Quoted key
|
|
306
306
|
)
|
|
307
307
|
[ ]* => [ ]* # Pair operator, optional adjoining whitespace
|
|
308
308
|
(
|
|
309
309
|
(?P<value_null> NULL ) # NULL value
|
|
310
|
-
| "(?P<value> (\\ . | [^"])* )"
|
|
310
|
+
| "(?P<value> (\\ . | [^"\\])* )" # Quoted value
|
|
311
311
|
)
|
|
312
312
|
""",
|
|
313
313
|
re.VERBOSE,
|
|
@@ -144,7 +144,6 @@ class SQLiteDialect_pysqlcipher(SQLiteDialect_pysqlite):
|
|
|
144
144
|
cursor.execute(f"pragma key={passphrase}")
|
|
145
145
|
for prag, value in query_pragmas.items():
|
|
146
146
|
cursor.execute(f"pragma {prag}={value}")
|
|
147
|
-
print(query_pragmas)
|
|
148
147
|
cursor.close()
|
|
149
148
|
|
|
150
149
|
if super_on_connect:
|
sqlalchemy/engine/cursor.py
CHANGED
|
@@ -183,9 +183,15 @@ class CursorResultMetaData(ResultMetaData):
|
|
|
183
183
|
return key in self._keymap
|
|
184
184
|
|
|
185
185
|
def _for_freeze(self) -> ResultMetaData:
|
|
186
|
+
ambiguous = {
|
|
187
|
+
rec[MD_LOOKUP_KEY]
|
|
188
|
+
for rec in self._keymap.values()
|
|
189
|
+
if rec[MD_INDEX] is None
|
|
190
|
+
}
|
|
186
191
|
return SimpleResultMetaData(
|
|
187
192
|
self._keys,
|
|
188
193
|
extra=[self._keymap[key][MD_OBJECTS] for key in self._keys],
|
|
194
|
+
_ambiguous_keys=frozenset(ambiguous) if ambiguous else None,
|
|
189
195
|
)
|
|
190
196
|
|
|
191
197
|
def _make_new_metadata(
|
sqlalchemy/engine/result.py
CHANGED
|
@@ -267,6 +267,7 @@ class SimpleResultMetaData(ResultMetaData):
|
|
|
267
267
|
"_translated_indexes",
|
|
268
268
|
"_unique_filters",
|
|
269
269
|
"_key_to_index",
|
|
270
|
+
"_ambiguous_keys",
|
|
270
271
|
)
|
|
271
272
|
|
|
272
273
|
_keys: Sequence[str]
|
|
@@ -279,6 +280,7 @@ class SimpleResultMetaData(ResultMetaData):
|
|
|
279
280
|
_tuplefilter: Optional[_TupleGetterType] = None,
|
|
280
281
|
_translated_indexes: Optional[Sequence[int]] = None,
|
|
281
282
|
_unique_filters: Optional[Sequence[Callable[[Any], Any]]] = None,
|
|
283
|
+
_ambiguous_keys: Optional[frozenset[str]] = None,
|
|
282
284
|
):
|
|
283
285
|
self._keys = list(keys)
|
|
284
286
|
self._tuplefilter = _tuplefilter
|
|
@@ -300,8 +302,15 @@ class SimpleResultMetaData(ResultMetaData):
|
|
|
300
302
|
|
|
301
303
|
self._keymap = {key: rec for keys, rec in recs_names for key in keys}
|
|
302
304
|
|
|
305
|
+
if _ambiguous_keys:
|
|
306
|
+
for name in _ambiguous_keys.intersection(self._keymap):
|
|
307
|
+
rec = self._keymap[name]
|
|
308
|
+
self._keymap[name] = (None,) + rec[1:]
|
|
309
|
+
|
|
303
310
|
self._processors = _processors
|
|
304
311
|
|
|
312
|
+
self._ambiguous_keys = _ambiguous_keys
|
|
313
|
+
|
|
305
314
|
self._key_to_index = self._make_key_to_index(self._keymap, 0)
|
|
306
315
|
|
|
307
316
|
def _has_key(self, key: object) -> bool:
|
|
@@ -318,12 +327,14 @@ class SimpleResultMetaData(ResultMetaData):
|
|
|
318
327
|
self._keys,
|
|
319
328
|
extra=[self._keymap[key][2] for key in self._keys],
|
|
320
329
|
_unique_filters=unique_filters,
|
|
330
|
+
_ambiguous_keys=self._ambiguous_keys,
|
|
321
331
|
)
|
|
322
332
|
|
|
323
333
|
def __getstate__(self) -> Dict[str, Any]:
|
|
324
334
|
return {
|
|
325
335
|
"_keys": self._keys,
|
|
326
336
|
"_translated_indexes": self._translated_indexes,
|
|
337
|
+
"_ambiguous_keys": self._ambiguous_keys,
|
|
327
338
|
}
|
|
328
339
|
|
|
329
340
|
def __setstate__(self, state: Dict[str, Any]) -> None:
|
|
@@ -336,6 +347,7 @@ class SimpleResultMetaData(ResultMetaData):
|
|
|
336
347
|
state["_keys"],
|
|
337
348
|
_translated_indexes=_translated_indexes,
|
|
338
349
|
_tuplefilter=_tuplefilter,
|
|
350
|
+
_ambiguous_keys=state.get("_ambiguous_keys"),
|
|
339
351
|
)
|
|
340
352
|
|
|
341
353
|
def _index_for_key(self, key: Any, raiseerr: bool = True) -> int:
|
|
@@ -346,9 +358,21 @@ class SimpleResultMetaData(ResultMetaData):
|
|
|
346
358
|
except KeyError as ke:
|
|
347
359
|
rec = self._key_fallback(key, ke, raiseerr)
|
|
348
360
|
|
|
361
|
+
if rec[0] is None:
|
|
362
|
+
self._raise_for_ambiguous_column_name(rec)
|
|
349
363
|
return rec[0] # type: ignore[no-any-return]
|
|
350
364
|
|
|
365
|
+
def _raise_for_ambiguous_column_name(
|
|
366
|
+
self, rec: _KeyMapRecType
|
|
367
|
+
) -> NoReturn:
|
|
368
|
+
raise exc.InvalidRequestError(
|
|
369
|
+
"Ambiguous column name '%s' in "
|
|
370
|
+
"result set column descriptions" % rec[1]
|
|
371
|
+
)
|
|
372
|
+
|
|
351
373
|
def _indexes_for_keys(self, keys: Sequence[Any]) -> Sequence[int]:
|
|
374
|
+
# only used by the ORM with Column objects; does not need
|
|
375
|
+
# ambiguous column name support
|
|
352
376
|
return [self._keymap[key][0] for key in keys]
|
|
353
377
|
|
|
354
378
|
def _metadata_for_keys(
|
|
@@ -363,6 +387,9 @@ class SimpleResultMetaData(ResultMetaData):
|
|
|
363
387
|
except KeyError as ke:
|
|
364
388
|
rec = self._key_fallback(key, ke, True)
|
|
365
389
|
|
|
390
|
+
if rec[0] is None:
|
|
391
|
+
self._raise_for_ambiguous_column_name(rec)
|
|
392
|
+
|
|
366
393
|
yield rec
|
|
367
394
|
|
|
368
395
|
def _reduce(self, keys: Sequence[Any]) -> ResultMetaData:
|
sqlalchemy/orm/scoping.py
CHANGED
|
@@ -39,7 +39,6 @@ if TYPE_CHECKING:
|
|
|
39
39
|
from ._typing import OrmExecuteOptionsParameter
|
|
40
40
|
from .identity import IdentityMap
|
|
41
41
|
from .interfaces import ORMOption
|
|
42
|
-
from .mapper import Mapper
|
|
43
42
|
from .query import Query
|
|
44
43
|
from .query import RowReturningQuery
|
|
45
44
|
from .session import _BindArguments
|
|
@@ -1350,7 +1349,7 @@ class scoped_session(Generic[_S]):
|
|
|
1350
1349
|
|
|
1351
1350
|
def bulk_insert_mappings(
|
|
1352
1351
|
self,
|
|
1353
|
-
mapper:
|
|
1352
|
+
mapper: _EntityBindKey[Any],
|
|
1354
1353
|
mappings: Iterable[Dict[str, Any]],
|
|
1355
1354
|
return_defaults: bool = False,
|
|
1356
1355
|
render_nulls: bool = False,
|
|
@@ -1436,7 +1435,7 @@ class scoped_session(Generic[_S]):
|
|
|
1436
1435
|
)
|
|
1437
1436
|
|
|
1438
1437
|
def bulk_update_mappings(
|
|
1439
|
-
self, mapper:
|
|
1438
|
+
self, mapper: _EntityBindKey[Any], mappings: Iterable[Dict[str, Any]]
|
|
1440
1439
|
) -> None:
|
|
1441
1440
|
r"""Perform a bulk update of the given list of mapping dictionaries.
|
|
1442
1441
|
|
sqlalchemy/orm/session.py
CHANGED
|
@@ -1301,7 +1301,8 @@ class SessionTransaction(_StateChange, TransactionalContext):
|
|
|
1301
1301
|
cast("TwoPhaseTransaction", t[1]).prepare()
|
|
1302
1302
|
except:
|
|
1303
1303
|
with util.safe_reraise():
|
|
1304
|
-
self.
|
|
1304
|
+
with self._expect_state(SessionTransactionState.CLOSED):
|
|
1305
|
+
self.rollback()
|
|
1305
1306
|
|
|
1306
1307
|
self._state = SessionTransactionState.PREPARED
|
|
1307
1308
|
|
|
@@ -4594,7 +4595,7 @@ class Session(_SessionClassMethods, EventTarget):
|
|
|
4594
4595
|
|
|
4595
4596
|
def bulk_insert_mappings(
|
|
4596
4597
|
self,
|
|
4597
|
-
mapper:
|
|
4598
|
+
mapper: _EntityBindKey[Any],
|
|
4598
4599
|
mappings: Iterable[Dict[str, Any]],
|
|
4599
4600
|
return_defaults: bool = False,
|
|
4600
4601
|
render_nulls: bool = False,
|
|
@@ -4676,7 +4677,7 @@ class Session(_SessionClassMethods, EventTarget):
|
|
|
4676
4677
|
)
|
|
4677
4678
|
|
|
4678
4679
|
def bulk_update_mappings(
|
|
4679
|
-
self, mapper:
|
|
4680
|
+
self, mapper: _EntityBindKey[Any], mappings: Iterable[Dict[str, Any]]
|
|
4680
4681
|
) -> None:
|
|
4681
4682
|
"""Perform a bulk update of the given list of mapping dictionaries.
|
|
4682
4683
|
|
|
@@ -4725,7 +4726,7 @@ class Session(_SessionClassMethods, EventTarget):
|
|
|
4725
4726
|
|
|
4726
4727
|
def _bulk_save_mappings(
|
|
4727
4728
|
self,
|
|
4728
|
-
mapper:
|
|
4729
|
+
mapper: _EntityBindKey[_O],
|
|
4729
4730
|
mappings: Union[Iterable[InstanceState[_O]], Iterable[Dict[str, Any]]],
|
|
4730
4731
|
*,
|
|
4731
4732
|
isupdate: bool,
|
sqlalchemy/orm/strategies.py
CHANGED
sqlalchemy/sql/elements.py
CHANGED
|
@@ -5267,9 +5267,8 @@ class quoted_name(util.MemoizedSlots, str):
|
|
|
5267
5267
|
:class:`_schema.Table`, :class:`_schema.Column`, and others.
|
|
5268
5268
|
The class can also be
|
|
5269
5269
|
passed explicitly as the name to any function that receives a name which
|
|
5270
|
-
can be quoted
|
|
5271
|
-
|
|
5272
|
-
an unconditionally quoted name::
|
|
5270
|
+
can be quoted, such as :meth:`.Inspector.has_table` with an
|
|
5271
|
+
unconditionally quoted name::
|
|
5273
5272
|
|
|
5274
5273
|
from sqlalchemy import create_engine
|
|
5275
5274
|
from sqlalchemy import inspect
|
|
@@ -5282,6 +5281,11 @@ class quoted_name(util.MemoizedSlots, str):
|
|
|
5282
5281
|
backend, passing the name exactly as ``"some_table"`` without converting to
|
|
5283
5282
|
upper case.
|
|
5284
5283
|
|
|
5284
|
+
A :class:`.quoted_name` object with ``quote=False`` may be passed to APIs
|
|
5285
|
+
that apply automatic quoting in order to keep the given name unquoted,
|
|
5286
|
+
such as when a PostgreSQL ``INHERITS`` option refers to a schema-qualified
|
|
5287
|
+
table name like ``my_schema.some_table``.
|
|
5288
|
+
|
|
5285
5289
|
.. versionchanged:: 1.2 The :class:`.quoted_name` construct is now
|
|
5286
5290
|
importable from ``sqlalchemy.sql``, in addition to the previous
|
|
5287
5291
|
location of ``sqlalchemy.sql.elements``.
|
sqlalchemy/sql/lambdas.py
CHANGED
sqlalchemy/sql/selectable.py
CHANGED
|
@@ -4956,42 +4956,28 @@ class SelectState(util.MemoizedSlots, CompileState):
|
|
|
4956
4956
|
if self.statement._correlate:
|
|
4957
4957
|
to_correlate = self.statement._correlate
|
|
4958
4958
|
if to_correlate:
|
|
4959
|
-
|
|
4960
|
-
f
|
|
4961
|
-
for f in froms
|
|
4962
|
-
if f
|
|
4963
|
-
not in _cloned_intersection(
|
|
4964
|
-
_cloned_intersection(
|
|
4965
|
-
froms, explicit_correlate_froms or ()
|
|
4966
|
-
),
|
|
4967
|
-
to_correlate,
|
|
4968
|
-
)
|
|
4969
|
-
]
|
|
4970
|
-
|
|
4971
|
-
if self.statement._correlate_except is not None:
|
|
4972
|
-
froms = [
|
|
4973
|
-
f
|
|
4974
|
-
for f in froms
|
|
4975
|
-
if f
|
|
4976
|
-
not in _cloned_difference(
|
|
4959
|
+
to_remove = _cloned_intersection(
|
|
4977
4960
|
_cloned_intersection(
|
|
4978
4961
|
froms, explicit_correlate_froms or ()
|
|
4979
4962
|
),
|
|
4980
|
-
|
|
4963
|
+
to_correlate,
|
|
4981
4964
|
)
|
|
4982
|
-
|
|
4965
|
+
froms = [f for f in froms if f not in to_remove]
|
|
4966
|
+
|
|
4967
|
+
if self.statement._correlate_except is not None:
|
|
4968
|
+
to_remove = _cloned_difference(
|
|
4969
|
+
_cloned_intersection(froms, explicit_correlate_froms or ()),
|
|
4970
|
+
self.statement._correlate_except,
|
|
4971
|
+
)
|
|
4972
|
+
froms = [f for f in froms if f not in to_remove]
|
|
4983
4973
|
|
|
4984
4974
|
if (
|
|
4985
4975
|
self.statement._auto_correlate
|
|
4986
4976
|
and implicit_correlate_froms
|
|
4987
4977
|
and len(froms) > 1
|
|
4988
4978
|
):
|
|
4989
|
-
|
|
4990
|
-
|
|
4991
|
-
for f in froms
|
|
4992
|
-
if f
|
|
4993
|
-
not in _cloned_intersection(froms, implicit_correlate_froms)
|
|
4994
|
-
]
|
|
4979
|
+
to_remove = _cloned_intersection(froms, implicit_correlate_froms)
|
|
4980
|
+
froms = [f for f in froms if f not in to_remove]
|
|
4995
4981
|
|
|
4996
4982
|
if not len(froms):
|
|
4997
4983
|
raise exc.InvalidRequestError(
|
|
@@ -9,6 +9,9 @@
|
|
|
9
9
|
|
|
10
10
|
from __future__ import annotations
|
|
11
11
|
|
|
12
|
+
from collections.abc import Callable
|
|
13
|
+
from collections.abc import Sequence
|
|
14
|
+
|
|
12
15
|
import sqlalchemy as sa
|
|
13
16
|
from .. import assertions
|
|
14
17
|
from .. import config
|
|
@@ -28,23 +31,25 @@ from ...orm import registry
|
|
|
28
31
|
@config.mark_base_test_class()
|
|
29
32
|
class TestBase:
|
|
30
33
|
# A sequence of requirement names matching testing.requires decorators
|
|
31
|
-
__requires__ = ()
|
|
34
|
+
__requires__: tuple[str, ...] = ()
|
|
32
35
|
|
|
33
36
|
# A sequence of dialect names to exclude from the test class.
|
|
34
|
-
__unsupported_on__ = ()
|
|
37
|
+
__unsupported_on__: tuple[str, ...] = ()
|
|
35
38
|
|
|
36
39
|
# If present, test class is only runnable for the *single* specified
|
|
37
40
|
# dialect. If you need multiple, use __unsupported_on__ and invert.
|
|
38
|
-
__only_on__ = None
|
|
41
|
+
__only_on__: tuple[str, ...] | str | None = None
|
|
39
42
|
|
|
40
43
|
# A sequence of no-arg callables. If any are True, the entire testcase is
|
|
41
44
|
# skipped.
|
|
42
|
-
__skip_if__ = None
|
|
45
|
+
__skip_if__: Sequence[Callable[[], bool]] | None = None
|
|
43
46
|
|
|
44
47
|
# if True, the testing reaper will not attempt to touch connection
|
|
45
48
|
# state after a test is completed and before the outer teardown
|
|
46
49
|
# starts
|
|
47
|
-
__leave_connections_for_teardown__ = False
|
|
50
|
+
__leave_connections_for_teardown__: bool = False
|
|
51
|
+
|
|
52
|
+
__backend__: bool
|
|
48
53
|
|
|
49
54
|
def assert_(self, val, msg=None):
|
|
50
55
|
assert val, msg
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
sqlalchemy/__init__.py,sha256=
|
|
1
|
+
sqlalchemy/__init__.py,sha256=WFqPWssZD8l4n0vPghuLU631e7wnNE9SvPj2vOyq1aU,12659
|
|
2
2
|
sqlalchemy/events.py,sha256=vEDW04X_PMhMw5y0_95tbEzht3wua8_gnkMBJstYNRw,525
|
|
3
3
|
sqlalchemy/exc.py,sha256=JVVIizdjrbZYKA3poXDMSY5qDxTW8hwJzU_ZWx05LYc,23979
|
|
4
4
|
sqlalchemy/inspection.py,sha256=Rqw5kFWLY5MH3pr0j2f3OQGZca3aFR-NOaL2sRGuBBo,5064
|
|
@@ -56,13 +56,13 @@ sqlalchemy/dialects/oracle/provision.py,sha256=htp6jQ17KTcnYnPQpeOnE0SQeyyg5DlsK
|
|
|
56
56
|
sqlalchemy/dialects/oracle/types.py,sha256=ArWTqkop5usdj9aCp9o0xTUOUiCn1yqwcjYd0fR5zEA,9058
|
|
57
57
|
sqlalchemy/dialects/oracle/vector.py,sha256=NbZL8IfduFWBjBgRplNL5Qy6kyKMO0QnQ7M3NP-PtdY,10815
|
|
58
58
|
sqlalchemy/dialects/postgresql/__init__.py,sha256=Nai79gxCtxM05bqCv4HT8PxN9tIedFse2g2k0G8Kj_o,3891
|
|
59
|
-
sqlalchemy/dialects/postgresql/_psycopg_common.py,sha256=
|
|
59
|
+
sqlalchemy/dialects/postgresql/_psycopg_common.py,sha256=1_Vb8JXRlNcCYoQn2Vgq6afvDiR6RJ77alGZUZEUbi8,6965
|
|
60
60
|
sqlalchemy/dialects/postgresql/array.py,sha256=cz42HV28g_VbH1Nt4TnEeU1GUS8uSCbTqU2CNJ4qDfg,17279
|
|
61
61
|
sqlalchemy/dialects/postgresql/asyncpg.py,sha256=xXhN0OJiiSy9C6bK4tr2mzFSA3FSralWGan7EPbxK9o,41050
|
|
62
|
-
sqlalchemy/dialects/postgresql/base.py,sha256=
|
|
62
|
+
sqlalchemy/dialects/postgresql/base.py,sha256=M1g6Waogdim-ObO6xQew4hFbSWecbc9lQGMrJ0Pl0bI,193208
|
|
63
63
|
sqlalchemy/dialects/postgresql/dml.py,sha256=kAnq3ZC-WBLgZTd0FQyKMkmmam7hxdw5Yxs-Um2j98A,12125
|
|
64
64
|
sqlalchemy/dialects/postgresql/ext.py,sha256=bh3FeNNZkPABqX7caCSzP_iNGNRL-gOLJsdeBiQpERs,17695
|
|
65
|
-
sqlalchemy/dialects/postgresql/hstore.py,sha256=
|
|
65
|
+
sqlalchemy/dialects/postgresql/hstore.py,sha256=jt2t4HDMCbmR_AW3JjkOF_Ip-4EQZ_nvi0w6F5dmMsY,11933
|
|
66
66
|
sqlalchemy/dialects/postgresql/json.py,sha256=fWihCjHxwAwCrSElIb__iueVxLvs9_hsqYDs2ox5NLw,14629
|
|
67
67
|
sqlalchemy/dialects/postgresql/named_types.py,sha256=_i435mLsrF9EEJyLxBihQsjWktXKkKnNCrkCWpjy03M,17812
|
|
68
68
|
sqlalchemy/dialects/postgresql/operators.py,sha256=Pn8yN0CllvTfKUWZrw1PQqP7CXOTPIsV32L6LfGW9pk,2807
|
|
@@ -80,7 +80,7 @@ sqlalchemy/dialects/sqlite/base.py,sha256=WLwH9OFrQ2f5ySeYN6e-S8DGOar9COSGVPJn3Y
|
|
|
80
80
|
sqlalchemy/dialects/sqlite/dml.py,sha256=b4pV3f_7JMm2ZxuW906YQI7YcZiyHOYxqRKPge0cMaM,9138
|
|
81
81
|
sqlalchemy/dialects/sqlite/json.py,sha256=PuBnoOMcUcV0MUiXgC3mXCCv_iiglRhmX3ZUT3NiUx0,2777
|
|
82
82
|
sqlalchemy/dialects/sqlite/provision.py,sha256=0DEDRGGOrnie09Ub0TPUZjN_490WfBK_PXvHiMfJ8cw,6710
|
|
83
|
-
sqlalchemy/dialects/sqlite/pysqlcipher.py,sha256=
|
|
83
|
+
sqlalchemy/dialects/sqlite/pysqlcipher.py,sha256=eM5MfS7SfjV8xU5a_H9u5BYNTJOsoY62dH5N7mr9y7o,5481
|
|
84
84
|
sqlalchemy/dialects/sqlite/pysqlite.py,sha256=w8il5ElXHYw1AZgakAKYQeYIXppuYv9yTgpby1MU5hs,27792
|
|
85
85
|
sqlalchemy/engine/__init__.py,sha256=Nn05AJVAfZn_sToGjt09vBcZET343-wYwl-oo2Fg6R8,2818
|
|
86
86
|
sqlalchemy/engine/_py_processors.py,sha256=9vtsn7jB3QNIt3WQPOP4YjGbOEzGJUwnF_aj3eJxmxI,3743
|
|
@@ -89,14 +89,14 @@ sqlalchemy/engine/_py_util.py,sha256=SIoKkVUjOF2U7Obrg0aTZNORfsHyzPhX3u7is14JAp4
|
|
|
89
89
|
sqlalchemy/engine/base.py,sha256=U_OOVEAE0ymsOOJDEEv0u7r30PDOyr0RKxkjt43eVhQ,123864
|
|
90
90
|
sqlalchemy/engine/characteristics.py,sha256=wRg6uE8NYSH38wvp0CMY2U5hv9u3VTOkTHyJeXYrkvQ,4765
|
|
91
91
|
sqlalchemy/engine/create.py,sha256=SdhAoQYPRvfJlOIC8sQ7S3FbNOO9Na_hAGszSswouXI,34177
|
|
92
|
-
sqlalchemy/engine/cursor.py,sha256=
|
|
92
|
+
sqlalchemy/engine/cursor.py,sha256=3a0INyP8CVW7hgumjsmR9s6_Ss_B46EizGorRrpnRbs,81094
|
|
93
93
|
sqlalchemy/engine/default.py,sha256=Q4hs3lW8bsHaIjogMZyBH41GqBKCxgRVaR3yy2MqDC8,85896
|
|
94
94
|
sqlalchemy/engine/events.py,sha256=1MAJj-D5dxHBhTXZYnbxY8AViItRtjm-GExTrXN-nrY,37400
|
|
95
95
|
sqlalchemy/engine/interfaces.py,sha256=hH3s2yyQU1O1jH19f9xWYRkwoedE-ezcK7ozMtbUCOs,115384
|
|
96
96
|
sqlalchemy/engine/mock.py,sha256=i9J-z0NsL78VlqC85MRgo5SNNQU256UtEqficO3DCwY,4155
|
|
97
97
|
sqlalchemy/engine/processors.py,sha256=Yw1UZVsyFf2MdFUrQKaTHOewFTZ0d6p_GlhBXDu250k,2380
|
|
98
98
|
sqlalchemy/engine/reflection.py,sha256=1xEJTCw1Pl27c_8DqWCn0_sx0-9VsA1YHo8y9k1AiY4,75566
|
|
99
|
-
sqlalchemy/engine/result.py,sha256=
|
|
99
|
+
sqlalchemy/engine/result.py,sha256=LbcBlmLK_AZD8yiSql5anC2eBqoZv-jKisWq0pU4wv4,80437
|
|
100
100
|
sqlalchemy/engine/row.py,sha256=sC91jITBoitEhjeQm36IS7KjGwiZJjiwCKzOFbxp5qo,12031
|
|
101
101
|
sqlalchemy/engine/strategies.py,sha256=EUOp1y78tDlpbC2J9XJnyDMH-lVjusFBx_39zCh1khE,439
|
|
102
102
|
sqlalchemy/engine/url.py,sha256=JsrXOwip3933VuYh0OObHfLk2okV2rgqEP8S7saccSg,31067
|
|
@@ -165,11 +165,11 @@ sqlalchemy/orm/persistence.py,sha256=3WLjhe9ws8C8D6lJcIV2jAOjNBj2I8wCQzmA1iSfnC8
|
|
|
165
165
|
sqlalchemy/orm/properties.py,sha256=nNAKPeU7Wf0UhltZet_ieyBgsZbE6A12ddomoKVq_R8,31197
|
|
166
166
|
sqlalchemy/orm/query.py,sha256=-7egf1GSUanKb7WRWpgmU-OMM0-3hG2SL579IuL2Gpc,119040
|
|
167
167
|
sqlalchemy/orm/relationships.py,sha256=tsk4GWWPGFG9cZ9f9mQ_ZrxJHhGJ3WDKx2n-_ijHYaU,129216
|
|
168
|
-
sqlalchemy/orm/scoping.py,sha256=
|
|
169
|
-
sqlalchemy/orm/session.py,sha256=
|
|
168
|
+
sqlalchemy/orm/scoping.py,sha256=ADOKdjFkryTknwaw00C3cVs6VM_cOrRT30I6qARknDQ,78108
|
|
169
|
+
sqlalchemy/orm/session.py,sha256=t1pOQn9FPC6vGfBNh_ZsLaZEaYoU87EYgPVqc-Kgdg0,196575
|
|
170
170
|
sqlalchemy/orm/state.py,sha256=YS0voN_ffj7hg7dqklGdvNMGwEILKo1tXv725OIW9mU,38433
|
|
171
171
|
sqlalchemy/orm/state_changes.py,sha256=zMhwxbQNVlcRmK7YwaPsYsxN4uhJkw4Mmg_snftAGDg,6816
|
|
172
|
-
sqlalchemy/orm/strategies.py,sha256=
|
|
172
|
+
sqlalchemy/orm/strategies.py,sha256=Fi8xlz8KtDyUWAsTSnfsWCyxGmZGcF-4wTAQYyHCiTw,120414
|
|
173
173
|
sqlalchemy/orm/strategy_options.py,sha256=XW1Q-n4oXyvAheeppMiOyz9hRKb8UzKYKRGI2f1ChuQ,86331
|
|
174
174
|
sqlalchemy/orm/sync.py,sha256=3ycmsWAHK4zwUfvfXj2e4v58MzmQ9KULWy4awoGzoMI,5779
|
|
175
175
|
sqlalchemy/orm/unitofwork.py,sha256=wjVo-pQBtx93p4awjkdKpbfWG5ENz-k-VtpkFejcJho,27028
|
|
@@ -195,16 +195,16 @@ sqlalchemy/sql/crud.py,sha256=nCFEdYyodH995HawyqFaIltIe2r3KKYAF9RrXgkw8WU,59880
|
|
|
195
195
|
sqlalchemy/sql/ddl.py,sha256=fJabeoCAj3Yc6RrmaiGBUiSnKG0xZe7eWZs5QgtJ2LI,47994
|
|
196
196
|
sqlalchemy/sql/default_comparator.py,sha256=jaxd49IC1flS349qPZ2ZcJhHl1ayA-BuWq52B4RaJew,16706
|
|
197
197
|
sqlalchemy/sql/dml.py,sha256=TcHQV2JOZm0vRlfTM2qsF5cb4i_CITs_ob8alkGK38Q,66719
|
|
198
|
-
sqlalchemy/sql/elements.py,sha256=
|
|
198
|
+
sqlalchemy/sql/elements.py,sha256=KoVIDYefgz5t-G1WMAKOBMGw6Dtio1FJC2s7bDIrq4E,179896
|
|
199
199
|
sqlalchemy/sql/events.py,sha256=xpqx3irkG8N3gysXAViLCqXXke9KCSU-6w4zZUdYXzw,18312
|
|
200
200
|
sqlalchemy/sql/expression.py,sha256=ExolOUyIJ90eBZGpp0G5w29TXhJ0Vf4qyrKA-rKe9VU,7582
|
|
201
201
|
sqlalchemy/sql/functions.py,sha256=Ws1jaG07G2zETpmJzyaMk24CDWMEXe1JRReTkY9J3p4,68652
|
|
202
|
-
sqlalchemy/sql/lambdas.py,sha256=
|
|
202
|
+
sqlalchemy/sql/lambdas.py,sha256=IiBq804zFJsne6eUsm9IjQNu_Ctl_xQjMHU5c9BjpRE,49391
|
|
203
203
|
sqlalchemy/sql/naming.py,sha256=w62T2yj6pafLNRe7SDUsutklHSYgIabXj2UtnaCJRSM,6855
|
|
204
204
|
sqlalchemy/sql/operators.py,sha256=7h8oPww8gIzqyhizpiW-iyVNSFCEWUouGyMlhG1kXac,76792
|
|
205
205
|
sqlalchemy/sql/roles.py,sha256=9KrnEd1mt5_Lm8G--7uKCKHVdrW3Pks3ZXSacQ79DQE,7662
|
|
206
206
|
sqlalchemy/sql/schema.py,sha256=7kALq-4m2crK05yXzN5r_AMise-UbTBQnrWOx51Ij_Q,230558
|
|
207
|
-
sqlalchemy/sql/selectable.py,sha256=
|
|
207
|
+
sqlalchemy/sql/selectable.py,sha256=k4kdbZHIYwSBPDMe8XvvcpHzktcJUAv6mYm6CDue5RU,244137
|
|
208
208
|
sqlalchemy/sql/sqltypes.py,sha256=wKIkOFMRKStdFDVojZEu2tM8Ryz10Ioo0GcWFyYCQe0,132159
|
|
209
209
|
sqlalchemy/sql/traversals.py,sha256=nN1MDmqxKQA5WHAolJfLbDylSCkugu0D44iFLKoiFdc,33663
|
|
210
210
|
sqlalchemy/sql/type_api.py,sha256=qTKPD0U6M33SMexwFMNHYh5K7urESfUmHuWopCtWqGA,85425
|
|
@@ -226,7 +226,7 @@ sqlalchemy/testing/schema.py,sha256=49x-TXARL2k8oIiaSzyGxXG5fh7vJOuBoUv5h9YTfKo,
|
|
|
226
226
|
sqlalchemy/testing/util.py,sha256=bXP2dAQSH1Cn6J0x5uheODsHk7SQmzuiT5XTGNs7W3c,14525
|
|
227
227
|
sqlalchemy/testing/warnings.py,sha256=j8GWiP-yraCW0Ig5iJxAa5ekN82ZWqcQWyR-BUb4MZA,1546
|
|
228
228
|
sqlalchemy/testing/fixtures/__init__.py,sha256=Hd_6mk0OFkPpH1MVMvK0rY4kyG82JfIIwm8HSR_IZrQ,1198
|
|
229
|
-
sqlalchemy/testing/fixtures/base.py,sha256=
|
|
229
|
+
sqlalchemy/testing/fixtures/base.py,sha256=7loNJHers5iVTaL7h143ttDyHzGK8wKI7UXU7erZu8c,12817
|
|
230
230
|
sqlalchemy/testing/fixtures/mypy.py,sha256=H5PlaLXSXFozu0cz01M4URMD4WaTdIrM2SirGw75SAA,12886
|
|
231
231
|
sqlalchemy/testing/fixtures/orm.py,sha256=_vMxIRSuCmOnBcqV2xwqUWjFp1YwMcgQQsDaxsDM3xg,6095
|
|
232
232
|
sqlalchemy/testing/fixtures/sql.py,sha256=JmgD0leWLEYaXBWEcVoMfcGermZeEmWHRwTYB3XOmRg,15074
|
|
@@ -262,8 +262,8 @@ sqlalchemy/util/queue.py,sha256=GFVZYmWf86ejTQwSatw7UOhDYNKGzIFtTDBU0TanPF8,1018
|
|
|
262
262
|
sqlalchemy/util/tool_support.py,sha256=iZSwvKdF5pA8UtXuwbtln6dEDgerKJWasELSi7q6Epw,6136
|
|
263
263
|
sqlalchemy/util/topological.py,sha256=yMpaA2s0JYIekQF4XKwzJzy8lVo-8yeo8o1J2xzxq48,3451
|
|
264
264
|
sqlalchemy/util/typing.py,sha256=4kisI5OYrctF2_oVZQ1ZYWICMnrqJw-TBhPvPflxZco,22517
|
|
265
|
-
sqlalchemy-2.0.
|
|
266
|
-
sqlalchemy-2.0.
|
|
267
|
-
sqlalchemy-2.0.
|
|
268
|
-
sqlalchemy-2.0.
|
|
269
|
-
sqlalchemy-2.0.
|
|
265
|
+
sqlalchemy-2.0.51.dist-info/licenses/LICENSE,sha256=6GK7W5BPtVE8PhQojXoloS6w7MeEegqWXTEOmpVefLk,1100
|
|
266
|
+
sqlalchemy-2.0.51.dist-info/METADATA,sha256=b-pF5X3FtbHErXvtaKLMoIlbZtO-ao98RR060J6Td3Y,9547
|
|
267
|
+
sqlalchemy-2.0.51.dist-info/WHEEL,sha256=aeYiig01lYGDzBgS8HxWXOg3uV61G9ijOsup-k9o1sk,91
|
|
268
|
+
sqlalchemy-2.0.51.dist-info/top_level.txt,sha256=rp-ZgB7D8G11ivXON5VGPjupT1voYmWqkciDt5Uaw_Q,11
|
|
269
|
+
sqlalchemy-2.0.51.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|
|
File without changes
|