summaryrefslogtreecommitdiff
Commit message (Collapse)AuthorAgeFilesLines
...
| * Fix positional compiling bugsFederico Caselli2022-12-0112-97/+572
| | | | | | | | | | | | | | | | | | | | | | Fixed a series of issues regarding positionally rendered bound parameters, such as those used for SQLite, asyncpg, MySQL and others. Some compiled forms would not maintain the order of parameters correctly, such as the PostgreSQL ``regexp_replace()`` function as well as within the "nesting" feature of the :class:`.CTE` construct first introduced in :ticket:`4123`. Fixes: #8827 Change-Id: I9813ed7c358cc5c1e26725c48df546b209a442cb
* | Merge "disable setinputsizes only for true DBAPI executemany" into mainmike bayer2022-12-023-62/+90
|\ \
| * | disable setinputsizes only for true DBAPI executemanyMike Bayer2022-12-013-62/+90
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Fixed regression caused by the combination of :ticket:`8177`, re-enable setinputsizes for SQL server unless fast_executemany + DBAPI executemany is used for a statement, along with :ticket:`6047`, implement "insertmanyvalues", which bypasses DBAPI executemany in place of a custom DBAPI execute for INSERT statements. setinputsizes would incorrectly not be used for a multiple parameter-set INSERT statement that used "insertmanyvalues" if fast_executemany were turned on, as the check would incorrectly assume this is a DBAPI executemany call. The "regression" would then be that the "insertmanyvalues" statement format is apparently slightly more sensitive to multiple rows that don't use the same types for each row, so in such a case setinputsizes is especially needed. The fix repairs the fast_executemany check so that it only disables setinputsizes if true DBAPI executemany is to be used. Fixes: #8917 Change-Id: I78895606a99848d4f92ecf38ded92dc5d6d48c6f
* | | Merge "add new pattern for single inh column override" into mainmike bayer2022-12-0110-117/+294
|\ \ \ | |/ / |/| |
| * | add new pattern for single inh column overrideMike Bayer2022-11-3010-117/+294
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Added a new parameter :paramref:`_orm.mapped_column.use_existing_column` to accommodate the use case of a single-table inheritance mapping that uses the pattern of more than one subclass indicating the same column to take place on the superclass. This pattern was previously possible by using :func:`_orm.declared_attr` in conjunction with locating the existing column in the ``.__table__`` of the superclass, however is now updated to work with :func:`_orm.mapped_column` as well as with pep-484 typing, in a simple and succinct way. Fixes: #8822 Change-Id: I2296a4a775da976c642c86567852cdc792610eaf
* | | get aiosqlite to run on python 3 but not 3.11, attempt 2Mike Bayer2022-11-301-11/+5
| | | | | | | | | | | | Change-Id: Iee0077f8c662da59ee63fa73296cb04ab1b09551
* | | use python 3.11 current, dont use aiosqlite on py311Mike Bayer2022-11-301-3/+13
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Py 3.11 is released so I assume we can remove "rc" qualifiers here aiosqlite is causing python 3.11 crashes, so I assume this is due to https://github.com/python/cpython/issues/99205. I'm only guessing the syntax here, so there may be subsequent commits if this doesnt work Change-Id: I6f2ead3e0aca933a972efadf3891edbcdd83501c
* | | Merge "[sqlite] Reflect DEFERRABLE and INITIALLY options for foreign keys" ↵mike bayer2022-11-303-1/+77
|\ \ \ | | | | | | | | | | | | into main
| * | | [sqlite] Reflect DEFERRABLE and INITIALLY options for foreign keysMichael Gorven2022-11-303-1/+77
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Added support for the SQLite backend to reflect the "DEFERRABLE" and "INITIALLY" keywords which may be present on a foreign key construct. Pull request courtesy Michael Gorven. Fixes: #8903 Closes: #8904 Pull-request: https://github.com/sqlalchemy/sqlalchemy/pull/8904 Pull-request-sha: 52aa4cf77482c4051899e21bea75b9830e4c3efa Change-Id: I713906db1a458d8f1be39625841ca3bbc03ec835
* | | | Add "compare" on dataclass fieldsSimon Schiele2022-11-305-25/+100
| |_|/ |/| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Added :paramref:`_orm.mapped_column.compare` parameter to relevant ORM attribute constructs including :func:`_orm.mapped_column`, :func:`_orm.relationship` etc. to provide for the Python dataclasses ``compare`` parameter on ``field()``, when using the :ref:`orm_declarative_native_dataclasses` feature. Pull request courtesy Simon Schiele. Added an additional case for associationproxy into test_dc_transforms.py -> test_attribute_options Fixes: #8905 Closes: #8906 Pull-request: https://github.com/sqlalchemy/sqlalchemy/pull/8906 Pull-request-sha: ea9a53d2ca60befdd0c570013c0e57a78c11dd4a Change-Id: I390d043b06c1d668242325ef86e2f7b7dbfac442
* | | Merge "Improve support for enum in mapped classes" into mainmike bayer2022-11-3010-10/+666
|\ \ \ | |_|/ |/| |
| * | Improve support for enum in mapped classesFederico Caselli2022-11-2910-10/+666
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Add a new system by which TypeEngine objects have some say in how the declarative type registry interprets them. The Enum datatype is the primary target for this but it is hoped the system may be useful for other types as well. Fixes: #8859 Change-Id: I15ac3daee770408b5795746f47c1bbd931b7d26d
* | | Merge "annotated / DC forms for association proxy" into mainmike bayer2022-11-3013-312/+800
|\ \ \ | |_|/ |/| |
| * | annotated / DC forms for association proxyMike Bayer2022-11-2913-312/+800
| |/ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Added support for the :func:`.association_proxy` extension function to take part within Python ``dataclasses`` configuration, when using the native dataclasses feature described at :ref:`orm_declarative_native_dataclasses`. Included are attribute-level arguments including :paramref:`.association_proxy.init` and :paramref:`.association_proxy.default_factory`. Documentation for association proxy has also been updated to use "Annotated Declarative Table" forms within examples, including type annotations used for :class:`.AssocationProxy` itself. Also modernized documentation examples in sqlalchemy.ext.mutable, which was not up to date even for 1.4 style code. Corrected typing for relationship(secondary) where "secondary" accepts a callable (i.e. lambda) as well Fixes: #8878 Fixes: #8876 Fixes: #8880 Change-Id: Ibd4f3591155a89f915713393e103e61cc072ed57
* | Merge "Add value-level hooks for SQL type detection; apply to Range" into mainmike bayer2022-11-295-0/+94
|\ \ | |/ |/|
| * Add value-level hooks for SQL type detection; apply to RangeLele Gaifax2022-11-295-0/+94
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Added additional type-detection for the new PostgreSQL :class:`_postgresql.Range` type, where previous cases that allowed the psycopg2-native range objects to be received directly by the DBAPI without SQLAlchemy intercepting them stopped working, as we now have our own value object. The :class:`_postgresql.Range` object has been enhanced such that SQLAlchemy Core detects it in otherwise ambiguous situations (such as comparison to dates) and applies appropriate bind handlers. Pull request courtesy Lele Gaifax. Fixes: #8884 Closes: #8886 Pull-request: https://github.com/sqlalchemy/sqlalchemy/pull/8886 Pull-request-sha: 6e95e08a30597d3735ab38f2f1a2ccabd968852c Change-Id: I3ca277c826dcf4b5644f44eb251345b439a84ee4
* | update for mypy 1.0 devFederico Caselli2022-11-2910-19/+33
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | As I need dmypy to work without facing [1], I am running the latest build of mypy which seems so far to finally not have that issue. update constructs that latest mypy is being more picky about, including better typing for the _NONE_NAME symbol used in constraints (porting those elements from the Enum patch at I15ac3daee770408b5795746f47c1bbd931b7d26d) [1] https://github.com/python/mypy/issues/12744 Change-Id: Ib3f56787fa65ea9bb2e6a0bccc4d99f54c516dad
* | Add PyAthena Dialect (#8898)Jason Myers2022-11-291-0/+3
| | | | | | | | | | * Add PyAthena Dialect * Changing order
* | Merge "add partial index predicate to SQLiteDialect.get_indexes() result" ↵mike bayer2022-11-294-2/+115
|\ \ | | | | | | | | | into main
| * | add partial index predicate to SQLiteDialect.get_indexes() resultTobias Pfeiffer2022-11-284-2/+115
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Added support for reflection of expression-oriented WHERE criteria included in indexes on the SQLite dialect, in a manner similar to that of the PostgreSQL dialect. Pull request courtesy Tobias Pfeiffer. Fixes: #8804 Closes: #8806 Pull-request: https://github.com/sqlalchemy/sqlalchemy/pull/8806 Pull-request-sha: 539dfcb372360911b69aed2a804698bb1a2220b1 Change-Id: I0e34d47dbe2b9c1da6fce531363084843e5127a3
* | | Merge "identify unresolvable Mapped types" into mainmike bayer2022-11-288-67/+182
|\ \ \
| * | | identify unresolvable Mapped typesMike Bayer2022-11-288-67/+182
| |/ / | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Fixed issue where use of an unknown datatype within a :class:`.Mapped` annotation for a column-based attribute would silently fail to map the attribute, rather than reporting an exception; an informative exception message is now raised. tighten up iteration of names on mapped classes to more fully exclude a large number of underscored names, so that we can avoid trying to look at annotations for them or anything else. centralize the "list of names we care about" more fully within _cls_attr_resolver and base it on underscore conventions we should usually ignore, with the exception of the few underscore names we want to see. Fixes: #8888 Change-Id: I3c0a1666579fe67b3c40cc74fa443b6f1de354ce
* | | Rectify PG Range.__bool__, inverting previous logicLele Gaifax2022-11-273-3/+13
|/ / | | | | | | | | | | | | | | | | | | The boolness of the range was defined to be equal to its emptiness. As this has been identified as a typo rather than the intended, this inverts the logic, to match common Python behaviour as well as how other popular PG drivers do. Closes: #8885 Pull-request: https://github.com/sqlalchemy/sqlalchemy/pull/8885 Pull-request-sha: 5670cdb920692a62f77b7b6ea312784033de83d9 Change-Id: I6f4a40168b2f037c578e84f7550370411bd42160
* | Merge "improve column targeting issues with query_expression" into mainmike bayer2022-11-275-3/+260
|\ \
| * | improve column targeting issues with query_expressionMike Bayer2022-11-255-3/+260
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Fixed issues in :func:`_orm.with_expression` where expressions that were composed of columns within a subquery being SELECTed from, or when using ``.from_statement()``, would not render correct SQL **if** the expression had a label name that matched the attribute which used :func:`_orm.query_expression`, even when :func:`_orm.query_expression` had no default expression. For the moment, if the :func:`_orm.query_expression` **does** have a default expression, that label name is still used for that default, and an additional label with the same name will be ignored. Overall, this case is pretty thorny so further adjustments might be warranted. Fixes: #8881 Change-Id: Ie939b1470cb2e824717384be65f4cd8edd619942
* | | Merge "Add recommendation for URL.create() re: escaping" into mainmike bayer2022-11-272-10/+64
|\ \ \ | |_|/ |/| |
| * | Add recommendation for URL.create() re: escapingGord Thompson2022-11-272-10/+64
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Let users know that URL.create() can build the whole connection URL instead of making them escape things like passwords ad-hoc. includes some general cleanup of URL docstring by mike Change-Id: Ic71bb0201fecf30e1db11e006c269f2d041b5439
* | | Implement ScalarValueFederico Caselli2022-11-2610-172/+292
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Added :class:`_expression.ScalarValues` that can be used as a column element allowing using :class:`_expression.Values` inside IN clauses or in conjunction with ``ANY`` or ``ALL`` collection aggregates. This new class is generated using the method :meth:`_expression.Values.scalar_values`. The :class:`_expression.Values` instance is now coerced to a :class:`_expression.ScalarValues` when used in a ``IN`` or ``NOT IN`` operation. Fixes: #6289 Change-Id: Iac22487ccb01553684b908e54d01c0687fa739f1
* | | add new variation helperMike Bayer2022-11-265-30/+106
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | I'm using a lot of @testing.combinations with either a boolean True/False, or a series of string names, each indicating some case to switch on. I want a descriptive name in the test run (not True/False) and I don't want to compare strings. So make a new helper around @combinations that provides an object interface that has booleans inside of it, prints nicely in the test output, raises an error if you name the case incorrectly. Before: test/orm/declarative/test_typed_mapping.py::MappedColumnTest::test_separate_name[False-False-both] PASSED test/orm/declarative/test_typed_mapping.py::MappedColumnTest::test_separate_name[False-False-key] PASSED test/orm/declarative/test_typed_mapping.py::MappedColumnTest::test_separate_name[False-False-name] PASSED test/orm/declarative/test_typed_mapping.py::MappedColumnTest::test_separate_name[False-True-both] PASSED test/orm/declarative/test_typed_mapping.py::MappedColumnTest::test_separate_name[False-True-key] PASSED test/orm/declarative/test_typed_mapping.py::MappedColumnTest::test_separate_name[False-True-name] PASSED test/orm/declarative/test_typed_mapping.py::MappedColumnTest::test_separate_name[True-False-both] PASSED test/orm/declarative/test_typed_mapping.py::MappedColumnTest::test_separate_name[True-False-key] PASSED test/orm/declarative/test_typed_mapping.py::MappedColumnTest::test_separate_name[True-False-name] PASSED test/orm/declarative/test_typed_mapping.py::MappedColumnTest::test_separate_name[True-True-both] PASSED test/orm/declarative/test_typed_mapping.py::MappedColumnTest::test_separate_name[True-True-key] PASSED test/orm/declarative/test_typed_mapping.py::MappedColumnTest::test_separate_name[True-True-name] PASSED After: test/orm/declarative/test_typed_mapping.py::MappedColumnTest::test_separate_name[not_use_add_property-deferred-both] PASSED test/orm/declarative/test_typed_mapping.py::MappedColumnTest::test_separate_name[not_use_add_property-deferred-key] PASSED test/orm/declarative/test_typed_mapping.py::MappedColumnTest::test_separate_name[not_use_add_property-deferred-name] PASSED test/orm/declarative/test_typed_mapping.py::MappedColumnTest::test_separate_name[not_use_add_property-not_deferred-both] PASSED test/orm/declarative/test_typed_mapping.py::MappedColumnTest::test_separate_name[not_use_add_property-not_deferred-key] PASSED test/orm/declarative/test_typed_mapping.py::MappedColumnTest::test_separate_name[not_use_add_property-not_deferred-name] PASSED test/orm/declarative/test_typed_mapping.py::MappedColumnTest::test_separate_name[use_add_property-deferred-both] PASSED test/orm/declarative/test_typed_mapping.py::MappedColumnTest::test_separate_name[use_add_property-deferred-key] PASSED test/orm/declarative/test_typed_mapping.py::MappedColumnTest::test_separate_name[use_add_property-deferred-name] PASSED test/orm/declarative/test_typed_mapping.py::MappedColumnTest::test_separate_name[use_add_property-not_deferred-both] PASSED test/orm/declarative/test_typed_mapping.py::MappedColumnTest::test_separate_name[use_add_property-not_deferred-key] PASSED test/orm/declarative/test_typed_mapping.py::MappedColumnTest::test_separate_name[use_add_property-not_deferred-name] PASSED Change-Id: Idde87632581ee69e0f47360966758583dfd8baab
* | | Add new script to sync test files adding future annotationFederico Caselli2022-11-2610-421/+2389
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Create a new test file test_tm_future_annotations_sync.py that's obtained from test_tm_future_annotations.py by using the new script sync_test_files. This files includes the ``from __future__ import annotations`` It also turns out we had some bugs in there and we can also support some additional typing things Change-Id: Iac005df206d45a55345d9d88d67a80ce799d449f
* | | sort for addresess relationship in new merge testMike Bayer2022-11-261-0/+1
| | | | | | | | | | | | | | | | | | saw a random failure under py2 on 1.4, will backport Change-Id: I3e2b037bf4211be44e28f85f5e51ffdc218eeb5a
* | | Merge "assert unique constraints received back" into mainmike bayer2022-11-261-0/+2
|\ \ \ | |_|/ |/| |
| * | assert unique constraints received backMike Bayer2022-11-241-0/+2
| |/ | | | | | | | | | | | | in #8867 we can see our existing uq reflection test is broken, not detecting a failure to detect constraints Change-Id: Icada02bc0547c5a3d8c471b80a78a2e72f02647d
* | add "merge" to viewonly cascades; propagate NO_RAISE when mergingMike Bayer2022-11-247-10/+201
|/ | | | | | | | | | | | | | | | | | | | | | | | | Fixed bug where :meth:`_orm.Session.merge` would fail to preserve the current loaded contents of relationship attributes that were indicated with the :paramref:`_orm.relationship.viewonly` parameter, thus defeating strategies that use :meth:`_orm.Session.merge` to pull fully loaded objects from caches and other similar techniques. In a related change, fixed issue where an object that contains a loaded relationship that was nonetheless configured as ``lazy='raise'`` on the mapping would fail when passed to :meth:`_orm.Session.merge`; checks for "raise" are now suspended within the merge process assuming the :paramref:`_orm.Session.merge.load` parameter remains at its default of ``True``. Overall, this is a behavioral adjustment to a change introduced in the 1.4 series as of :ticket:`4994`, which took "merge" out of the set of cascades applied by default to "viewonly" relationships. As "viewonly" relationships aren't persisted under any circumstances, allowing their contents to transfer during "merge" does not impact the persistence behavior of the target object. This allows :meth:`_orm.Session.merge` to correctly suit one of its use cases, that of adding objects to a :class:`.Session` that were loaded elsewhere, often for the purposes of restoring from a cache. Fixes: #8862 Change-Id: I8731c7810460e6a71f8bf5e8ded59142b9b02956
* flake8 has very courteously referred us to another pyqca project and closed ↵Mike Bayer2022-11-232-2/+3
| | | | | | | | | | | | | | | | all comments, thank you! I'll get on that right away pyqca/flake8-import-order does not seem to have a release or a commit in the past two years, so while I have created an issue and PR [1] [2], for now vendor our fork so we can get on with things. Also fix one issue for flake8 6.0 [1] https://github.com/PyCQA/flake8-import-order/issues/189 [2] https://github.com/PyCQA/flake8-import-order/pull/190 Change-Id: I53045f65b8716cceaf2104fccc1d26f80b398fef References: https://github.com/PyCQA/flake8/issues/1751
* improve docs for event listening with asyncioMike Bayer2022-11-231-12/+88
| | | | | | add examples, including how to listen on an async_sessionmaker Change-Id: I1d68324458c23bc830508c8ebfd3224d434c16a5
* Merge "ensure implicit_returning is checked on a Table instance" into mainmike bayer2022-11-223-1/+73
|\
| * ensure implicit_returning is checked on a Table instanceMike Bayer2022-11-223-1/+73
| | | | | | | | | | | | | | | | | | | | | | | | | | Fixed regression where flushing a mapped class that's mapped against a subquery, such as a direct mapping or some forms of concrete table inheritance, would fail if the :paramref:`_orm.Mapper.eager_defaults` parameter were used. mapper.local_table can still be a non-table instance. correct the check first added in 466ed5b53a3. Fixes: #8812 Change-Id: I1bb2b83c31b910fbd96fcd3ac43e789b657aebf7
* | Merge "Type annotations for sqlalchemy.ext.mutable" into mainmike bayer2022-11-222-102/+201
|\ \
| * | Type annotations for sqlalchemy.ext.mutableGleb Kisenkov2022-11-222-102/+201
| |/ | | | | | | | | | | | | | | | | | | | | | | The ``sqlalchemy.ext.mutable`` extension is now fully pep-484 typed. Huge thanks to Gleb Kisenkov for their efforts on this. Fixes: #8667 Closes: #8775 Pull-request: https://github.com/sqlalchemy/sqlalchemy/pull/8775 Pull-request-sha: b907888ec67facc12dbdbccd6f2d9cd533b08a50 Change-Id: Id9224e03201e6970b1ec56eb546ece4b2f3e0edd
* | Merge "fix optionalized forms for dict[]" into mainmike bayer2022-11-226-15/+207
|\ \
| * | fix optionalized forms for dict[]Mike Bayer2022-11-226-15/+207
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Fixed a suite of issues involving :class:`.Mapped` use with dictionary types, such as ``Mapped[dict[str, str] | None]``, would not be correctly interpreted in Declarative ORM mappings. Support to correctly "de-optionalize" this type including for lookup in type_annotation_map has been fixed. Fixes: #8777 Change-Id: Iaba90791dea341d00eaff788d40b0a4e48dab02e
* | | Add security warning to serializer extensionFederico Caselli2022-11-221-0/+5
| | | | | | | | | | | | Change-Id: I5c7c076bc93fc250c05f7996e83359d19d1f3214
* | | Merge "Fix inferred type of async_sessionmaker" into mainmike bayer2022-11-214-0/+97
|\ \ \
| * | | Fix inferred type of async_sessionmakerSam Bull2022-11-214-0/+97
| |/ / | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Improved the typing for :class:`.sessionmaker` and :class:`.asyncsessionmaker`, so that the default type of their return value will be :class:`.Session` or :class:`.AsyncSession`, without the need to type this explicitly. Previously, Mypy would not automaticaly infer these return types from its generic base. As part of this change, arguments for :class:`.Session`, :class:`.AsyncSession`, :class:`.sessionmaker` and :class:`.asyncsessionmaker` beyond the initial "bind" argument have been made keyword-only, which includes parameters that have always been documented as keyword arguments, such as :paramref:`.Session.autoflush`, :paramref:`.Session.class_`, etc. Pull request courtesy Sam Bull. Closes: #8842 Pull-request: https://github.com/sqlalchemy/sqlalchemy/pull/8842 Pull-request-sha: fa6d1a8468e98b40e12f82ed7ddaddc1fde060ac Change-Id: Iaaabc4572a87489d61617d970f62b9b50db4fac7
* | | Merge "add common base class for all SQL col expression objects" into mainmike bayer2022-11-2113-8/+180
|\ \ \
| * | | add common base class for all SQL col expression objectsMike Bayer2022-11-2113-8/+180
| |/ / | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Added a new type :class:`.SQLColumnExpression` which may be indicated in user code to represent any SQL column oriented expression, including both those based on :class:`.ColumnElement` as well as on ORM :class:`.QueryableAttribute`. This type is a real class, not an alias, so can also be used as the foundation for other objects. Fixes: #8847 Change-Id: I3161bdff1c9f447793fce87864e1774a90cd4146
* | | fall back to eval() for names that have dotsMike Bayer2022-11-213-0/+27
|/ / | | | | | | | | | | | | | | | | | | Fixed regression in 2.0.0b3 caused by :ticket:`8759` where indicating the :class:`.Mapped` name using a qualified name such as ``sqlalchemy.orm.Mapped`` would fail to be recognized by Declarative as indicating the :class:`.Mapped` construct. Fixes: #8853 Change-Id: Iddb6efaae864d4545e80c54658244670f81ef6cc
* | clarify role of `__allow_unmapped__`Mike Bayer2022-11-192-1/+10
| | | | | | | | | | | | | | | | A different note will be needed in the 1.4 version of these docs. Fixes: #8845 Change-Id: I48651c64d511684077c80a317349dd230424b575
* | Merge "Issue #8765: implement missing methods on PG Range" into mainmike bayer2022-11-173-135/+841
|\ \