--- /srv/reproducible-results/rbuild-debian/r-b-build.zMZLnFwJ/b1/sqlalchemy_2.0.32+ds1-1_arm64.changes
+++ /srv/reproducible-results/rbuild-debian/r-b-build.zMZLnFwJ/b2/sqlalchemy_2.0.32+ds1-1_arm64.changes
├── Files
│ @@ -1,5 +1,5 @@
│  
│ - beaba6a3b2b43a78fb0fdd5ed7079659 3956152 doc optional python-sqlalchemy-doc_2.0.32+ds1-1_all.deb
│ + d946d1ceb5fa061be74f2b109714fbb5 3956232 doc optional python-sqlalchemy-doc_2.0.32+ds1-1_all.deb
│   bc6585254ec3979ac10c73804363e2b8 1703508 debug optional python3-sqlalchemy-ext-dbgsym_2.0.32+ds1-1_arm64.deb
│   e50280cb29e037cb9a0ed67416da7f7a 172520 python optional python3-sqlalchemy-ext_2.0.32+ds1-1_arm64.deb
│   0955e7f12a0b73c1ab8406c88fbab7d2 1196068 python optional python3-sqlalchemy_2.0.32+ds1-1_all.deb
├── python-sqlalchemy-doc_2.0.32+ds1-1_all.deb
│ ├── file list
│ │ @@ -1,3 +1,3 @@
│ │  -rw-r--r--   0        0        0        4 2024-08-23 07:52:58.000000 debian-binary
│ │ --rw-r--r--   0        0        0    13912 2024-08-23 07:52:58.000000 control.tar.xz
│ │ --rw-r--r--   0        0        0  3942048 2024-08-23 07:52:58.000000 data.tar.xz
│ │ +-rw-r--r--   0        0        0    13904 2024-08-23 07:52:58.000000 control.tar.xz
│ │ +-rw-r--r--   0        0        0  3942136 2024-08-23 07:52:58.000000 data.tar.xz
│ ├── control.tar.xz
│ │ ├── control.tar
│ │ │ ├── ./md5sums
│ │ │ │ ├── ./md5sums
│ │ │ │ │┄ Files differ
│ ├── data.tar.xz
│ │ ├── data.tar
│ │ │ ├── ./usr/share/doc/python-sqlalchemy-doc/html/changelog/changelog_10.html
│ │ │ │ @@ -592,15 +592,15 @@
│ │ │ │  <section id="changelog">
│ │ │ │  <h1>1.0 Changelog<a class="headerlink" href="#changelog" title="Link to this heading">¶</a></h1>
│ │ │ │  <section id="change-1.0.19">
│ │ │ │  <h2 class="release-version">1.0.19<a class="headerlink" href="#change-1.0.19" title="Link to this heading">¶</a></h2>
│ │ │ │  Released: August 3, 2017<section id="change-1.0.19-oracle">
│ │ │ │  <h3>oracle<a class="headerlink" href="#change-1.0.19-oracle" title="Link to this heading">¶</a></h3>
│ │ │ │  <ul class="simple">
│ │ │ │ -<li><p class="caption" id="change-1.0.19-0"><span class="target" id="change-ec8fd72ca0ab2d0123169536543fb6cd"><strong>[oracle] [performance] [bug] [py2k]</strong> <a class="changelog-reference headerlink reference internal" href="#change-ec8fd72ca0ab2d0123169536543fb6cd">¶</a></span><p>Fixed performance regression caused by the fix for <a class="reference external" href="https://www.sqlalchemy.org/trac/ticket/3937">#3937</a> where
│ │ │ │ +<li><p class="caption" id="change-1.0.19-0"><span class="target" id="change-ec8fd72ca0ab2d0123169536543fb6cd"><strong>[oracle] [bug] [performance] [py2k]</strong> <a class="changelog-reference headerlink reference internal" href="#change-ec8fd72ca0ab2d0123169536543fb6cd">¶</a></span><p>Fixed performance regression caused by the fix for <a class="reference external" href="https://www.sqlalchemy.org/trac/ticket/3937">#3937</a> where
│ │ │ │  cx_Oracle as of version 5.3 dropped the <code class="docutils literal notranslate"><span class="pre">.UNICODE</span></code> symbol from its
│ │ │ │  namespace,  which was interpreted as cx_Oracle’s “WITH_UNICODE” mode being
│ │ │ │  turned on unconditionally, which invokes functions on the SQLAlchemy
│ │ │ │  side which convert all strings to unicode unconditionally and causing
│ │ │ │  a performance impact.  In fact, per cx_Oracle’s author the
│ │ │ │  “WITH_UNICODE” mode has been removed entirely as of 5.1, so the expensive unicode
│ │ │ │  conversion functions are no longer necessary and are disabled if
│ │ │ │ ├── html2text {}
│ │ │ │ │ @@ -318,15 +318,15 @@
│ │ │ │ │                        # _o_r_a_c_l_e
│ │ │ │ │                        # _t_e_s_t_s
│ │ │ │ │                        # _m_i_s_c
│ │ │ │ │  ************ 11..00 CChhaannggeelloogg_?¶ ************
│ │ │ │ │  ********** 11..00..1199_?¶ **********
│ │ │ │ │  Released: August 3, 2017
│ │ │ │ │  ******** oorraaccllee_?¶ ********
│ │ │ │ │ -    * [[oorraaccllee]] [[ppeerrffoorrmmaannccee]] [[bbuugg]] [[ppyy22kk]] _¶
│ │ │ │ │ +    * [[oorraaccllee]] [[bbuugg]] [[ppeerrffoorrmmaannccee]] [[ppyy22kk]] _¶
│ │ │ │ │        Fixed performance regression caused by the fix for _#_3_9_3_7 where cx_Oracle
│ │ │ │ │        as of version 5.3 dropped the .UNICODE symbol from its namespace, which
│ │ │ │ │        was interpreted as cx_Oracle’s “WITH_UNICODE” mode being turned on
│ │ │ │ │        unconditionally, which invokes functions on the SQLAlchemy side which
│ │ │ │ │        convert all strings to unicode unconditionally and causing a performance
│ │ │ │ │        impact. In fact, per cx_Oracle’s author the “WITH_UNICODE” mode has been
│ │ │ │ │        removed entirely as of 5.1, so the expensive unicode conversion functions
│ │ │ ├── ./usr/share/doc/python-sqlalchemy-doc/html/changelog/changelog_11.html
│ │ │ │ @@ -875,15 +875,15 @@
│ │ │ │  </section>
│ │ │ │  </section>
│ │ │ │  <section id="change-1.1.13">
│ │ │ │  <h2 class="release-version">1.1.13<a class="headerlink" href="#change-1.1.13" title="Link to this heading">¶</a></h2>
│ │ │ │  Released: August 3, 2017<section id="change-1.1.13-oracle">
│ │ │ │  <h3>oracle<a class="headerlink" href="#change-1.1.13-oracle" title="Link to this heading">¶</a></h3>
│ │ │ │  <ul class="simple">
│ │ │ │ -<li><p class="caption" id="change-1.1.13-0"><span class="target" id="change-91e9180bc7f72ab73ee81944ee6c0b5b"><strong>[oracle] [performance] [bug] [py2k]</strong> <a class="changelog-reference headerlink reference internal" href="#change-91e9180bc7f72ab73ee81944ee6c0b5b">¶</a></span><p>Fixed performance regression caused by the fix for <a class="reference external" href="https://www.sqlalchemy.org/trac/ticket/3937">#3937</a> where
│ │ │ │ +<li><p class="caption" id="change-1.1.13-0"><span class="target" id="change-91e9180bc7f72ab73ee81944ee6c0b5b"><strong>[oracle] [bug] [performance] [py2k]</strong> <a class="changelog-reference headerlink reference internal" href="#change-91e9180bc7f72ab73ee81944ee6c0b5b">¶</a></span><p>Fixed performance regression caused by the fix for <a class="reference external" href="https://www.sqlalchemy.org/trac/ticket/3937">#3937</a> where
│ │ │ │  cx_Oracle as of version 5.3 dropped the <code class="docutils literal notranslate"><span class="pre">.UNICODE</span></code> symbol from its
│ │ │ │  namespace,  which was interpreted as cx_Oracle’s “WITH_UNICODE” mode being
│ │ │ │  turned on unconditionally, which invokes functions on the SQLAlchemy
│ │ │ │  side which convert all strings to unicode unconditionally and causing
│ │ │ │  a performance impact.  In fact, per cx_Oracle’s author the
│ │ │ │  “WITH_UNICODE” mode has been removed entirely as of 5.1, so the expensive unicode
│ │ │ │  conversion functions are no longer necessary and are disabled if
│ │ │ │ ├── html2text {}
│ │ │ │ │ @@ -496,15 +496,15 @@
│ │ │ │ │        the same PRECEDING or FOLLOWING keywords in a range by allowing for the
│ │ │ │ │        left side of the range to be positive and for the right to be negative,
│ │ │ │ │        e.g. (1, 3) is “1 FOLLOWING AND 3 FOLLOWING”.
│ │ │ │ │        References: _#_4_0_5_3
│ │ │ │ │  ********** 11..11..1133_?¶ **********
│ │ │ │ │  Released: August 3, 2017
│ │ │ │ │  ******** oorraaccllee_?¶ ********
│ │ │ │ │ -    * [[oorraaccllee]] [[ppeerrffoorrmmaannccee]] [[bbuugg]] [[ppyy22kk]] _¶
│ │ │ │ │ +    * [[oorraaccllee]] [[bbuugg]] [[ppeerrffoorrmmaannccee]] [[ppyy22kk]] _¶
│ │ │ │ │        Fixed performance regression caused by the fix for _#_3_9_3_7 where cx_Oracle
│ │ │ │ │        as of version 5.3 dropped the .UNICODE symbol from its namespace, which
│ │ │ │ │        was interpreted as cx_Oracle’s “WITH_UNICODE” mode being turned on
│ │ │ │ │        unconditionally, which invokes functions on the SQLAlchemy side which
│ │ │ │ │        convert all strings to unicode unconditionally and causing a performance
│ │ │ │ │        impact. In fact, per cx_Oracle’s author the “WITH_UNICODE” mode has been
│ │ │ │ │        removed entirely as of 5.1, so the expensive unicode conversion functions
│ │ │ ├── ./usr/share/doc/python-sqlalchemy-doc/html/changelog/changelog_12.html
│ │ │ │ @@ -2977,15 +2977,15 @@
│ │ │ │  </p>
│ │ │ │  </li>
│ │ │ │  </ul>
│ │ │ │  </section>
│ │ │ │  <section id="change-1.2.0b3-oracle">
│ │ │ │  <h3>oracle<a class="headerlink" href="#change-1.2.0b3-oracle" title="Link to this heading">¶</a></h3>
│ │ │ │  <ul class="simple">
│ │ │ │ -<li><p class="caption" id="change-1.2.0b3-43"><span class="target" id="change-7cb9a3370310381d19eb1a17c5a84a91"><strong>[oracle] [performance] [bug] [py2k]</strong> <a class="changelog-reference headerlink reference internal" href="#change-7cb9a3370310381d19eb1a17c5a84a91">¶</a></span><p>Fixed performance regression caused by the fix for <a class="reference external" href="https://www.sqlalchemy.org/trac/ticket/3937">#3937</a> where
│ │ │ │ +<li><p class="caption" id="change-1.2.0b3-43"><span class="target" id="change-7cb9a3370310381d19eb1a17c5a84a91"><strong>[oracle] [bug] [performance] [py2k]</strong> <a class="changelog-reference headerlink reference internal" href="#change-7cb9a3370310381d19eb1a17c5a84a91">¶</a></span><p>Fixed performance regression caused by the fix for <a class="reference external" href="https://www.sqlalchemy.org/trac/ticket/3937">#3937</a> where
│ │ │ │  cx_Oracle as of version 5.3 dropped the <code class="docutils literal notranslate"><span class="pre">.UNICODE</span></code> symbol from its
│ │ │ │  namespace,  which was interpreted as cx_Oracle’s “WITH_UNICODE” mode being
│ │ │ │  turned on unconditionally, which invokes functions on the SQLAlchemy
│ │ │ │  side which convert all strings to unicode unconditionally and causing
│ │ │ │  a performance impact.  In fact, per cx_Oracle’s author the
│ │ │ │  “WITH_UNICODE” mode has been removed entirely as of 5.1, so the expensive unicode
│ │ │ │  conversion functions are no longer necessary and are disabled if
│ │ │ │ ├── html2text {}
│ │ │ │ │ @@ -1879,15 +1879,15 @@
│ │ │ │ │  verify the number of rows affected on a target version.
│ │ │ │ │  [[mmssssqqll]] [[bbuugg]] _¶
│ │ │ │ │  Added a rule to SQL Server index reflection to ignore the so-called “heap”
│ │ │ │ │  index that is implicitly present on a table that does not specify a clustered
│ │ │ │ │  index.
│ │ │ │ │  References: _#_4_0_5_9
│ │ │ │ │  ******** oorraaccllee_?¶ ********
│ │ │ │ │ -    * [[oorraaccllee]] [[ppeerrffoorrmmaannccee]] [[bbuugg]] [[ppyy22kk]] _¶
│ │ │ │ │ +    * [[oorraaccllee]] [[bbuugg]] [[ppeerrffoorrmmaannccee]] [[ppyy22kk]] _¶
│ │ │ │ │        Fixed performance regression caused by the fix for _#_3_9_3_7 where cx_Oracle
│ │ │ │ │        as of version 5.3 dropped the .UNICODE symbol from its namespace, which
│ │ │ │ │        was interpreted as cx_Oracle’s “WITH_UNICODE” mode being turned on
│ │ │ │ │        unconditionally, which invokes functions on the SQLAlchemy side which
│ │ │ │ │        convert all strings to unicode unconditionally and causing a performance
│ │ │ │ │        impact. In fact, per cx_Oracle’s author the “WITH_UNICODE” mode has been
│ │ │ │ │        removed entirely as of 5.1, so the expensive unicode conversion functions
│ │ │ ├── ./usr/share/doc/python-sqlalchemy-doc/html/changelog/changelog_13.html
│ │ │ │ @@ -1803,30 +1803,30 @@
│ │ │ │  </p>
│ │ │ │  </li>
│ │ │ │  </ul>
│ │ │ │  </section>
│ │ │ │  <section id="change-1.3.17-oracle">
│ │ │ │  <h3>oracle<a class="headerlink" href="#change-1.3.17-oracle" title="Link to this heading">¶</a></h3>
│ │ │ │  <ul class="simple">
│ │ │ │ -<li><p class="caption" id="change-1.3.17-14"><span class="target" id="change-cc5a1743d1951d72594d609e6e1a5c99"><strong>[oracle] [performance] [bug]</strong> <a class="changelog-reference headerlink reference internal" href="#change-cc5a1743d1951d72594d609e6e1a5c99">¶</a></span><p>Changed the implementation of fetching CLOB and BLOB objects to use
│ │ │ │ +<li><p class="caption" id="change-1.3.17-14"><span class="target" id="change-aae71399cbb61c78ebaa99fe5ebbc85f"><strong>[oracle] [bug]</strong> <a class="changelog-reference headerlink reference internal" href="#change-aae71399cbb61c78ebaa99fe5ebbc85f">¶</a></span><p>Some modifications to how the cx_oracle dialect sets up per-column
│ │ │ │ +outputtype handlers for LOB and numeric datatypes to adjust for potential
│ │ │ │ +changes coming in cx_Oracle 8.</p>
│ │ │ │ +<p>References: <a class="reference external" href="https://www.sqlalchemy.org/trac/ticket/5246">#5246</a></p>
│ │ │ │ +</p>
│ │ │ │ +</li>
│ │ │ │ +<li><p class="caption" id="change-1.3.17-15"><span class="target" id="change-cc5a1743d1951d72594d609e6e1a5c99"><strong>[oracle] [bug] [performance]</strong> <a class="changelog-reference headerlink reference internal" href="#change-cc5a1743d1951d72594d609e6e1a5c99">¶</a></span><p>Changed the implementation of fetching CLOB and BLOB objects to use
│ │ │ │  cx_Oracle’s native implementation which fetches CLOB/BLOB objects inline
│ │ │ │  with other result columns, rather than performing a separate fetch. As
│ │ │ │  always, this can be disabled by setting auto_convert_lobs to False.</p>
│ │ │ │  <p>As part of this change, the behavior of a CLOB that was given a blank
│ │ │ │  string on INSERT now returns None on SELECT, which is now consistent with
│ │ │ │  that of VARCHAR on Oracle.</p>
│ │ │ │  <p>References: <a class="reference external" href="https://www.sqlalchemy.org/trac/ticket/5314">#5314</a></p>
│ │ │ │  </p>
│ │ │ │  </li>
│ │ │ │ -<li><p class="caption" id="change-1.3.17-15"><span class="target" id="change-aae71399cbb61c78ebaa99fe5ebbc85f"><strong>[oracle] [bug]</strong> <a class="changelog-reference headerlink reference internal" href="#change-aae71399cbb61c78ebaa99fe5ebbc85f">¶</a></span><p>Some modifications to how the cx_oracle dialect sets up per-column
│ │ │ │ -outputtype handlers for LOB and numeric datatypes to adjust for potential
│ │ │ │ -changes coming in cx_Oracle 8.</p>
│ │ │ │ -<p>References: <a class="reference external" href="https://www.sqlalchemy.org/trac/ticket/5246">#5246</a></p>
│ │ │ │ -</p>
│ │ │ │ -</li>
│ │ │ │  </ul>
│ │ │ │  </section>
│ │ │ │  <section id="change-1.3.17-misc">
│ │ │ │  <h3>misc<a class="headerlink" href="#change-1.3.17-misc" title="Link to this heading">¶</a></h3>
│ │ │ │  <ul class="simple">
│ │ │ │  <li><p class="caption" id="change-1.3.17-16"><span class="target" id="change-3d26d8810b452ce62aee1841b6a4725d"><strong>[change] [firebird]</strong> <a class="changelog-reference headerlink reference internal" href="#change-3d26d8810b452ce62aee1841b6a4725d">¶</a></span><p>Adjusted dialect loading for <code class="docutils literal notranslate"><span class="pre">firebird://</span></code> URIs so the external
│ │ │ │  sqlalchemy-firebird dialect will be used if it has been installed,
│ │ │ │ @@ -2204,15 +2204,15 @@
│ │ │ │  <h3>misc<a class="headerlink" href="#change-1.3.14-misc" title="Link to this heading">¶</a></h3>
│ │ │ │  <ul class="simple">
│ │ │ │  <li><p class="caption" id="change-1.3.14-12"><span class="target" id="change-f50027dab71171da288167ea6ede7548"><strong>[usecase] [ext]</strong> <a class="changelog-reference headerlink reference internal" href="#change-f50027dab71171da288167ea6ede7548">¶</a></span><p>Added keyword arguments to the <a class="reference internal" href="../orm/extensions/mutable.html#sqlalchemy.ext.mutable.MutableList.sort" title="sqlalchemy.ext.mutable.MutableList.sort"><code class="xref py py-meth docutils literal notranslate"><span class="pre">MutableList.sort()</span></code></a> function so that a
│ │ │ │  key function as well as the “reverse” keyword argument can be provided.</p>
│ │ │ │  <p>References: <a class="reference external" href="https://www.sqlalchemy.org/trac/ticket/5114">#5114</a></p>
│ │ │ │  </p>
│ │ │ │  </li>
│ │ │ │ -<li><p class="caption" id="change-1.3.14-13"><span class="target" id="change-4aee123e6060a97e0c5cd34e2d4f5ffa"><strong>[performance] [bug]</strong> <a class="changelog-reference headerlink reference internal" href="#change-4aee123e6060a97e0c5cd34e2d4f5ffa">¶</a></span><p>Revised an internal change to the test system added as a result of
│ │ │ │ +<li><p class="caption" id="change-1.3.14-13"><span class="target" id="change-4aee123e6060a97e0c5cd34e2d4f5ffa"><strong>[bug] [performance]</strong> <a class="changelog-reference headerlink reference internal" href="#change-4aee123e6060a97e0c5cd34e2d4f5ffa">¶</a></span><p>Revised an internal change to the test system added as a result of
│ │ │ │  <a class="reference external" href="https://www.sqlalchemy.org/trac/ticket/5085">#5085</a> where a testing-related module per dialect would be loaded
│ │ │ │  unconditionally upon making use of that dialect, pulling in SQLAlchemy’s
│ │ │ │  testing framework as well as the ORM into the module import space.   This
│ │ │ │  would only impact initial startup time and memory to a modest extent,
│ │ │ │  however it’s best that these additional modules aren’t reverse-dependent on
│ │ │ │  straight Core usage.</p>
│ │ │ │  <p>References: <a class="reference external" href="https://www.sqlalchemy.org/trac/ticket/5180">#5180</a></p>
│ │ │ │ ├── html2text {}
│ │ │ │ │ @@ -1144,28 +1144,28 @@
│ │ │ │ │        References: _#_5_2_5_5
│ │ │ │ │  [[mmssssqqll]] [[bbuugg]] [[rreefflleeccttiioonn]] _¶
│ │ │ │ │  Fix a regression introduced by the reflection of computed column in MSSQL when
│ │ │ │ │  using SQL server versions before 2012, which does not support the concat
│ │ │ │ │  function.
│ │ │ │ │  References: _#_5_2_7_1
│ │ │ │ │  ******** oorraaccllee_?¶ ********
│ │ │ │ │ -    * [[oorraaccllee]] [[ppeerrffoorrmmaannccee]] [[bbuugg]] _¶
│ │ │ │ │ -      Changed the implementation of fetching CLOB and BLOB objects to use
│ │ │ │ │ -      cx_Oracle’s native implementation which fetches CLOB/BLOB objects inline
│ │ │ │ │ -      with other result columns, rather than performing a separate fetch. As
│ │ │ │ │ -      always, this can be disabled by setting auto_convert_lobs to False.
│ │ │ │ │ -      As part of this change, the behavior of a CLOB that was given a blank
│ │ │ │ │ -      string on INSERT now returns None on SELECT, which is now consistent with
│ │ │ │ │ -      that of VARCHAR on Oracle.
│ │ │ │ │ -      References: _#_5_3_1_4
│ │ │ │ │ -[[oorraaccllee]] [[bbuugg]] _¶
│ │ │ │ │ -Some modifications to how the cx_oracle dialect sets up per-column outputtype
│ │ │ │ │ -handlers for LOB and numeric datatypes to adjust for potential changes coming
│ │ │ │ │ -in cx_Oracle 8.
│ │ │ │ │ -References: _#_5_2_4_6
│ │ │ │ │ +    * [[oorraaccllee]] [[bbuugg]] _¶
│ │ │ │ │ +      Some modifications to how the cx_oracle dialect sets up per-column
│ │ │ │ │ +      outputtype handlers for LOB and numeric datatypes to adjust for potential
│ │ │ │ │ +      changes coming in cx_Oracle 8.
│ │ │ │ │ +      References: _#_5_2_4_6
│ │ │ │ │ +[[oorraaccllee]] [[bbuugg]] [[ppeerrffoorrmmaannccee]] _¶
│ │ │ │ │ +Changed the implementation of fetching CLOB and BLOB objects to use cx_Oracle’s
│ │ │ │ │ +native implementation which fetches CLOB/BLOB objects inline with other result
│ │ │ │ │ +columns, rather than performing a separate fetch. As always, this can be
│ │ │ │ │ +disabled by setting auto_convert_lobs to False.
│ │ │ │ │ +As part of this change, the behavior of a CLOB that was given a blank string on
│ │ │ │ │ +INSERT now returns None on SELECT, which is now consistent with that of VARCHAR
│ │ │ │ │ +on Oracle.
│ │ │ │ │ +References: _#_5_3_1_4
│ │ │ │ │  ******** mmiisscc_?¶ ********
│ │ │ │ │      * [[cchhaannggee]] [[ffiirreebbiirrdd]] _¶
│ │ │ │ │        Adjusted dialect loading for firebird:// URIs so the external sqlalchemy-
│ │ │ │ │        firebird dialect will be used if it has been installed, otherwise fall
│ │ │ │ │        back to the (now deprecated) internal Firebird dialect.
│ │ │ │ │        References: _#_5_2_7_8
│ │ │ │ │  ********** 11..33..1166_?¶ **********
│ │ │ │ │ @@ -1409,15 +1409,15 @@
│ │ │ │ │        but owned by someone else. Pull request courtesy Dave Hirschfeld.
│ │ │ │ │        References: _#_5_1_4_6
│ │ │ │ │  ******** mmiisscc_?¶ ********
│ │ │ │ │      * [[uusseeccaassee]] [[eexxtt]] _¶
│ │ │ │ │        Added keyword arguments to the _M_u_t_a_b_l_e_L_i_s_t_._s_o_r_t_(_) function so that a key
│ │ │ │ │        function as well as the “reverse” keyword argument can be provided.
│ │ │ │ │        References: _#_5_1_1_4
│ │ │ │ │ -[[ppeerrffoorrmmaannccee]] [[bbuugg]] _¶
│ │ │ │ │ +[[bbuugg]] [[ppeerrffoorrmmaannccee]] _¶
│ │ │ │ │  Revised an internal change to the test system added as a result of _#_5_0_8_5 where
│ │ │ │ │  a testing-related module per dialect would be loaded unconditionally upon
│ │ │ │ │  making use of that dialect, pulling in SQLAlchemy’s testing framework as well
│ │ │ │ │  as the ORM into the module import space. This would only impact initial startup
│ │ │ │ │  time and memory to a modest extent, however it’s best that these additional
│ │ │ │ │  modules aren’t reverse-dependent on straight Core usage.
│ │ │ │ │  References: _#_5_1_8_0
│ │ │ ├── ./usr/share/doc/python-sqlalchemy-doc/html/changelog/changelog_14.html
│ │ │ │ @@ -3065,36 +3065,36 @@
│ │ │ │  attributes and entities that are installed as part of an <a class="reference internal" href="../core/dml.html#sqlalchemy.sql.expression.Insert" title="sqlalchemy.sql.expression.Insert"><code class="xref py py-class docutils literal notranslate"><span class="pre">Insert</span></code></a>,
│ │ │ │  <a class="reference internal" href="../core/dml.html#sqlalchemy.sql.expression.Update" title="sqlalchemy.sql.expression.Update"><code class="xref py py-class docutils literal notranslate"><span class="pre">Update</span></code></a>, or <a class="reference internal" href="../core/dml.html#sqlalchemy.sql.expression.Delete" title="sqlalchemy.sql.expression.Delete"><code class="xref py py-class docutils literal notranslate"><span class="pre">Delete</span></code></a> construct. The
│ │ │ │  <a class="reference internal" href="../core/selectable.html#sqlalchemy.sql.expression.Select.column_descriptions" title="sqlalchemy.sql.expression.Select.column_descriptions"><code class="xref py py-attr docutils literal notranslate"><span class="pre">Select.column_descriptions</span></code></a> accessor is also now implemented for
│ │ │ │  Core-only selectables.</p>
│ │ │ │  <p>References: <a class="reference external" href="https://www.sqlalchemy.org/trac/ticket/7861">#7861</a></p>
│ │ │ │  </p>
│ │ │ │  </li>
│ │ │ │ -<li><p class="caption" id="change-1.4.33-2"><span class="target" id="change-9e8374aab257ac3366e02a4907fc449a"><strong>[orm] [performance] [bug]</strong> <a class="changelog-reference headerlink reference internal" href="#change-9e8374aab257ac3366e02a4907fc449a">¶</a></span><p>Improvements in memory usage by the ORM, removing a significant set of
│ │ │ │ -intermediary expression objects that are typically stored when a copy of an
│ │ │ │ -expression object is created. These clones have been greatly reduced,
│ │ │ │ -reducing the number of total expression objects stored in memory by
│ │ │ │ -ORM mappings by about 30%.</p>
│ │ │ │ -<p>References: <a class="reference external" href="https://www.sqlalchemy.org/trac/ticket/7823">#7823</a></p>
│ │ │ │ -</p>
│ │ │ │ -</li>
│ │ │ │ -<li><p class="caption" id="change-1.4.33-3"><span class="target" id="change-6e997a9f24c37627b3bc1af26a5a2c9d"><strong>[orm] [bug] [regression]</strong> <a class="changelog-reference headerlink reference internal" href="#change-6e997a9f24c37627b3bc1af26a5a2c9d">¶</a></span><p>Fixed regression in “dynamic” loader strategy where the
│ │ │ │ +<li><p class="caption" id="change-1.4.33-2"><span class="target" id="change-6e997a9f24c37627b3bc1af26a5a2c9d"><strong>[orm] [bug] [regression]</strong> <a class="changelog-reference headerlink reference internal" href="#change-6e997a9f24c37627b3bc1af26a5a2c9d">¶</a></span><p>Fixed regression in “dynamic” loader strategy where the
│ │ │ │  <a class="reference internal" href="../orm/queryguide/query.html#sqlalchemy.orm.Query.filter_by" title="sqlalchemy.orm.Query.filter_by"><code class="xref py py-meth docutils literal notranslate"><span class="pre">Query.filter_by()</span></code></a> method would not be given an appropriate
│ │ │ │  entity to filter from, in the case where a “secondary” table were present
│ │ │ │  in the relationship being queried and the mapping were against something
│ │ │ │  complex such as a “with polymorphic”.</p>
│ │ │ │  <p>References: <a class="reference external" href="https://www.sqlalchemy.org/trac/ticket/7868">#7868</a></p>
│ │ │ │  </p>
│ │ │ │  </li>
│ │ │ │ -<li><p class="caption" id="change-1.4.33-4"><span class="target" id="change-4964a00cd636f3fbb10595151e1fb258"><strong>[orm] [bug]</strong> <a class="changelog-reference headerlink reference internal" href="#change-4964a00cd636f3fbb10595151e1fb258">¶</a></span><p>Fixed bug where <a class="reference internal" href="../orm/composites.html#sqlalchemy.orm.composite" title="sqlalchemy.orm.composite"><code class="xref py py-func docutils literal notranslate"><span class="pre">composite()</span></code></a> attributes would not work in
│ │ │ │ +<li><p class="caption" id="change-1.4.33-3"><span class="target" id="change-4964a00cd636f3fbb10595151e1fb258"><strong>[orm] [bug]</strong> <a class="changelog-reference headerlink reference internal" href="#change-4964a00cd636f3fbb10595151e1fb258">¶</a></span><p>Fixed bug where <a class="reference internal" href="../orm/composites.html#sqlalchemy.orm.composite" title="sqlalchemy.orm.composite"><code class="xref py py-func docutils literal notranslate"><span class="pre">composite()</span></code></a> attributes would not work in
│ │ │ │  conjunction with the <a class="reference internal" href="../orm/queryguide/inheritance.html#sqlalchemy.orm.selectin_polymorphic" title="sqlalchemy.orm.selectin_polymorphic"><code class="xref py py-func docutils literal notranslate"><span class="pre">selectin_polymorphic()</span></code></a> loader strategy for
│ │ │ │  joined table inheritance.</p>
│ │ │ │  <p>References: <a class="reference external" href="https://www.sqlalchemy.org/trac/ticket/7801">#7801</a></p>
│ │ │ │  </p>
│ │ │ │  </li>
│ │ │ │ +<li><p class="caption" id="change-1.4.33-4"><span class="target" id="change-9e8374aab257ac3366e02a4907fc449a"><strong>[orm] [bug] [performance]</strong> <a class="changelog-reference headerlink reference internal" href="#change-9e8374aab257ac3366e02a4907fc449a">¶</a></span><p>Improvements in memory usage by the ORM, removing a significant set of
│ │ │ │ +intermediary expression objects that are typically stored when a copy of an
│ │ │ │ +expression object is created. These clones have been greatly reduced,
│ │ │ │ +reducing the number of total expression objects stored in memory by
│ │ │ │ +ORM mappings by about 30%.</p>
│ │ │ │ +<p>References: <a class="reference external" href="https://www.sqlalchemy.org/trac/ticket/7823">#7823</a></p>
│ │ │ │ +</p>
│ │ │ │ +</li>
│ │ │ │  <li><p class="caption" id="change-1.4.33-5"><span class="target" id="change-cd2db57c1e1cd1330ba16d255c704a3d"><strong>[orm] [bug]</strong> <a class="changelog-reference headerlink reference internal" href="#change-cd2db57c1e1cd1330ba16d255c704a3d">¶</a></span><p>Fixed issue where the <a class="reference internal" href="../orm/queryguide/inheritance.html#sqlalchemy.orm.selectin_polymorphic" title="sqlalchemy.orm.selectin_polymorphic"><code class="xref py py-func docutils literal notranslate"><span class="pre">selectin_polymorphic()</span></code></a> loader option would
│ │ │ │  not work with joined inheritance mappers that don’t have a fixed
│ │ │ │  “polymorphic_on” column.   Additionally added test support for a wider
│ │ │ │  variety of usage patterns with this construct.</p>
│ │ │ │  <p>References: <a class="reference external" href="https://www.sqlalchemy.org/trac/ticket/7799">#7799</a></p>
│ │ │ │  </p>
│ │ │ │  </li>
│ │ │ │ @@ -4821,15 +4821,15 @@
│ │ │ │  </p>
│ │ │ │  </li>
│ │ │ │  </ul>
│ │ │ │  </section>
│ │ │ │  <section id="change-1.4.24-oracle">
│ │ │ │  <h3>oracle<a class="headerlink" href="#change-1.4.24-oracle" title="Link to this heading">¶</a></h3>
│ │ │ │  <ul class="simple">
│ │ │ │ -<li><p class="caption" id="change-1.4.24-26"><span class="target" id="change-52e239f85c12b1dda3a1f0ff8b1b7760"><strong>[oracle] [performance] [bug]</strong> <a class="changelog-reference headerlink reference internal" href="#change-52e239f85c12b1dda3a1f0ff8b1b7760">¶</a></span><p>Added a CAST(VARCHAR2(128)) to the “table name”, “owner”, and other
│ │ │ │ +<li><p class="caption" id="change-1.4.24-26"><span class="target" id="change-52e239f85c12b1dda3a1f0ff8b1b7760"><strong>[oracle] [bug] [performance]</strong> <a class="changelog-reference headerlink reference internal" href="#change-52e239f85c12b1dda3a1f0ff8b1b7760">¶</a></span><p>Added a CAST(VARCHAR2(128)) to the “table name”, “owner”, and other
│ │ │ │  DDL-name parameters as used in reflection queries against Oracle system
│ │ │ │  views such as ALL_TABLES, ALL_TAB_CONSTRAINTS, etc to better enable
│ │ │ │  indexing to take place against these columns, as they previously would be
│ │ │ │  implicitly handled as NVARCHAR2 due to Python’s use of Unicode for strings;
│ │ │ │  these columns are documented in all Oracle versions as being VARCHAR2 with
│ │ │ │  lengths varying from 30 to 128 characters depending on server version.
│ │ │ │  Additionally, test support has been enabled for Unicode-named DDL
│ │ │ │ @@ -5544,24 +5544,15 @@
│ │ │ │  </section>
│ │ │ │  </section>
│ │ │ │  <section id="change-1.4.18">
│ │ │ │  <h2 class="release-version">1.4.18<a class="headerlink" href="#change-1.4.18" title="Link to this heading">¶</a></h2>
│ │ │ │  Released: June 10, 2021<section id="change-1.4.18-orm">
│ │ │ │  <h3>orm<a class="headerlink" href="#change-1.4.18-orm" title="Link to this heading">¶</a></h3>
│ │ │ │  <ul class="simple">
│ │ │ │ -<li><p class="caption" id="change-1.4.18-0"><span class="target" id="change-c44bef7c81e356405fc8438d62ed6fb2"><strong>[orm] [performance] [bug] [regression]</strong> <a class="changelog-reference headerlink reference internal" href="#change-c44bef7c81e356405fc8438d62ed6fb2">¶</a></span><p>Fixed regression involving how the ORM would resolve a given mapped column
│ │ │ │ -to a result row, where under cases such as joined eager loading, a slightly
│ │ │ │ -more expensive “fallback” could take place to set up this resolution due to
│ │ │ │ -some logic that was removed since 1.3. The issue could also cause
│ │ │ │ -deprecation warnings involving column resolution to be emitted when using a
│ │ │ │ -1.4 style query with joined eager loading.</p>
│ │ │ │ -<p>References: <a class="reference external" href="https://www.sqlalchemy.org/trac/ticket/6596">#6596</a></p>
│ │ │ │ -</p>
│ │ │ │ -</li>
│ │ │ │ -<li><p class="caption" id="change-1.4.18-1"><span class="target" id="change-bbc62687df1511016980bc3701009b8b"><strong>[orm] [bug]</strong> <a class="changelog-reference headerlink reference internal" href="#change-bbc62687df1511016980bc3701009b8b">¶</a></span><p>Clarified the current purpose of the
│ │ │ │ +<li><p class="caption" id="change-1.4.18-0"><span class="target" id="change-bbc62687df1511016980bc3701009b8b"><strong>[orm] [bug]</strong> <a class="changelog-reference headerlink reference internal" href="#change-bbc62687df1511016980bc3701009b8b">¶</a></span><p>Clarified the current purpose of the
│ │ │ │  <a class="reference internal" href="../orm/relationship_api.html#sqlalchemy.orm.relationship.params.bake_queries" title="sqlalchemy.orm.relationship"><code class="xref py py-paramref docutils literal notranslate"><span class="pre">relationship.bake_queries</span></code></a> flag, which in 1.4 is to enable
│ │ │ │  or disable “lambda caching” of statements within the “lazyload” and
│ │ │ │  “selectinload” loader strategies; this is separate from the more
│ │ │ │  foundational SQL query cache that is used for most statements.
│ │ │ │  Additionally, the lazy loader no longer uses its own cache for many-to-one
│ │ │ │  SQL queries, which was an implementation quirk that doesn’t exist for any
│ │ │ │  other loader scenario. Finally, the “lru cache” warning that the lazyloader
│ │ │ │ @@ -5571,29 +5562,38 @@
│ │ │ │  setting <code class="docutils literal notranslate"><span class="pre">bake_queries=False</span></code> for such a relationship will remove this
│ │ │ │  cache from being used, there’s no particular performance gain in this case
│ │ │ │  as using no caching vs. using a cache that needs to refresh often likely
│ │ │ │  still wins out on the caching being used side.</p>
│ │ │ │  <p>References: <a class="reference external" href="https://www.sqlalchemy.org/trac/ticket/6072">#6072</a>, <a class="reference external" href="https://www.sqlalchemy.org/trac/ticket/6487">#6487</a></p>
│ │ │ │  </p>
│ │ │ │  </li>
│ │ │ │ -<li><p class="caption" id="change-1.4.18-2"><span class="target" id="change-d2695c12943f278ad9d30faa9fb3f801"><strong>[orm] [bug] [regression]</strong> <a class="changelog-reference headerlink reference internal" href="#change-d2695c12943f278ad9d30faa9fb3f801">¶</a></span><p>Adjusted the means by which classes such as <a class="reference internal" href="../orm/contextual.html#sqlalchemy.orm.scoped_session" title="sqlalchemy.orm.scoped_session"><code class="xref py py-class docutils literal notranslate"><span class="pre">scoped_session</span></code></a>
│ │ │ │ +<li><p class="caption" id="change-1.4.18-1"><span class="target" id="change-d2695c12943f278ad9d30faa9fb3f801"><strong>[orm] [bug] [regression]</strong> <a class="changelog-reference headerlink reference internal" href="#change-d2695c12943f278ad9d30faa9fb3f801">¶</a></span><p>Adjusted the means by which classes such as <a class="reference internal" href="../orm/contextual.html#sqlalchemy.orm.scoped_session" title="sqlalchemy.orm.scoped_session"><code class="xref py py-class docutils literal notranslate"><span class="pre">scoped_session</span></code></a>
│ │ │ │  and <a class="reference internal" href="../orm/extensions/asyncio.html#sqlalchemy.ext.asyncio.AsyncSession" title="sqlalchemy.ext.asyncio.AsyncSession"><code class="xref py py-class docutils literal notranslate"><span class="pre">AsyncSession</span></code></a> are generated from the base
│ │ │ │  <a class="reference internal" href="../orm/session_api.html#sqlalchemy.orm.Session" title="sqlalchemy.orm.Session"><code class="xref py py-class docutils literal notranslate"><span class="pre">Session</span></code></a> class, such that custom <a class="reference internal" href="../orm/session_api.html#sqlalchemy.orm.Session" title="sqlalchemy.orm.Session"><code class="xref py py-class docutils literal notranslate"><span class="pre">Session</span></code></a>
│ │ │ │  subclasses such as that used by Flask-SQLAlchemy don’t need to implement
│ │ │ │  positional arguments when they call into the superclass method, and can
│ │ │ │  continue using the same argument styles as in previous releases.</p>
│ │ │ │  <p>References: <a class="reference external" href="https://www.sqlalchemy.org/trac/ticket/6285">#6285</a></p>
│ │ │ │  </p>
│ │ │ │  </li>
│ │ │ │ -<li><p class="caption" id="change-1.4.18-3"><span class="target" id="change-f63c401b2709ae6721b787d7eda1a013"><strong>[orm] [bug] [regression]</strong> <a class="changelog-reference headerlink reference internal" href="#change-f63c401b2709ae6721b787d7eda1a013">¶</a></span><p>Fixed issue where query production for joinedload against a complex left
│ │ │ │ +<li><p class="caption" id="change-1.4.18-2"><span class="target" id="change-f63c401b2709ae6721b787d7eda1a013"><strong>[orm] [bug] [regression]</strong> <a class="changelog-reference headerlink reference internal" href="#change-f63c401b2709ae6721b787d7eda1a013">¶</a></span><p>Fixed issue where query production for joinedload against a complex left
│ │ │ │  hand side involving joined-table inheritance could fail to produce a
│ │ │ │  correct query, due to a clause adaption issue.</p>
│ │ │ │  <p>References: <a class="reference external" href="https://www.sqlalchemy.org/trac/ticket/6595">#6595</a></p>
│ │ │ │  </p>
│ │ │ │  </li>
│ │ │ │ +<li><p class="caption" id="change-1.4.18-3"><span class="target" id="change-c44bef7c81e356405fc8438d62ed6fb2"><strong>[orm] [bug] [performance] [regression]</strong> <a class="changelog-reference headerlink reference internal" href="#change-c44bef7c81e356405fc8438d62ed6fb2">¶</a></span><p>Fixed regression involving how the ORM would resolve a given mapped column
│ │ │ │ +to a result row, where under cases such as joined eager loading, a slightly
│ │ │ │ +more expensive “fallback” could take place to set up this resolution due to
│ │ │ │ +some logic that was removed since 1.3. The issue could also cause
│ │ │ │ +deprecation warnings involving column resolution to be emitted when using a
│ │ │ │ +1.4 style query with joined eager loading.</p>
│ │ │ │ +<p>References: <a class="reference external" href="https://www.sqlalchemy.org/trac/ticket/6596">#6596</a></p>
│ │ │ │ +</p>
│ │ │ │ +</li>
│ │ │ │  <li><p class="caption" id="change-1.4.18-4"><span class="target" id="change-1695ae48e5e4dad141529f1476931402"><strong>[orm] [bug]</strong> <a class="changelog-reference headerlink reference internal" href="#change-1695ae48e5e4dad141529f1476931402">¶</a></span><p>Fixed issue in experimental “select ORM objects from INSERT/UPDATE” use
│ │ │ │  case where an error was raised if the statement were against a
│ │ │ │  single-table-inheritance subclass.</p>
│ │ │ │  <p>References: <a class="reference external" href="https://www.sqlalchemy.org/trac/ticket/6591">#6591</a></p>
│ │ │ │  </p>
│ │ │ │  </li>
│ │ │ │  <li><p class="caption" id="change-1.4.18-5"><span class="target" id="change-25ff9a8e87b9a1a7c9ad8cefe9c95e05"><strong>[orm] [bug]</strong> <a class="changelog-reference headerlink reference internal" href="#change-25ff9a8e87b9a1a7c9ad8cefe9c95e05">¶</a></span><p>The warning that’s emitted for <a class="reference internal" href="../orm/relationship_api.html#sqlalchemy.orm.relationship" title="sqlalchemy.orm.relationship"><code class="xref py py-func docutils literal notranslate"><span class="pre">relationship()</span></code></a> when multiple
│ │ │ │ @@ -6437,15 +6437,15 @@
│ │ │ │  synonyms can be established linking to these constructs which work
│ │ │ │  fully.   This is a behavior that was semi-explicitly disallowed previously,
│ │ │ │  however since it did not fail in every scenario, explicit support
│ │ │ │  for assoc proxy and hybrids has been added.</p>
│ │ │ │  <p>References: <a class="reference external" href="https://www.sqlalchemy.org/trac/ticket/6267">#6267</a></p>
│ │ │ │  </p>
│ │ │ │  </li>
│ │ │ │ -<li><p class="caption" id="change-1.4.9-1"><span class="target" id="change-eea89cfd38e08bf30c339cd6c6831dec"><strong>[orm] [performance] [bug] [regression] [sql]</strong> <a class="changelog-reference headerlink reference internal" href="#change-eea89cfd38e08bf30c339cd6c6831dec">¶</a></span><p>Fixed a critical performance issue where the traversal of a
│ │ │ │ +<li><p class="caption" id="change-1.4.9-1"><span class="target" id="change-eea89cfd38e08bf30c339cd6c6831dec"><strong>[orm] [bug] [performance] [regression] [sql]</strong> <a class="changelog-reference headerlink reference internal" href="#change-eea89cfd38e08bf30c339cd6c6831dec">¶</a></span><p>Fixed a critical performance issue where the traversal of a
│ │ │ │  <a class="reference internal" href="../core/selectable.html#sqlalchemy.sql.expression.select" title="sqlalchemy.sql.expression.select"><code class="xref py py-func docutils literal notranslate"><span class="pre">select()</span></code></a> construct would traverse a repetitive product of the
│ │ │ │  represented FROM clauses as they were each referenced by columns in
│ │ │ │  the columns clause; for a series of nested subqueries with lots of columns
│ │ │ │  this could cause a large delay and significant memory growth. This
│ │ │ │  traversal is used by a wide variety of SQL and ORM functions, including by
│ │ │ │  the ORM <a class="reference internal" href="../orm/session_api.html#sqlalchemy.orm.Session" title="sqlalchemy.orm.Session"><code class="xref py py-class docutils literal notranslate"><span class="pre">Session</span></code></a> when it’s configured to have
│ │ │ │  “table-per-bind”, which while this is not a common use case, it seems to be
│ │ │ │ @@ -9239,22 +9239,15 @@
│ │ │ │  <div class="admonition seealso">
│ │ │ │  <p class="admonition-title">See also</p>
│ │ │ │  <p><a class="reference internal" href="migration_14.html#change-4710-core"><span class="std std-ref">RowProxy is no longer a “proxy”; is now called Row and behaves like an enhanced named tuple</span></a></p>
│ │ │ │  </div>
│ │ │ │  <p>References: <a class="reference external" href="https://www.sqlalchemy.org/trac/ticket/4710">#4710</a></p>
│ │ │ │  </p>
│ │ │ │  </li>
│ │ │ │ -<li><p class="caption" id="change-1.4.0b1-54"><span class="target" id="change-6bc91a2bef8d8afd244e6dbd38439c4d"><strong>[engine] [performance]</strong> <a class="changelog-reference headerlink reference internal" href="#change-6bc91a2bef8d8afd244e6dbd38439c4d">¶</a></span><p>The pool “pre-ping” feature has been refined to not invoke for a DBAPI
│ │ │ │ -connection that was just opened in the same checkout operation.  pre ping
│ │ │ │ -only applies to a DBAPI connection that’s been checked into the pool
│ │ │ │ -and is being checked out again.</p>
│ │ │ │ -<p>References: <a class="reference external" href="https://www.sqlalchemy.org/trac/ticket/4524">#4524</a></p>
│ │ │ │ -</p>
│ │ │ │ -</li>
│ │ │ │ -<li><p class="caption" id="change-1.4.0b1-55"><span class="target" id="change-d3650b27f4c852ac687ea55326051ed0"><strong>[engine] [performance] [change] [py3k]</strong> <a class="changelog-reference headerlink reference internal" href="#change-d3650b27f4c852ac687ea55326051ed0">¶</a></span><p>Disabled the “unicode returns” check that runs on dialect startup when
│ │ │ │ +<li><p class="caption" id="change-1.4.0b1-54"><span class="target" id="change-d3650b27f4c852ac687ea55326051ed0"><strong>[engine] [change] [performance] [py3k]</strong> <a class="changelog-reference headerlink reference internal" href="#change-d3650b27f4c852ac687ea55326051ed0">¶</a></span><p>Disabled the “unicode returns” check that runs on dialect startup when
│ │ │ │  running under Python 3, which for many years has occurred in order to test
│ │ │ │  the current DBAPI’s behavior for whether or not it returns Python Unicode
│ │ │ │  or Py2K strings for the VARCHAR and NVARCHAR datatypes.  The check still
│ │ │ │  occurs by default under Python 2, however the mechanism to test the
│ │ │ │  behavior will be removed in SQLAlchemy 2.0 when Python 2 support is also
│ │ │ │  removed.</p>
│ │ │ │  <p>This logic was very effective when it was needed, however now that Python 3
│ │ │ │ @@ -9265,14 +9258,21 @@
│ │ │ │  dialect flags by setting the dialect level flag <code class="docutils literal notranslate"><span class="pre">returns_unicode_strings</span></code>
│ │ │ │  to one of <code class="xref py py-attr docutils literal notranslate"><span class="pre">String.RETURNS_CONDITIONAL</span></code> or
│ │ │ │  <code class="xref py py-attr docutils literal notranslate"><span class="pre">String.RETURNS_BYTES</span></code>, both of which will enable Unicode conversion
│ │ │ │  even under Python 3.</p>
│ │ │ │  <p>References: <a class="reference external" href="https://www.sqlalchemy.org/trac/ticket/5315">#5315</a></p>
│ │ │ │  </p>
│ │ │ │  </li>
│ │ │ │ +<li><p class="caption" id="change-1.4.0b1-55"><span class="target" id="change-6bc91a2bef8d8afd244e6dbd38439c4d"><strong>[engine] [performance]</strong> <a class="changelog-reference headerlink reference internal" href="#change-6bc91a2bef8d8afd244e6dbd38439c4d">¶</a></span><p>The pool “pre-ping” feature has been refined to not invoke for a DBAPI
│ │ │ │ +connection that was just opened in the same checkout operation.  pre ping
│ │ │ │ +only applies to a DBAPI connection that’s been checked into the pool
│ │ │ │ +and is being checked out again.</p>
│ │ │ │ +<p>References: <a class="reference external" href="https://www.sqlalchemy.org/trac/ticket/4524">#4524</a></p>
│ │ │ │ +</p>
│ │ │ │ +</li>
│ │ │ │  <li><p class="caption" id="change-1.4.0b1-56"><span class="target" id="change-f8a130923cff752e26f7be9cf1ea18eb"><strong>[engine] [bug]</strong> <a class="changelog-reference headerlink reference internal" href="#change-f8a130923cff752e26f7be9cf1ea18eb">¶</a></span><p>Revised the <a class="reference internal" href="../core/connections.html#sqlalchemy.engine.Connection.execution_options.params.schema_translate_map" title="sqlalchemy.engine.Connection.execution_options"><code class="xref py py-paramref docutils literal notranslate"><span class="pre">Connection.execution_options.schema_translate_map</span></code></a>
│ │ │ │  feature such that the processing of the SQL statement to receive a specific
│ │ │ │  schema name occurs within the execution phase of the statement, rather than
│ │ │ │  at the compile phase.   This is to support the statement being efficiently
│ │ │ │  cached.   Previously, the current schema being rendered into the statement
│ │ │ │  for a particular run would be considered as part of the cache key itself,
│ │ │ │  meaning that for a run against hundreds of schemas, there would be hundreds
│ │ │ │ ├── html2text {}
│ │ │ │ │ @@ -2032,31 +2032,31 @@
│ │ │ │ │  [[oorrmm]] [[uusseeccaassee]] _¶
│ │ │ │ │  Added new attributes _U_p_d_a_t_e_B_a_s_e_._r_e_t_u_r_n_i_n_g___c_o_l_u_m_n___d_e_s_c_r_i_p_t_i_o_n_s and
│ │ │ │ │  _U_p_d_a_t_e_B_a_s_e_._e_n_t_i_t_y___d_e_s_c_r_i_p_t_i_o_n to allow for inspection of ORM attributes and
│ │ │ │ │  entities that are installed as part of an _I_n_s_e_r_t, _U_p_d_a_t_e, or _D_e_l_e_t_e construct.
│ │ │ │ │  The _S_e_l_e_c_t_._c_o_l_u_m_n___d_e_s_c_r_i_p_t_i_o_n_s accessor is also now implemented for Core-only
│ │ │ │ │  selectables.
│ │ │ │ │  References: _#_7_8_6_1
│ │ │ │ │ -[[oorrmm]] [[ppeerrffoorrmmaannccee]] [[bbuugg]] _¶
│ │ │ │ │ -Improvements in memory usage by the ORM, removing a significant set of
│ │ │ │ │ -intermediary expression objects that are typically stored when a copy of an
│ │ │ │ │ -expression object is created. These clones have been greatly reduced, reducing
│ │ │ │ │ -the number of total expression objects stored in memory by ORM mappings by
│ │ │ │ │ -about 30%.
│ │ │ │ │ -References: _#_7_8_2_3
│ │ │ │ │  [[oorrmm]] [[bbuugg]] [[rreeggrreessssiioonn]] _¶
│ │ │ │ │  Fixed regression in “dynamic” loader strategy where the _Q_u_e_r_y_._f_i_l_t_e_r___b_y_(_)
│ │ │ │ │  method would not be given an appropriate entity to filter from, in the case
│ │ │ │ │  where a “secondary” table were present in the relationship being queried and
│ │ │ │ │  the mapping were against something complex such as a “with polymorphic”.
│ │ │ │ │  References: _#_7_8_6_8
│ │ │ │ │  [[oorrmm]] [[bbuugg]] _¶
│ │ │ │ │  Fixed bug where _c_o_m_p_o_s_i_t_e_(_) attributes would not work in conjunction with the
│ │ │ │ │  _s_e_l_e_c_t_i_n___p_o_l_y_m_o_r_p_h_i_c_(_) loader strategy for joined table inheritance.
│ │ │ │ │  References: _#_7_8_0_1
│ │ │ │ │ +[[oorrmm]] [[bbuugg]] [[ppeerrffoorrmmaannccee]] _¶
│ │ │ │ │ +Improvements in memory usage by the ORM, removing a significant set of
│ │ │ │ │ +intermediary expression objects that are typically stored when a copy of an
│ │ │ │ │ +expression object is created. These clones have been greatly reduced, reducing
│ │ │ │ │ +the number of total expression objects stored in memory by ORM mappings by
│ │ │ │ │ +about 30%.
│ │ │ │ │ +References: _#_7_8_2_3
│ │ │ │ │  [[oorrmm]] [[bbuugg]] _¶
│ │ │ │ │  Fixed issue where the _s_e_l_e_c_t_i_n___p_o_l_y_m_o_r_p_h_i_c_(_) loader option would not work with
│ │ │ │ │  joined inheritance mappers that don’t have a fixed “polymorphic_on” column.
│ │ │ │ │  Additionally added test support for a wider variety of usage patterns with this
│ │ │ │ │  construct.
│ │ │ │ │  References: _#_7_7_9_9
│ │ │ │ │  [[oorrmm]] [[bbuugg]] _¶
│ │ │ │ │ @@ -3255,15 +3255,15 @@
│ │ │ │ │      * [[mmssssqqll]] [[bbuugg]] [[rreefflleeccttiioonn]] _¶
│ │ │ │ │        Fixed an issue where sqlalchemy.engine.reflection.has_table() returned
│ │ │ │ │        True for local temporary tables that actually belonged to a different SQL
│ │ │ │ │        Server session (connection). An extra check is now performed to ensure
│ │ │ │ │        that the temp table detected is in fact owned by the current session.
│ │ │ │ │        References: _#_6_9_1_0
│ │ │ │ │  ******** oorraaccllee_?¶ ********
│ │ │ │ │ -    * [[oorraaccllee]] [[ppeerrffoorrmmaannccee]] [[bbuugg]] _¶
│ │ │ │ │ +    * [[oorraaccllee]] [[bbuugg]] [[ppeerrffoorrmmaannccee]] _¶
│ │ │ │ │        Added a CAST(VARCHAR2(128)) to the “table name”, “owner”, and other DDL-
│ │ │ │ │        name parameters as used in reflection queries against Oracle system views
│ │ │ │ │        such as ALL_TABLES, ALL_TAB_CONSTRAINTS, etc to better enable indexing to
│ │ │ │ │        take place against these columns, as they previously would be implicitly
│ │ │ │ │        handled as NVARCHAR2 due to Python’s use of Unicode for strings; these
│ │ │ │ │        columns are documented in all Oracle versions as being VARCHAR2 with
│ │ │ │ │        lengths varying from 30 to 128 characters depending on server version.
│ │ │ │ │ @@ -3763,50 +3763,51 @@
│ │ │ │ │  the INSERT thus triggering SQLAlchemy’s feature of setting IDENTITY INSERT to
│ │ │ │ │  “on”; it’s in this directive where the schema translate map would fail to be
│ │ │ │ │  honored.
│ │ │ │ │  References: _#_6_6_5_8
│ │ │ │ │  ********** 11..44..1188_?¶ **********
│ │ │ │ │  Released: June 10, 2021
│ │ │ │ │  ******** oorrmm_?¶ ********
│ │ │ │ │ -    * [[oorrmm]] [[ppeerrffoorrmmaannccee]] [[bbuugg]] [[rreeggrreessssiioonn]] _¶
│ │ │ │ │ -      Fixed regression involving how the ORM would resolve a given mapped
│ │ │ │ │ -      column to a result row, where under cases such as joined eager loading, a
│ │ │ │ │ -      slightly more expensive “fallback” could take place to set up this
│ │ │ │ │ -      resolution due to some logic that was removed since 1.3. The issue could
│ │ │ │ │ -      also cause deprecation warnings involving column resolution to be emitted
│ │ │ │ │ -      when using a 1.4 style query with joined eager loading.
│ │ │ │ │ -      References: _#_6_5_9_6
│ │ │ │ │ -[[oorrmm]] [[bbuugg]] _¶
│ │ │ │ │ -Clarified the current purpose of the _r_e_l_a_t_i_o_n_s_h_i_p_._b_a_k_e___q_u_e_r_i_e_s flag, which in
│ │ │ │ │ -1.4 is to enable or disable “lambda caching” of statements within the
│ │ │ │ │ -“lazyload” and “selectinload” loader strategies; this is separate from the more
│ │ │ │ │ -foundational SQL query cache that is used for most statements. Additionally,
│ │ │ │ │ -the lazy loader no longer uses its own cache for many-to-one SQL queries, which
│ │ │ │ │ -was an implementation quirk that doesn’t exist for any other loader scenario.
│ │ │ │ │ -Finally, the “lru cache” warning that the lazyloader and selectinloader
│ │ │ │ │ -strategies could emit when handling a wide array of class/relationship
│ │ │ │ │ -combinations has been removed; based on analysis of some end-user cases, this
│ │ │ │ │ -warning doesn’t suggest any significant issue. While setting bake_queries=False
│ │ │ │ │ -for such a relationship will remove this cache from being used, there’s no
│ │ │ │ │ -particular performance gain in this case as using no caching vs. using a cache
│ │ │ │ │ -that needs to refresh often likely still wins out on the caching being used
│ │ │ │ │ -side.
│ │ │ │ │ -References: _#_6_0_7_2, _#_6_4_8_7
│ │ │ │ │ +    * [[oorrmm]] [[bbuugg]] _¶
│ │ │ │ │ +      Clarified the current purpose of the _r_e_l_a_t_i_o_n_s_h_i_p_._b_a_k_e___q_u_e_r_i_e_s flag,
│ │ │ │ │ +      which in 1.4 is to enable or disable “lambda caching” of statements
│ │ │ │ │ +      within the “lazyload” and “selectinload” loader strategies; this is
│ │ │ │ │ +      separate from the more foundational SQL query cache that is used for most
│ │ │ │ │ +      statements. Additionally, the lazy loader no longer uses its own cache
│ │ │ │ │ +      for many-to-one SQL queries, which was an implementation quirk that
│ │ │ │ │ +      doesn’t exist for any other loader scenario. Finally, the “lru cache”
│ │ │ │ │ +      warning that the lazyloader and selectinloader strategies could emit when
│ │ │ │ │ +      handling a wide array of class/relationship combinations has been
│ │ │ │ │ +      removed; based on analysis of some end-user cases, this warning doesn’t
│ │ │ │ │ +      suggest any significant issue. While setting bake_queries=False for such
│ │ │ │ │ +      a relationship will remove this cache from being used, there’s no
│ │ │ │ │ +      particular performance gain in this case as using no caching vs. using a
│ │ │ │ │ +      cache that needs to refresh often likely still wins out on the caching
│ │ │ │ │ +      being used side.
│ │ │ │ │ +      References: _#_6_0_7_2, _#_6_4_8_7
│ │ │ │ │  [[oorrmm]] [[bbuugg]] [[rreeggrreessssiioonn]] _¶
│ │ │ │ │  Adjusted the means by which classes such as _s_c_o_p_e_d___s_e_s_s_i_o_n and _A_s_y_n_c_S_e_s_s_i_o_n are
│ │ │ │ │  generated from the base _S_e_s_s_i_o_n class, such that custom _S_e_s_s_i_o_n subclasses such
│ │ │ │ │  as that used by Flask-SQLAlchemy don’t need to implement positional arguments
│ │ │ │ │  when they call into the superclass method, and can continue using the same
│ │ │ │ │  argument styles as in previous releases.
│ │ │ │ │  References: _#_6_2_8_5
│ │ │ │ │  [[oorrmm]] [[bbuugg]] [[rreeggrreessssiioonn]] _¶
│ │ │ │ │  Fixed issue where query production for joinedload against a complex left hand
│ │ │ │ │  side involving joined-table inheritance could fail to produce a correct query,
│ │ │ │ │  due to a clause adaption issue.
│ │ │ │ │  References: _#_6_5_9_5
│ │ │ │ │ +[[oorrmm]] [[bbuugg]] [[ppeerrffoorrmmaannccee]] [[rreeggrreessssiioonn]] _¶
│ │ │ │ │ +Fixed regression involving how the ORM would resolve a given mapped column to a
│ │ │ │ │ +result row, where under cases such as joined eager loading, a slightly more
│ │ │ │ │ +expensive “fallback” could take place to set up this resolution due to some
│ │ │ │ │ +logic that was removed since 1.3. The issue could also cause deprecation
│ │ │ │ │ +warnings involving column resolution to be emitted when using a 1.4 style query
│ │ │ │ │ +with joined eager loading.
│ │ │ │ │ +References: _#_6_5_9_6
│ │ │ │ │  [[oorrmm]] [[bbuugg]] _¶
│ │ │ │ │  Fixed issue in experimental “select ORM objects from INSERT/UPDATE” use case
│ │ │ │ │  where an error was raised if the statement were against a single-table-
│ │ │ │ │  inheritance subclass.
│ │ │ │ │  References: _#_6_5_9_1
│ │ │ │ │  [[oorrmm]] [[bbuugg]] _¶
│ │ │ │ │  The warning that’s emitted for _r_e_l_a_t_i_o_n_s_h_i_p_(_) when multiple relationships would
│ │ │ │ │ @@ -4376,15 +4377,15 @@
│ │ │ │ │        Established support for synoynm() in conjunction with hybrid property,
│ │ │ │ │        assocaitionproxy is set up completely, including that synonyms can be
│ │ │ │ │        established linking to these constructs which work fully. This is a
│ │ │ │ │        behavior that was semi-explicitly disallowed previously, however since it
│ │ │ │ │        did not fail in every scenario, explicit support for assoc proxy and
│ │ │ │ │        hybrids has been added.
│ │ │ │ │        References: _#_6_2_6_7
│ │ │ │ │ -[[oorrmm]] [[ppeerrffoorrmmaannccee]] [[bbuugg]] [[rreeggrreessssiioonn]] [[ssqqll]] _¶
│ │ │ │ │ +[[oorrmm]] [[bbuugg]] [[ppeerrffoorrmmaannccee]] [[rreeggrreessssiioonn]] [[ssqqll]] _¶
│ │ │ │ │  Fixed a critical performance issue where the traversal of a _s_e_l_e_c_t_(_) construct
│ │ │ │ │  would traverse a repetitive product of the represented FROM clauses as they
│ │ │ │ │  were each referenced by columns in the columns clause; for a series of nested
│ │ │ │ │  subqueries with lots of columns this could cause a large delay and significant
│ │ │ │ │  memory growth. This traversal is used by a wide variety of SQL and ORM
│ │ │ │ │  functions, including by the ORM _S_e_s_s_i_o_n when it’s configured to have “table-
│ │ │ │ │  per-bind”, which while this is not a common use case, it seems to be what
│ │ │ │ │ @@ -6354,21 +6355,15 @@
│ │ │ │ │  returned by the ResultProxy is now the LegacyRow subclass, which maintains
│ │ │ │ │  mapping/tuple hybrid behavior, however the base _R_o_w class now behaves more
│ │ │ │ │  fully like a named tuple.
│ │ │ │ │  See also
│ │ │ │ │  _R_o_w_P_r_o_x_y_ _i_s_ _n_o_ _l_o_n_g_e_r_ _a_ _“_p_r_o_x_y_”_;_ _i_s_ _n_o_w_ _c_a_l_l_e_d_ _R_o_w_ _a_n_d_ _b_e_h_a_v_e_s_ _l_i_k_e_ _a_n_ _e_n_h_a_n_c_e_d
│ │ │ │ │  _n_a_m_e_d_ _t_u_p_l_e
│ │ │ │ │  References: _#_4_7_1_0
│ │ │ │ │ -[[eennggiinnee]] [[ppeerrffoorrmmaannccee]] _¶
│ │ │ │ │ -The pool “pre-ping” feature has been refined to not invoke for a DBAPI
│ │ │ │ │ -connection that was just opened in the same checkout operation. pre ping only
│ │ │ │ │ -applies to a DBAPI connection that’s been checked into the pool and is being
│ │ │ │ │ -checked out again.
│ │ │ │ │ -References: _#_4_5_2_4
│ │ │ │ │ -[[eennggiinnee]] [[ppeerrffoorrmmaannccee]] [[cchhaannggee]] [[ppyy33kk]] _¶
│ │ │ │ │ +[[eennggiinnee]] [[cchhaannggee]] [[ppeerrffoorrmmaannccee]] [[ppyy33kk]] _¶
│ │ │ │ │  Disabled the “unicode returns” check that runs on dialect startup when running
│ │ │ │ │  under Python 3, which for many years has occurred in order to test the current
│ │ │ │ │  DBAPI’s behavior for whether or not it returns Python Unicode or Py2K strings
│ │ │ │ │  for the VARCHAR and NVARCHAR datatypes. The check still occurs by default under
│ │ │ │ │  Python 2, however the mechanism to test the behavior will be removed in
│ │ │ │ │  SQLAlchemy 2.0 when Python 2 support is also removed.
│ │ │ │ │  This logic was very effective when it was needed, however now that Python 3 is
│ │ │ │ │ @@ -6376,14 +6371,20 @@
│ │ │ │ │  datatypes. In the unlikely case that a third party DBAPI does not support this,
│ │ │ │ │  the conversion logic within _S_t_r_i_n_g is still available and the third party
│ │ │ │ │  dialect may specify this in its upfront dialect flags by setting the dialect
│ │ │ │ │  level flag returns_unicode_strings to one of String.RETURNS_CONDITIONAL or
│ │ │ │ │  String.RETURNS_BYTES, both of which will enable Unicode conversion even under
│ │ │ │ │  Python 3.
│ │ │ │ │  References: _#_5_3_1_5
│ │ │ │ │ +[[eennggiinnee]] [[ppeerrffoorrmmaannccee]] _¶
│ │ │ │ │ +The pool “pre-ping” feature has been refined to not invoke for a DBAPI
│ │ │ │ │ +connection that was just opened in the same checkout operation. pre ping only
│ │ │ │ │ +applies to a DBAPI connection that’s been checked into the pool and is being
│ │ │ │ │ +checked out again.
│ │ │ │ │ +References: _#_4_5_2_4
│ │ │ │ │  [[eennggiinnee]] [[bbuugg]] _¶
│ │ │ │ │  Revised the _C_o_n_n_e_c_t_i_o_n_._e_x_e_c_u_t_i_o_n___o_p_t_i_o_n_s_._s_c_h_e_m_a___t_r_a_n_s_l_a_t_e___m_a_p feature such that
│ │ │ │ │  the processing of the SQL statement to receive a specific schema name occurs
│ │ │ │ │  within the execution phase of the statement, rather than at the compile phase.
│ │ │ │ │  This is to support the statement being efficiently cached. Previously, the
│ │ │ │ │  current schema being rendered into the statement for a particular run would be
│ │ │ │ │  considered as part of the cache key itself, meaning that for a run against
│ │ │ ├── ./usr/share/doc/python-sqlalchemy-doc/html/changelog/changelog_20.html
│ │ │ │ @@ -1573,32 +1573,32 @@
│ │ │ │  </section>
│ │ │ │  </section>
│ │ │ │  <section id="change-2.0.28">
│ │ │ │  <h2 class="release-version">2.0.28<a class="headerlink" href="#change-2.0.28" title="Link to this heading">¶</a></h2>
│ │ │ │  Released: March 4, 2024<section id="change-2.0.28-orm">
│ │ │ │  <h3>orm<a class="headerlink" href="#change-2.0.28-orm" title="Link to this heading">¶</a></h3>
│ │ │ │  <ul class="simple">
│ │ │ │ -<li><p class="caption" id="change-2.0.28-0"><span class="target" id="change-ac3f7e555f345c82b2b07b34069c7489"><strong>[orm] [performance] [bug] [regression]</strong> <a class="changelog-reference headerlink reference internal" href="#change-ac3f7e555f345c82b2b07b34069c7489">¶</a></span><p>Adjusted the fix made in <a class="reference external" href="https://www.sqlalchemy.org/trac/ticket/10570">#10570</a>, released in 2.0.23, where new
│ │ │ │ +<li><p class="caption" id="change-2.0.28-0"><span class="target" id="change-ca93d357e1ca5e34cc36df2518a3264f"><strong>[orm] [bug] [regression]</strong> <a class="changelog-reference headerlink reference internal" href="#change-ca93d357e1ca5e34cc36df2518a3264f">¶</a></span><p>Fixed regression caused by <a class="reference external" href="https://www.sqlalchemy.org/trac/ticket/9779">#9779</a> where using the “secondary” table
│ │ │ │ +in a relationship <code class="docutils literal notranslate"><span class="pre">and_()</span></code> expression would fail to be aliased to match
│ │ │ │ +how the “secondary” table normally renders within a
│ │ │ │ +<a class="reference internal" href="../core/selectable.html#sqlalchemy.sql.expression.Select.join" title="sqlalchemy.sql.expression.Select.join"><code class="xref py py-meth docutils literal notranslate"><span class="pre">Select.join()</span></code></a> expression, leading to an invalid query.</p>
│ │ │ │ +<p>References: <a class="reference external" href="https://www.sqlalchemy.org/trac/ticket/11010">#11010</a></p>
│ │ │ │ +</p>
│ │ │ │ +</li>
│ │ │ │ +<li><p class="caption" id="change-2.0.28-1"><span class="target" id="change-ac3f7e555f345c82b2b07b34069c7489"><strong>[orm] [bug] [performance] [regression]</strong> <a class="changelog-reference headerlink reference internal" href="#change-ac3f7e555f345c82b2b07b34069c7489">¶</a></span><p>Adjusted the fix made in <a class="reference external" href="https://www.sqlalchemy.org/trac/ticket/10570">#10570</a>, released in 2.0.23, where new
│ │ │ │  logic was added to reconcile possibly changing bound parameter values
│ │ │ │  across cache key generations used within the <a class="reference internal" href="../orm/queryguide/columns.html#sqlalchemy.orm.with_expression" title="sqlalchemy.orm.with_expression"><code class="xref py py-func docutils literal notranslate"><span class="pre">with_expression()</span></code></a>
│ │ │ │  construct.  The new logic changes the approach by which the new bound
│ │ │ │  parameter values are associated with the statement, avoiding the need to
│ │ │ │  deep-copy the statement which can result in a significant performance
│ │ │ │  penalty for very deep / complex SQL constructs.  The new approach no longer
│ │ │ │  requires this deep-copy step.</p>
│ │ │ │  <p>References: <a class="reference external" href="https://www.sqlalchemy.org/trac/ticket/11085">#11085</a></p>
│ │ │ │  </p>
│ │ │ │  </li>
│ │ │ │ -<li><p class="caption" id="change-2.0.28-1"><span class="target" id="change-ca93d357e1ca5e34cc36df2518a3264f"><strong>[orm] [bug] [regression]</strong> <a class="changelog-reference headerlink reference internal" href="#change-ca93d357e1ca5e34cc36df2518a3264f">¶</a></span><p>Fixed regression caused by <a class="reference external" href="https://www.sqlalchemy.org/trac/ticket/9779">#9779</a> where using the “secondary” table
│ │ │ │ -in a relationship <code class="docutils literal notranslate"><span class="pre">and_()</span></code> expression would fail to be aliased to match
│ │ │ │ -how the “secondary” table normally renders within a
│ │ │ │ -<a class="reference internal" href="../core/selectable.html#sqlalchemy.sql.expression.Select.join" title="sqlalchemy.sql.expression.Select.join"><code class="xref py py-meth docutils literal notranslate"><span class="pre">Select.join()</span></code></a> expression, leading to an invalid query.</p>
│ │ │ │ -<p>References: <a class="reference external" href="https://www.sqlalchemy.org/trac/ticket/11010">#11010</a></p>
│ │ │ │ -</p>
│ │ │ │ -</li>
│ │ │ │  </ul>
│ │ │ │  </section>
│ │ │ │  <section id="change-2.0.28-engine">
│ │ │ │  <h3>engine<a class="headerlink" href="#change-2.0.28-engine" title="Link to this heading">¶</a></h3>
│ │ │ │  <ul class="simple">
│ │ │ │  <li><p class="caption" id="change-2.0.28-2"><span class="target" id="change-b606388dd30614a5fe35a7de2b6c8c6f"><strong>[engine] [usecase]</strong> <a class="changelog-reference headerlink reference internal" href="#change-b606388dd30614a5fe35a7de2b6c8c6f">¶</a></span><p>Added new core execution option
│ │ │ │  <a class="reference internal" href="../core/connections.html#sqlalchemy.engine.Connection.execution_options.params.preserve_rowcount" title="sqlalchemy.engine.Connection.execution_options"><code class="xref py py-paramref docutils literal notranslate"><span class="pre">Connection.execution_options.preserve_rowcount</span></code></a>. When
│ │ │ │ @@ -1831,15 +1831,15 @@
│ │ │ │  </p>
│ │ │ │  </li>
│ │ │ │  </ul>
│ │ │ │  </section>
│ │ │ │  <section id="change-2.0.26-oracle">
│ │ │ │  <h3>oracle<a class="headerlink" href="#change-2.0.26-oracle" title="Link to this heading">¶</a></h3>
│ │ │ │  <ul class="simple">
│ │ │ │ -<li><p class="caption" id="change-2.0.26-17"><span class="target" id="change-2f52e064b693a9bdcdced00a0086ec1c"><strong>[oracle] [performance] [bug]</strong> <a class="changelog-reference headerlink reference internal" href="#change-2f52e064b693a9bdcdced00a0086ec1c">¶</a></span><p>Changed the default arraysize of the Oracle dialects so that the value set
│ │ │ │ +<li><p class="caption" id="change-2.0.26-17"><span class="target" id="change-2f52e064b693a9bdcdced00a0086ec1c"><strong>[oracle] [bug] [performance]</strong> <a class="changelog-reference headerlink reference internal" href="#change-2f52e064b693a9bdcdced00a0086ec1c">¶</a></span><p>Changed the default arraysize of the Oracle dialects so that the value set
│ │ │ │  by the driver is used, that is 100 at the time of writing for both
│ │ │ │  cx_oracle and oracledb. Previously the value was set to 50 by default. The
│ │ │ │  setting of 50 could cause significant performance regressions compared to
│ │ │ │  when using cx_oracle/oracledb alone to fetch many hundreds of rows over
│ │ │ │  slower networks.</p>
│ │ │ │  <p>References: <a class="reference external" href="https://www.sqlalchemy.org/trac/ticket/10877">#10877</a></p>
│ │ │ │  </p>
│ │ │ │ @@ -6073,39 +6073,39 @@
│ │ │ │  <a class="reference internal" href="../orm/relationship_api.html#sqlalchemy.orm.relationship" title="sqlalchemy.orm.relationship"><code class="xref py py-func docutils literal notranslate"><span class="pre">relationship()</span></code></a> etc. to provide for the Python dataclasses
│ │ │ │  <code class="docutils literal notranslate"><span class="pre">compare</span></code> parameter on <code class="docutils literal notranslate"><span class="pre">field()</span></code>, when using the
│ │ │ │  <a class="reference internal" href="../orm/dataclasses.html#orm-declarative-native-dataclasses"><span class="std std-ref">Declarative Dataclass Mapping</span></a> feature. Pull request courtesy
│ │ │ │  Simon Schiele.</p>
│ │ │ │  <p>References: <a class="reference external" href="https://www.sqlalchemy.org/trac/ticket/8905">#8905</a></p>
│ │ │ │  </p>
│ │ │ │  </li>
│ │ │ │ -<li><p class="caption" id="change-2.0.0b4-3"><span class="target" id="change-07f17a72e4306f956d2c45a0a711d34c"><strong>[orm] [performance] [bug]</strong> <a class="changelog-reference headerlink reference internal" href="#change-07f17a72e4306f956d2c45a0a711d34c">¶</a></span><p>Additional performance enhancements within ORM-enabled SQL statements,
│ │ │ │ -specifically targeting callcounts within the construction of ORM
│ │ │ │ -statements, using combinations of <a class="reference internal" href="../orm/queryguide/api.html#sqlalchemy.orm.aliased" title="sqlalchemy.orm.aliased"><code class="xref py py-func docutils literal notranslate"><span class="pre">aliased()</span></code></a> with
│ │ │ │ -<a class="reference internal" href="../core/selectable.html#sqlalchemy.sql.expression.union" title="sqlalchemy.sql.expression.union"><code class="xref py py-func docutils literal notranslate"><span class="pre">union()</span></code></a> and similar “compound” constructs, in addition to direct
│ │ │ │ -performance improvements to the <code class="docutils literal notranslate"><span class="pre">corresponding_column()</span></code> internal method
│ │ │ │ -that is used heavily by the ORM by constructs like <a class="reference internal" href="../orm/queryguide/api.html#sqlalchemy.orm.aliased" title="sqlalchemy.orm.aliased"><code class="xref py py-func docutils literal notranslate"><span class="pre">aliased()</span></code></a> and
│ │ │ │ -similar.</p>
│ │ │ │ -<p>References: <a class="reference external" href="https://www.sqlalchemy.org/trac/ticket/8796">#8796</a></p>
│ │ │ │ -</p>
│ │ │ │ -</li>
│ │ │ │ -<li><p class="caption" id="change-2.0.0b4-4"><span class="target" id="change-36bb3ef310ce109a6974abb1f01249b5"><strong>[orm] [bug]</strong> <a class="changelog-reference headerlink reference internal" href="#change-36bb3ef310ce109a6974abb1f01249b5">¶</a></span><p>Fixed issue where use of an unknown datatype within a <a class="reference internal" href="../orm/internals.html#sqlalchemy.orm.Mapped" title="sqlalchemy.orm.Mapped"><code class="xref py py-class docutils literal notranslate"><span class="pre">Mapped</span></code></a>
│ │ │ │ +<li><p class="caption" id="change-2.0.0b4-3"><span class="target" id="change-36bb3ef310ce109a6974abb1f01249b5"><strong>[orm] [bug]</strong> <a class="changelog-reference headerlink reference internal" href="#change-36bb3ef310ce109a6974abb1f01249b5">¶</a></span><p>Fixed issue where use of an unknown datatype within a <a class="reference internal" href="../orm/internals.html#sqlalchemy.orm.Mapped" title="sqlalchemy.orm.Mapped"><code class="xref py py-class docutils literal notranslate"><span class="pre">Mapped</span></code></a>
│ │ │ │  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.</p>
│ │ │ │  <p>References: <a class="reference external" href="https://www.sqlalchemy.org/trac/ticket/8888">#8888</a></p>
│ │ │ │  </p>
│ │ │ │  </li>
│ │ │ │ -<li><p class="caption" id="change-2.0.0b4-5"><span class="target" id="change-8f97eef21ad80d54b13f789e3be204fc"><strong>[orm] [bug]</strong> <a class="changelog-reference headerlink reference internal" href="#change-8f97eef21ad80d54b13f789e3be204fc">¶</a></span><p>Fixed a suite of issues involving <a class="reference internal" href="../orm/internals.html#sqlalchemy.orm.Mapped" title="sqlalchemy.orm.Mapped"><code class="xref py py-class docutils literal notranslate"><span class="pre">Mapped</span></code></a> use with dictionary
│ │ │ │ +<li><p class="caption" id="change-2.0.0b4-4"><span class="target" id="change-8f97eef21ad80d54b13f789e3be204fc"><strong>[orm] [bug]</strong> <a class="changelog-reference headerlink reference internal" href="#change-8f97eef21ad80d54b13f789e3be204fc">¶</a></span><p>Fixed a suite of issues involving <a class="reference internal" href="../orm/internals.html#sqlalchemy.orm.Mapped" title="sqlalchemy.orm.Mapped"><code class="xref py py-class docutils literal notranslate"><span class="pre">Mapped</span></code></a> use with dictionary
│ │ │ │  types, such as <code class="docutils literal notranslate"><span class="pre">Mapped[Dict[str,</span> <span class="pre">str]</span> <span class="pre">|</span> <span class="pre">None]</span></code>, would not be correctly
│ │ │ │  interpreted in Declarative ORM mappings. Support to correctly
│ │ │ │  “de-optionalize” this type including for lookup in <code class="docutils literal notranslate"><span class="pre">type_annotation_map</span></code>
│ │ │ │  has been fixed.</p>
│ │ │ │  <p>References: <a class="reference external" href="https://www.sqlalchemy.org/trac/ticket/8777">#8777</a></p>
│ │ │ │  </p>
│ │ │ │  </li>
│ │ │ │ +<li><p class="caption" id="change-2.0.0b4-5"><span class="target" id="change-07f17a72e4306f956d2c45a0a711d34c"><strong>[orm] [bug] [performance]</strong> <a class="changelog-reference headerlink reference internal" href="#change-07f17a72e4306f956d2c45a0a711d34c">¶</a></span><p>Additional performance enhancements within ORM-enabled SQL statements,
│ │ │ │ +specifically targeting callcounts within the construction of ORM
│ │ │ │ +statements, using combinations of <a class="reference internal" href="../orm/queryguide/api.html#sqlalchemy.orm.aliased" title="sqlalchemy.orm.aliased"><code class="xref py py-func docutils literal notranslate"><span class="pre">aliased()</span></code></a> with
│ │ │ │ +<a class="reference internal" href="../core/selectable.html#sqlalchemy.sql.expression.union" title="sqlalchemy.sql.expression.union"><code class="xref py py-func docutils literal notranslate"><span class="pre">union()</span></code></a> and similar “compound” constructs, in addition to direct
│ │ │ │ +performance improvements to the <code class="docutils literal notranslate"><span class="pre">corresponding_column()</span></code> internal method
│ │ │ │ +that is used heavily by the ORM by constructs like <a class="reference internal" href="../orm/queryguide/api.html#sqlalchemy.orm.aliased" title="sqlalchemy.orm.aliased"><code class="xref py py-func docutils literal notranslate"><span class="pre">aliased()</span></code></a> and
│ │ │ │ +similar.</p>
│ │ │ │ +<p>References: <a class="reference external" href="https://www.sqlalchemy.org/trac/ticket/8796">#8796</a></p>
│ │ │ │ +</p>
│ │ │ │ +</li>
│ │ │ │  <li><p class="caption" id="change-2.0.0b4-6"><span class="target" id="change-e02cade6952e8afe79edf480a3932a25"><strong>[orm] [bug]</strong> <a class="changelog-reference headerlink reference internal" href="#change-e02cade6952e8afe79edf480a3932a25">¶</a></span><p>Fixed bug in <a class="reference internal" href="../orm/dataclasses.html#orm-declarative-native-dataclasses"><span class="std std-ref">Declarative Dataclass Mapping</span></a> feature where using
│ │ │ │  plain dataclass fields with the <code class="docutils literal notranslate"><span class="pre">__allow_unmapped__</span></code> directive in a
│ │ │ │  mapping would not create a dataclass with the correct class-level state for
│ │ │ │  those fields, copying the raw <code class="docutils literal notranslate"><span class="pre">Field</span></code> object to the class inappropriately
│ │ │ │  after dataclasses itself had replaced the <code class="docutils literal notranslate"><span class="pre">Field</span></code> object with the
│ │ │ │  class-level default value.</p>
│ │ │ │  <p>References: <a class="reference external" href="https://www.sqlalchemy.org/trac/ticket/8880">#8880</a></p>
│ │ │ │ @@ -7935,46 +7935,32 @@
│ │ │ │  </p>
│ │ │ │  </li>
│ │ │ │  <li><p class="caption" id="change-2.0.0b1-85"><span class="target" id="change-0a487b939ab3ad7ca93ee291b91eb410"><strong>[sqlite] [usecase]</strong> <a class="changelog-reference headerlink reference internal" href="#change-0a487b939ab3ad7ca93ee291b91eb410">¶</a></span><p>Added RETURNING support for the SQLite dialect.  SQLite supports RETURNING
│ │ │ │  since version 3.35.</p>
│ │ │ │  <p>References: <a class="reference external" href="https://www.sqlalchemy.org/trac/ticket/6195">#6195</a></p>
│ │ │ │  </p>
│ │ │ │  </li>
│ │ │ │ -<li><p class="caption" id="change-2.0.0b1-86"><span class="target" id="change-ef6ce799a34b30832a9c8115e2afa920"><strong>[sqlite] [usecase]</strong> <a class="changelog-reference headerlink reference internal" href="#change-ef6ce799a34b30832a9c8115e2afa920">¶</a></span><p>The SQLite dialect now supports UPDATE..FROM syntax, for UPDATE statements
│ │ │ │ -that may refer to additional tables within the WHERE criteria of the
│ │ │ │ -statement without the need to use subqueries. This syntax is invoked
│ │ │ │ -automatically when using the <a class="reference internal" href="../core/dml.html#sqlalchemy.sql.expression.Update" title="sqlalchemy.sql.expression.Update"><code class="xref py py-class docutils literal notranslate"><span class="pre">Update</span></code></a> construct when more than
│ │ │ │ -one table or other entity or selectable is used.</p>
│ │ │ │ -<p>References: <a class="reference external" href="https://www.sqlalchemy.org/trac/ticket/7185">#7185</a></p>
│ │ │ │ -</p>
│ │ │ │ -</li>
│ │ │ │ -<li><p class="caption" id="change-2.0.0b1-87"><span class="target" id="change-aba109875059299e0eb82359b5825416"><strong>[sqlite] [performance] [bug]</strong> <a class="changelog-reference headerlink reference internal" href="#change-aba109875059299e0eb82359b5825416">¶</a></span><p>The SQLite dialect now defaults to <a class="reference internal" href="../core/pooling.html#sqlalchemy.pool.QueuePool" title="sqlalchemy.pool.QueuePool"><code class="xref py py-class docutils literal notranslate"><span class="pre">QueuePool</span></code></a> when a file
│ │ │ │ -based database is used. This is set along with setting the
│ │ │ │ -<code class="docutils literal notranslate"><span class="pre">check_same_thread</span></code> parameter to <code class="docutils literal notranslate"><span class="pre">False</span></code>. It has been observed that the
│ │ │ │ -previous approach of defaulting to <a class="reference internal" href="../core/pooling.html#sqlalchemy.pool.NullPool" title="sqlalchemy.pool.NullPool"><code class="xref py py-class docutils literal notranslate"><span class="pre">NullPool</span></code></a>, which does not
│ │ │ │ -hold onto database connections after they are released, did in fact have a
│ │ │ │ -measurable negative performance impact. As always, the pool class is
│ │ │ │ -customizable via the <a class="reference internal" href="../core/engines.html#sqlalchemy.create_engine.params.poolclass" title="sqlalchemy.create_engine"><code class="xref py py-paramref docutils literal notranslate"><span class="pre">create_engine.poolclass</span></code></a> parameter.</p>
│ │ │ │ -<div class="admonition seealso">
│ │ │ │ -<p class="admonition-title">See also</p>
│ │ │ │ -<p><a class="reference internal" href="whatsnew_20.html#change-7490"><span class="std std-ref">The SQLite dialect uses QueuePool for file-based databases</span></a></p>
│ │ │ │ -</div>
│ │ │ │ -<p>References: <a class="reference external" href="https://www.sqlalchemy.org/trac/ticket/7490">#7490</a></p>
│ │ │ │ -</p>
│ │ │ │ -</li>
│ │ │ │ -<li><p class="caption" id="change-2.0.0b1-88"><span class="target" id="change-74fee584f531c832d0d97ea94be754b8"><strong>[sqlite] [performance] [usecase]</strong> <a class="changelog-reference headerlink reference internal" href="#change-74fee584f531c832d0d97ea94be754b8">¶</a></span><p>SQLite datetime, date, and time datatypes now use Python standard lib
│ │ │ │ +<li><p class="caption" id="change-2.0.0b1-86"><span class="target" id="change-74fee584f531c832d0d97ea94be754b8"><strong>[sqlite] [usecase] [performance]</strong> <a class="changelog-reference headerlink reference internal" href="#change-74fee584f531c832d0d97ea94be754b8">¶</a></span><p>SQLite datetime, date, and time datatypes now use Python standard lib
│ │ │ │  <code class="docutils literal notranslate"><span class="pre">fromisoformat()</span></code> methods in order to parse incoming datetime, date, and
│ │ │ │  time string values. This improves performance vs. the previous regular
│ │ │ │  expression-based approach, and also automatically accommodates for datetime
│ │ │ │  and time formats that contain either a six-digit “microseconds” format or a
│ │ │ │  three-digit “milliseconds” format.</p>
│ │ │ │  <p>References: <a class="reference external" href="https://www.sqlalchemy.org/trac/ticket/7029">#7029</a></p>
│ │ │ │  </p>
│ │ │ │  </li>
│ │ │ │ -<li><p class="caption" id="change-2.0.0b1-89"><span class="target" id="change-b11607250a6e056103e2b2d1205be1a8"><strong>[sqlite] [bug]</strong> <a class="changelog-reference headerlink reference internal" href="#change-b11607250a6e056103e2b2d1205be1a8">¶</a></span><p>Removed the warning that emits from the <a class="reference internal" href="../core/type_basics.html#sqlalchemy.types.Numeric" title="sqlalchemy.types.Numeric"><code class="xref py py-class docutils literal notranslate"><span class="pre">Numeric</span></code></a> type about
│ │ │ │ +<li><p class="caption" id="change-2.0.0b1-87"><span class="target" id="change-ef6ce799a34b30832a9c8115e2afa920"><strong>[sqlite] [usecase]</strong> <a class="changelog-reference headerlink reference internal" href="#change-ef6ce799a34b30832a9c8115e2afa920">¶</a></span><p>The SQLite dialect now supports UPDATE..FROM syntax, for UPDATE statements
│ │ │ │ +that may refer to additional tables within the WHERE criteria of the
│ │ │ │ +statement without the need to use subqueries. This syntax is invoked
│ │ │ │ +automatically when using the <a class="reference internal" href="../core/dml.html#sqlalchemy.sql.expression.Update" title="sqlalchemy.sql.expression.Update"><code class="xref py py-class docutils literal notranslate"><span class="pre">Update</span></code></a> construct when more than
│ │ │ │ +one table or other entity or selectable is used.</p>
│ │ │ │ +<p>References: <a class="reference external" href="https://www.sqlalchemy.org/trac/ticket/7185">#7185</a></p>
│ │ │ │ +</p>
│ │ │ │ +</li>
│ │ │ │ +<li><p class="caption" id="change-2.0.0b1-88"><span class="target" id="change-b11607250a6e056103e2b2d1205be1a8"><strong>[sqlite] [bug]</strong> <a class="changelog-reference headerlink reference internal" href="#change-b11607250a6e056103e2b2d1205be1a8">¶</a></span><p>Removed the warning that emits from the <a class="reference internal" href="../core/type_basics.html#sqlalchemy.types.Numeric" title="sqlalchemy.types.Numeric"><code class="xref py py-class docutils literal notranslate"><span class="pre">Numeric</span></code></a> type about
│ │ │ │  DBAPIs not supporting Decimal values natively. This warning was oriented
│ │ │ │  towards SQLite, which does not have any real way without additional
│ │ │ │  extensions or workarounds of handling precision numeric values more than 15
│ │ │ │  significant digits as it only uses floating point math to represent
│ │ │ │  numbers. As this is a known and documented limitation in SQLite itself, and
│ │ │ │  not a quirk of the pysqlite driver, there’s no need for SQLAlchemy to warn
│ │ │ │  for this. The change does not otherwise modify how precision numerics are
│ │ │ │ @@ -7982,14 +7968,28 @@
│ │ │ │  as configured with the <a class="reference internal" href="../core/type_basics.html#sqlalchemy.types.Numeric" title="sqlalchemy.types.Numeric"><code class="xref py py-class docutils literal notranslate"><span class="pre">Numeric</span></code></a>, <a class="reference internal" href="../core/type_basics.html#sqlalchemy.types.Float" title="sqlalchemy.types.Float"><code class="xref py py-class docutils literal notranslate"><span class="pre">Float</span></code></a> , and
│ │ │ │  related datatypes, just without the ability to maintain precision beyond 15
│ │ │ │  significant digits when using SQLite, unless alternate representations such
│ │ │ │  as strings are used.</p>
│ │ │ │  <p>References: <a class="reference external" href="https://www.sqlalchemy.org/trac/ticket/7299">#7299</a></p>
│ │ │ │  </p>
│ │ │ │  </li>
│ │ │ │ +<li><p class="caption" id="change-2.0.0b1-89"><span class="target" id="change-aba109875059299e0eb82359b5825416"><strong>[sqlite] [bug] [performance]</strong> <a class="changelog-reference headerlink reference internal" href="#change-aba109875059299e0eb82359b5825416">¶</a></span><p>The SQLite dialect now defaults to <a class="reference internal" href="../core/pooling.html#sqlalchemy.pool.QueuePool" title="sqlalchemy.pool.QueuePool"><code class="xref py py-class docutils literal notranslate"><span class="pre">QueuePool</span></code></a> when a file
│ │ │ │ +based database is used. This is set along with setting the
│ │ │ │ +<code class="docutils literal notranslate"><span class="pre">check_same_thread</span></code> parameter to <code class="docutils literal notranslate"><span class="pre">False</span></code>. It has been observed that the
│ │ │ │ +previous approach of defaulting to <a class="reference internal" href="../core/pooling.html#sqlalchemy.pool.NullPool" title="sqlalchemy.pool.NullPool"><code class="xref py py-class docutils literal notranslate"><span class="pre">NullPool</span></code></a>, which does not
│ │ │ │ +hold onto database connections after they are released, did in fact have a
│ │ │ │ +measurable negative performance impact. As always, the pool class is
│ │ │ │ +customizable via the <a class="reference internal" href="../core/engines.html#sqlalchemy.create_engine.params.poolclass" title="sqlalchemy.create_engine"><code class="xref py py-paramref docutils literal notranslate"><span class="pre">create_engine.poolclass</span></code></a> parameter.</p>
│ │ │ │ +<div class="admonition seealso">
│ │ │ │ +<p class="admonition-title">See also</p>
│ │ │ │ +<p><a class="reference internal" href="whatsnew_20.html#change-7490"><span class="std std-ref">The SQLite dialect uses QueuePool for file-based databases</span></a></p>
│ │ │ │ +</div>
│ │ │ │ +<p>References: <a class="reference external" href="https://www.sqlalchemy.org/trac/ticket/7490">#7490</a></p>
│ │ │ │ +</p>
│ │ │ │ +</li>
│ │ │ │  </ul>
│ │ │ │  </section>
│ │ │ │  <section id="change-2.0.0b1-mssql">
│ │ │ │  <h3>mssql<a class="headerlink" href="#change-2.0.0b1-mssql" title="Link to this heading">¶</a></h3>
│ │ │ │  <ul class="simple">
│ │ │ │  <li><p class="caption" id="change-2.0.0b1-90"><span class="target" id="change-eb828295f913893a52666f05ba211af0"><strong>[mssql] [usecase]</strong> <a class="changelog-reference headerlink reference internal" href="#change-eb828295f913893a52666f05ba211af0">¶</a></span><p>Implemented reflection of the “clustered index” flag <code class="docutils literal notranslate"><span class="pre">mssql_clustered</span></code>
│ │ │ │  for the SQL Server dialect. Pull request courtesy John Lennox.</p>
│ │ │ │ ├── html2text {}
│ │ │ │ │ @@ -1021,30 +1021,29 @@
│ │ │ │ │        should hopefully prevent issues with large suite runs on CPU loaded
│ │ │ │ │        hardware where the event loop seems to become corrupted, leading to
│ │ │ │ │        cascading failures.
│ │ │ │ │        References: _#_1_1_1_8_7
│ │ │ │ │  ********** 22..00..2288_?¶ **********
│ │ │ │ │  Released: March 4, 2024
│ │ │ │ │  ******** oorrmm_?¶ ********
│ │ │ │ │ -    * [[oorrmm]] [[ppeerrffoorrmmaannccee]] [[bbuugg]] [[rreeggrreessssiioonn]] _¶
│ │ │ │ │ -      Adjusted the fix made in _#_1_0_5_7_0, released in 2.0.23, where new logic was
│ │ │ │ │ -      added to reconcile possibly changing bound parameter values across cache
│ │ │ │ │ -      key generations used within the _w_i_t_h___e_x_p_r_e_s_s_i_o_n_(_) construct. The new
│ │ │ │ │ -      logic changes the approach by which the new bound parameter values are
│ │ │ │ │ -      associated with the statement, avoiding the need to deep-copy the
│ │ │ │ │ -      statement which can result in a significant performance penalty for very
│ │ │ │ │ -      deep / complex SQL constructs. The new approach no longer requires this
│ │ │ │ │ -      deep-copy step.
│ │ │ │ │ -      References: _#_1_1_0_8_5
│ │ │ │ │ -[[oorrmm]] [[bbuugg]] [[rreeggrreessssiioonn]] _¶
│ │ │ │ │ -Fixed regression caused by _#_9_7_7_9 where using the “secondary” table in a
│ │ │ │ │ -relationship and_() expression would fail to be aliased to match how the
│ │ │ │ │ -“secondary” table normally renders within a _S_e_l_e_c_t_._j_o_i_n_(_) expression, leading
│ │ │ │ │ -to an invalid query.
│ │ │ │ │ -References: _#_1_1_0_1_0
│ │ │ │ │ +    * [[oorrmm]] [[bbuugg]] [[rreeggrreessssiioonn]] _¶
│ │ │ │ │ +      Fixed regression caused by _#_9_7_7_9 where using the “secondary” table in a
│ │ │ │ │ +      relationship and_() expression would fail to be aliased to match how the
│ │ │ │ │ +      “secondary” table normally renders within a _S_e_l_e_c_t_._j_o_i_n_(_) expression,
│ │ │ │ │ +      leading to an invalid query.
│ │ │ │ │ +      References: _#_1_1_0_1_0
│ │ │ │ │ +[[oorrmm]] [[bbuugg]] [[ppeerrffoorrmmaannccee]] [[rreeggrreessssiioonn]] _¶
│ │ │ │ │ +Adjusted the fix made in _#_1_0_5_7_0, released in 2.0.23, where new logic was added
│ │ │ │ │ +to reconcile possibly changing bound parameter values across cache key
│ │ │ │ │ +generations used within the _w_i_t_h___e_x_p_r_e_s_s_i_o_n_(_) construct. The new logic changes
│ │ │ │ │ +the approach by which the new bound parameter values are associated with the
│ │ │ │ │ +statement, avoiding the need to deep-copy the statement which can result in a
│ │ │ │ │ +significant performance penalty for very deep / complex SQL constructs. The new
│ │ │ │ │ +approach no longer requires this deep-copy step.
│ │ │ │ │ +References: _#_1_1_0_8_5
│ │ │ │ │  ******** eennggiinnee_?¶ ********
│ │ │ │ │      * [[eennggiinnee]] [[uusseeccaassee]] _¶
│ │ │ │ │        Added new core execution option
│ │ │ │ │        _C_o_n_n_e_c_t_i_o_n_._e_x_e_c_u_t_i_o_n___o_p_t_i_o_n_s_._p_r_e_s_e_r_v_e___r_o_w_c_o_u_n_t. When set, the
│ │ │ │ │        cursor.rowcount attribute from the DBAPI cursor will be unconditionally
│ │ │ │ │        memoized at statement execution time, so that whatever value the DBAPI
│ │ │ │ │        offers for any kind of statement will be available using the
│ │ │ │ │ @@ -1191,15 +1190,15 @@
│ │ │ │ │        Fixed an issue regarding the use of the _U_u_i_d datatype with the
│ │ │ │ │        _U_u_i_d_._a_s___u_u_i_d parameter set to False, when using the pymssql dialect. ORM-
│ │ │ │ │        optimized INSERT statements (e.g. the “insertmanyvalues” feature) would
│ │ │ │ │        not correctly align primary key UUID values for bulk INSERT statements,
│ │ │ │ │        resulting in errors. Similar issues were fixed for the PostgreSQL drivers
│ │ │ │ │        as well.
│ │ │ │ │  ******** oorraaccllee_?¶ ********
│ │ │ │ │ -    * [[oorraaccllee]] [[ppeerrffoorrmmaannccee]] [[bbuugg]] _¶
│ │ │ │ │ +    * [[oorraaccllee]] [[bbuugg]] [[ppeerrffoorrmmaannccee]] _¶
│ │ │ │ │        Changed the default arraysize of the Oracle dialects so that the value
│ │ │ │ │        set by the driver is used, that is 100 at the time of writing for both
│ │ │ │ │        cx_oracle and oracledb. Previously the value was set to 50 by default.
│ │ │ │ │        The setting of 50 could cause significant performance regressions
│ │ │ │ │        compared to when using cx_oracle/oracledb alone to fetch many hundreds of
│ │ │ │ │        rows over slower networks.
│ │ │ │ │        References: _#_1_0_8_7_7
│ │ │ │ │ @@ -4086,33 +4085,33 @@
│ │ │ │ │  References: _#_8_8_5_9
│ │ │ │ │  [[oorrmm]] [[uusseeccaassee]] _¶
│ │ │ │ │  Added _m_a_p_p_e_d___c_o_l_u_m_n_._c_o_m_p_a_r_e parameter to relevant ORM attribute constructs
│ │ │ │ │  including _m_a_p_p_e_d___c_o_l_u_m_n_(_), _r_e_l_a_t_i_o_n_s_h_i_p_(_) etc. to provide for the Python
│ │ │ │ │  dataclasses compare parameter on field(), when using the _D_e_c_l_a_r_a_t_i_v_e_ _D_a_t_a_c_l_a_s_s
│ │ │ │ │  _M_a_p_p_i_n_g feature. Pull request courtesy Simon Schiele.
│ │ │ │ │  References: _#_8_9_0_5
│ │ │ │ │ -[[oorrmm]] [[ppeerrffoorrmmaannccee]] [[bbuugg]] _¶
│ │ │ │ │ -Additional performance enhancements within ORM-enabled SQL statements,
│ │ │ │ │ -specifically targeting callcounts within the construction of ORM statements,
│ │ │ │ │ -using combinations of _a_l_i_a_s_e_d_(_) with _u_n_i_o_n_(_) and similar “compound” constructs,
│ │ │ │ │ -in addition to direct performance improvements to the corresponding_column()
│ │ │ │ │ -internal method that is used heavily by the ORM by constructs like _a_l_i_a_s_e_d_(_)
│ │ │ │ │ -and similar.
│ │ │ │ │ -References: _#_8_7_9_6
│ │ │ │ │  [[oorrmm]] [[bbuugg]] _¶
│ │ │ │ │  Fixed issue where use of an unknown datatype within a _M_a_p_p_e_d 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.
│ │ │ │ │  References: _#_8_8_8_8
│ │ │ │ │  [[oorrmm]] [[bbuugg]] _¶
│ │ │ │ │  Fixed a suite of issues involving _M_a_p_p_e_d 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.
│ │ │ │ │  References: _#_8_7_7_7
│ │ │ │ │ +[[oorrmm]] [[bbuugg]] [[ppeerrffoorrmmaannccee]] _¶
│ │ │ │ │ +Additional performance enhancements within ORM-enabled SQL statements,
│ │ │ │ │ +specifically targeting callcounts within the construction of ORM statements,
│ │ │ │ │ +using combinations of _a_l_i_a_s_e_d_(_) with _u_n_i_o_n_(_) and similar “compound” constructs,
│ │ │ │ │ +in addition to direct performance improvements to the corresponding_column()
│ │ │ │ │ +internal method that is used heavily by the ORM by constructs like _a_l_i_a_s_e_d_(_)
│ │ │ │ │ +and similar.
│ │ │ │ │ +References: _#_8_7_9_6
│ │ │ │ │  [[oorrmm]] [[bbuugg]] _¶
│ │ │ │ │  Fixed bug in _D_e_c_l_a_r_a_t_i_v_e_ _D_a_t_a_c_l_a_s_s_ _M_a_p_p_i_n_g feature where using plain dataclass
│ │ │ │ │  fields with the __allow_unmapped__ directive in a mapping would not create a
│ │ │ │ │  dataclass with the correct class-level state for those fields, copying the raw
│ │ │ │ │  Field object to the class inappropriately after dataclasses itself had replaced
│ │ │ │ │  the Field object with the class-level default value.
│ │ │ │ │  References: _#_8_8_8_0
│ │ │ │ │ @@ -5472,53 +5471,53 @@
│ │ │ │ │        See also
│ │ │ │ │        _R_e_f_l_e_c_t_i_n_g_ _i_n_t_e_r_n_a_l_ _s_c_h_e_m_a_ _t_a_b_l_e_s
│ │ │ │ │        References: _#_8_2_3_4
│ │ │ │ │  [[ssqqlliittee]] [[uusseeccaassee]] _¶
│ │ │ │ │  Added RETURNING support for the SQLite dialect. SQLite supports RETURNING since
│ │ │ │ │  version 3.35.
│ │ │ │ │  References: _#_6_1_9_5
│ │ │ │ │ -[[ssqqlliittee]] [[uusseeccaassee]] _¶
│ │ │ │ │ -The SQLite dialect now supports UPDATE..FROM syntax, for UPDATE statements that
│ │ │ │ │ -may refer to additional tables within the WHERE criteria of the statement
│ │ │ │ │ -without the need to use subqueries. This syntax is invoked automatically when
│ │ │ │ │ -using the _U_p_d_a_t_e construct when more than one table or other entity or
│ │ │ │ │ -selectable is used.
│ │ │ │ │ -References: _#_7_1_8_5
│ │ │ │ │ -[[ssqqlliittee]] [[ppeerrffoorrmmaannccee]] [[bbuugg]] _¶
│ │ │ │ │ -The SQLite dialect now defaults to _Q_u_e_u_e_P_o_o_l when a file based database is
│ │ │ │ │ -used. This is set along with setting the check_same_thread parameter to False.
│ │ │ │ │ -It has been observed that the previous approach of defaulting to _N_u_l_l_P_o_o_l,
│ │ │ │ │ -which does not hold onto database connections after they are released, did in
│ │ │ │ │ -fact have a measurable negative performance impact. As always, the pool class
│ │ │ │ │ -is customizable via the _c_r_e_a_t_e___e_n_g_i_n_e_._p_o_o_l_c_l_a_s_s parameter.
│ │ │ │ │ -See also
│ │ │ │ │ -_T_h_e_ _S_Q_L_i_t_e_ _d_i_a_l_e_c_t_ _u_s_e_s_ _Q_u_e_u_e_P_o_o_l_ _f_o_r_ _f_i_l_e_-_b_a_s_e_d_ _d_a_t_a_b_a_s_e_s
│ │ │ │ │ -References: _#_7_4_9_0
│ │ │ │ │ -[[ssqqlliittee]] [[ppeerrffoorrmmaannccee]] [[uusseeccaassee]] _¶
│ │ │ │ │ +[[ssqqlliittee]] [[uusseeccaassee]] [[ppeerrffoorrmmaannccee]] _¶
│ │ │ │ │  SQLite datetime, date, and time datatypes now use Python standard lib
│ │ │ │ │  fromisoformat() methods in order to parse incoming datetime, date, and time
│ │ │ │ │  string values. This improves performance vs. the previous regular expression-
│ │ │ │ │  based approach, and also automatically accommodates for datetime and time
│ │ │ │ │  formats that contain either a six-digit “microseconds” format or a three-digit
│ │ │ │ │  “milliseconds” format.
│ │ │ │ │  References: _#_7_0_2_9
│ │ │ │ │ +[[ssqqlliittee]] [[uusseeccaassee]] _¶
│ │ │ │ │ +The SQLite dialect now supports UPDATE..FROM syntax, for UPDATE statements that
│ │ │ │ │ +may refer to additional tables within the WHERE criteria of the statement
│ │ │ │ │ +without the need to use subqueries. This syntax is invoked automatically when
│ │ │ │ │ +using the _U_p_d_a_t_e construct when more than one table or other entity or
│ │ │ │ │ +selectable is used.
│ │ │ │ │ +References: _#_7_1_8_5
│ │ │ │ │  [[ssqqlliittee]] [[bbuugg]] _¶
│ │ │ │ │  Removed the warning that emits from the _N_u_m_e_r_i_c type about DBAPIs not
│ │ │ │ │  supporting Decimal values natively. This warning was oriented towards SQLite,
│ │ │ │ │  which does not have any real way without additional extensions or workarounds
│ │ │ │ │  of handling precision numeric values more than 15 significant digits as it only
│ │ │ │ │  uses floating point math to represent numbers. As this is a known and
│ │ │ │ │  documented limitation in SQLite itself, and not a quirk of the pysqlite driver,
│ │ │ │ │  there’s no need for SQLAlchemy to warn for this. The change does not otherwise
│ │ │ │ │  modify how precision numerics are handled. Values can continue to be handled as
│ │ │ │ │  Decimal() or float() as configured with the _N_u_m_e_r_i_c, _F_l_o_a_t , and related
│ │ │ │ │  datatypes, just without the ability to maintain precision beyond 15 significant
│ │ │ │ │  digits when using SQLite, unless alternate representations such as strings are
│ │ │ │ │  used.
│ │ │ │ │  References: _#_7_2_9_9
│ │ │ │ │ +[[ssqqlliittee]] [[bbuugg]] [[ppeerrffoorrmmaannccee]] _¶
│ │ │ │ │ +The SQLite dialect now defaults to _Q_u_e_u_e_P_o_o_l when a file based database is
│ │ │ │ │ +used. This is set along with setting the check_same_thread parameter to False.
│ │ │ │ │ +It has been observed that the previous approach of defaulting to _N_u_l_l_P_o_o_l,
│ │ │ │ │ +which does not hold onto database connections after they are released, did in
│ │ │ │ │ +fact have a measurable negative performance impact. As always, the pool class
│ │ │ │ │ +is customizable via the _c_r_e_a_t_e___e_n_g_i_n_e_._p_o_o_l_c_l_a_s_s parameter.
│ │ │ │ │ +See also
│ │ │ │ │ +_T_h_e_ _S_Q_L_i_t_e_ _d_i_a_l_e_c_t_ _u_s_e_s_ _Q_u_e_u_e_P_o_o_l_ _f_o_r_ _f_i_l_e_-_b_a_s_e_d_ _d_a_t_a_b_a_s_e_s
│ │ │ │ │ +References: _#_7_4_9_0
│ │ │ │ │  ******** mmssssqqll_?¶ ********
│ │ │ │ │      * [[mmssssqqll]] [[uusseeccaassee]] _¶
│ │ │ │ │        Implemented reflection of the “clustered index” flag mssql_clustered for
│ │ │ │ │        the SQL Server dialect. Pull request courtesy John Lennox.
│ │ │ │ │        References: _#_8_2_8_8
│ │ │ │ │  [[mmssssqqll]] [[uusseeccaassee]] _¶
│ │ │ │ │  Added support table and column comments on MSSQL when creating a table. Added