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 CHANGED
@@ -269,7 +269,7 @@ from .types import Uuid as Uuid
269
269
  from .types import VARBINARY as VARBINARY
270
270
  from .types import VARCHAR as VARCHAR
271
271
 
272
- __version__ = "2.0.50"
272
+ __version__ = "2.0.51"
273
273
 
274
274
 
275
275
  def __go(lcls: Any) -> None:
@@ -222,4 +222,4 @@ class _PGDialect_common_psycopg(PGDialect):
222
222
  )
223
223
 
224
224
  def do_recover_twophase(self, connection):
225
- return [row[1] for row in connection.connection.tpc_recover()]
225
+ return [str(row) for row in connection.connection.tpc_recover()]
@@ -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'").bindparams(
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> (\\ . | [^"])* )" # Quoted 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> (\\ . | [^"])* )" # Quoted 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:
@@ -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(
@@ -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: Mapper[Any],
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: Mapper[Any], mappings: Iterable[Dict[str, Any]]
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.rollback()
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: Mapper[Any],
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: Mapper[Any], mappings: Iterable[Dict[str, Any]]
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: Mapper[_O],
4729
+ mapper: _EntityBindKey[_O],
4729
4730
  mappings: Union[Iterable[InstanceState[_O]], Iterable[Dict[str, Any]]],
4730
4731
  *,
4731
4732
  isupdate: bool,
@@ -1746,7 +1746,7 @@ class SubqueryLoader(PostLoader):
1746
1746
  if loadopt and loadopt._extra_criteria:
1747
1747
  new_options += (
1748
1748
  orm_util.LoaderCriteriaOption(
1749
- self.entity,
1749
+ effective_entity,
1750
1750
  loadopt._generate_extra_criteria(context),
1751
1751
  ),
1752
1752
  )
@@ -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. Such as to use the :meth:`_engine.Engine.has_table`
5271
- method with
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
@@ -313,7 +313,7 @@ class LambdaElement(elements.ClauseElement):
313
313
  return rec
314
314
 
315
315
  def __getattr__(self, key):
316
- return getattr(self._rec.expected_expr, key)
316
+ return getattr(self._resolved, key)
317
317
 
318
318
  @property
319
319
  def _is_sequence(self):
@@ -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
- froms = [
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
- self.statement._correlate_except,
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
- froms = [
4990
- f
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,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: SQLAlchemy
3
- Version: 2.0.50
3
+ Version: 2.0.51
4
4
  Summary: Database Abstraction Library
5
5
  Home-page: https://www.sqlalchemy.org
6
6
  Author: Mike Bayer
@@ -1,4 +1,4 @@
1
- sqlalchemy/__init__.py,sha256=dYJIJLTQXxtM9zji01VQDrEJcXiU6usDSYIEcNL-STI,12659
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=t-GbFdJOMbwb4nFKwPsOEuKcQ3bc9OTnlMCbEXIvWEU,6963
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=Npl0SCDedVoN0STSwodkE257w0ZQuLwuv5OrajqjVvc,192830
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=in6YyKcRCUi3taTXCVje25P2yPkACAQIfdcDvelF1wg,11933
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=Y_1Zfri5r3tGzQe9put74hvnMSAD55Vy2XB2CiIIlWk,5514
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=qDC49j-Qbx23-J4N2e9NrRbFxiymOI_gPzJH_oYh5dA,80876
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=HXziOSGMTGKkD2RlTyvOCkCeSlktiql7M9f4c2VOKj0,79427
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=0dibgN30cW1LOgVS6MJmjxZHdNdCC1s00qiaAAzQGqE,78123
169
- sqlalchemy/orm/session.py,sha256=sS218bxAVui-I5qVV7ASTBNqit3ROaOj784WaMAy-9M,196470
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=nHF9BgDgYAeDG3d7NeWiGIWxD-hNfrIO-HaLbYf2O9Q,120409
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=1Izu1nDuqAD-a_Z7YKHQ8ba21get0m5h80DzHU7rW2Q,179644
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=SR2H8YGqr4VxQiheHMZbuj1eWB_eFbgAOVrDk6QXyh8,49400
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=1mJBLw6AIgvWN9JsaWlAr-0IYOsNCKia5_clnzkN4AU,244363
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=uVwEK26dwLf4nx9cgYP0VQ2NwyxIxVJmaNsVoAW_PBY,12612
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.50.dist-info/licenses/LICENSE,sha256=6GK7W5BPtVE8PhQojXoloS6w7MeEegqWXTEOmpVefLk,1100
266
- sqlalchemy-2.0.50.dist-info/METADATA,sha256=MdTTipM7HdTztfXQOi-Dq5AP_MAR-8-uf9tIOGAQnkM,9547
267
- sqlalchemy-2.0.50.dist-info/WHEEL,sha256=aeYiig01lYGDzBgS8HxWXOg3uV61G9ijOsup-k9o1sk,91
268
- sqlalchemy-2.0.50.dist-info/top_level.txt,sha256=rp-ZgB7D8G11ivXON5VGPjupT1voYmWqkciDt5Uaw_Q,11
269
- sqlalchemy-2.0.50.dist-info/RECORD,,
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,,