SQLAlchemy 2.0.35__py3-none-any.whl → 2.0.36__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (34) hide show
  1. {SQLAlchemy-2.0.35.dist-info → SQLAlchemy-2.0.36.dist-info}/METADATA +3 -2
  2. {SQLAlchemy-2.0.35.dist-info → SQLAlchemy-2.0.36.dist-info}/RECORD +34 -34
  3. sqlalchemy/__init__.py +1 -1
  4. sqlalchemy/dialects/mssql/base.py +0 -1
  5. sqlalchemy/dialects/mysql/base.py +67 -22
  6. sqlalchemy/dialects/oracle/base.py +0 -1
  7. sqlalchemy/dialects/postgresql/asyncpg.py +0 -4
  8. sqlalchemy/dialects/postgresql/base.py +2 -1
  9. sqlalchemy/dialects/postgresql/json.py +1 -0
  10. sqlalchemy/dialects/postgresql/psycopg.py +0 -4
  11. sqlalchemy/dialects/sqlite/base.py +0 -1
  12. sqlalchemy/engine/result.py +8 -8
  13. sqlalchemy/ext/associationproxy.py +9 -1
  14. sqlalchemy/ext/asyncio/result.py +8 -8
  15. sqlalchemy/ext/asyncio/session.py +1 -1
  16. sqlalchemy/ext/compiler.py +23 -8
  17. sqlalchemy/orm/_orm_constructors.py +69 -10
  18. sqlalchemy/orm/base.py +2 -0
  19. sqlalchemy/orm/bulk_persistence.py +84 -45
  20. sqlalchemy/orm/decl_base.py +10 -0
  21. sqlalchemy/orm/interfaces.py +5 -0
  22. sqlalchemy/orm/mapper.py +12 -1
  23. sqlalchemy/orm/strategies.py +158 -87
  24. sqlalchemy/orm/util.py +2 -1
  25. sqlalchemy/sql/_elements_constructors.py +3 -0
  26. sqlalchemy/sql/coercions.py +7 -7
  27. sqlalchemy/sql/ddl.py +5 -5
  28. sqlalchemy/sql/sqltypes.py +6 -0
  29. sqlalchemy/sql/type_api.py +28 -7
  30. sqlalchemy/util/__init__.py +1 -0
  31. sqlalchemy/util/compat.py +1 -0
  32. {SQLAlchemy-2.0.35.dist-info → SQLAlchemy-2.0.36.dist-info}/LICENSE +0 -0
  33. {SQLAlchemy-2.0.35.dist-info → SQLAlchemy-2.0.36.dist-info}/WHEEL +0 -0
  34. {SQLAlchemy-2.0.35.dist-info → SQLAlchemy-2.0.36.dist-info}/top_level.txt +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: SQLAlchemy
3
- Version: 2.0.35
3
+ Version: 2.0.36
4
4
  Summary: Database Abstraction Library
5
5
  Home-page: https://www.sqlalchemy.org
6
6
  Author: Mike Bayer
@@ -20,6 +20,7 @@ Classifier: Programming Language :: Python :: 3.9
20
20
  Classifier: Programming Language :: Python :: 3.10
21
21
  Classifier: Programming Language :: Python :: 3.11
22
22
  Classifier: Programming Language :: Python :: 3.12
23
+ Classifier: Programming Language :: Python :: 3.13
23
24
  Classifier: Programming Language :: Python :: Implementation :: CPython
24
25
  Classifier: Programming Language :: Python :: Implementation :: PyPy
25
26
  Classifier: Topic :: Database :: Front-Ends
@@ -45,7 +46,7 @@ Provides-Extra: asyncmy
45
46
  Requires-Dist: greenlet !=0.4.17 ; extra == 'asyncmy'
46
47
  Requires-Dist: asyncmy !=0.2.4,!=0.2.6,>=0.2.3 ; extra == 'asyncmy'
47
48
  Provides-Extra: mariadb_connector
48
- Requires-Dist: mariadb !=1.1.2,!=1.1.5,>=1.0.1 ; extra == 'mariadb_connector'
49
+ Requires-Dist: mariadb !=1.1.10,!=1.1.2,!=1.1.5,>=1.0.1 ; extra == 'mariadb_connector'
49
50
  Provides-Extra: mssql
50
51
  Requires-Dist: pyodbc ; extra == 'mssql'
51
52
  Provides-Extra: mssql_pymssql
@@ -1,4 +1,4 @@
1
- sqlalchemy/__init__.py,sha256=xHEMNoAWZaZfX2Zdm2gnVT8EWjaBfg6HpzG4ncSmPrk,13033
1
+ sqlalchemy/__init__.py,sha256=J2PsdiJiNW93Etxk6YN8o_C3TcpR1_DckU71r4LBcGE,13033
2
2
  sqlalchemy/events.py,sha256=k-ZD38aSPD29LYhED7CBqttp5MDVVx_YSaWC2-cu9ec,525
3
3
  sqlalchemy/exc.py,sha256=M_8-O1hd8i6gbyx-TapV400p_Lxq2QqTGMXUAO-YgCc,23976
4
4
  sqlalchemy/inspection.py,sha256=MF-LE358wZDUEl1IH8-Uwt2HI65EsQpQW5o5udHkZwA,5063
@@ -22,7 +22,7 @@ sqlalchemy/dialects/_typing.py,sha256=hyv0nKucX2gI8ispB1IsvaUgrEPn9zEcq9hS7kfstE
22
22
  sqlalchemy/dialects/type_migration_guidelines.txt,sha256=-uHNdmYFGB7bzUNT6i8M5nb4j6j9YUKAtW4lcBZqsMg,8239
23
23
  sqlalchemy/dialects/mssql/__init__.py,sha256=r5t8wFRNtBQoiUWh0WfIEWzXZW6f3D0uDt6NZTW_7Cc,1880
24
24
  sqlalchemy/dialects/mssql/aioodbc.py,sha256=UQd9ecSMIML713TDnLAviuBVJle7P7i1FtqGZZePk2Y,2022
25
- sqlalchemy/dialects/mssql/base.py,sha256=TQekFOsor8Rc-cnDPmbq_JLQekKrHPtUdBdNsCYFw7w,132447
25
+ sqlalchemy/dialects/mssql/base.py,sha256=msl_N_a_z8ali7Nthx55AGoV7b5wakCWvWu560BvH9o,132423
26
26
  sqlalchemy/dialects/mssql/information_schema.py,sha256=HswjDc6y0mPXCf_x6VyylHlBdBa4PSY6Evxmmlch700,8084
27
27
  sqlalchemy/dialects/mssql/json.py,sha256=evUACW2O62TAPq8B7QIPagz7jfc664ql9ms68JqiYzg,4816
28
28
  sqlalchemy/dialects/mssql/provision.py,sha256=ZAtt6Div9NLIngMs8kyloxfphw0KDNMsnRCAVd7-esE,5593
@@ -31,7 +31,7 @@ sqlalchemy/dialects/mssql/pyodbc.py,sha256=vwM-vBlmRwrqxOc73P0sFOrBSwn24wzc5IkEO
31
31
  sqlalchemy/dialects/mysql/__init__.py,sha256=bxbi4hkysUK2OOVvr1F49akUj1cky27kKb07tgFzI9U,2153
32
32
  sqlalchemy/dialects/mysql/aiomysql.py,sha256=-oMZnCqNsSki8mlQRTWIwiQPT1OVdZIuANkb90q8LAs,9999
33
33
  sqlalchemy/dialects/mysql/asyncmy.py,sha256=YpuuOh8VknEeqHqUXQGfQ3jhfO3Xb-vZv78Jq5cscJ0,10067
34
- sqlalchemy/dialects/mysql/base.py,sha256=8shrZRSnVwDXtl6ybaO6cvul_RZ34zEWqvpYW5sNfOQ,120986
34
+ sqlalchemy/dialects/mysql/base.py,sha256=giGlZNGrKsNMoSkbzY0PGgfamKjA9rOkSq1o5vKvno4,122755
35
35
  sqlalchemy/dialects/mysql/cymysql.py,sha256=eXT1ry0w_qRxjiO24M980c-8PZ9qSsbhqBHntjEiKB0,2300
36
36
  sqlalchemy/dialects/mysql/dml.py,sha256=HXJMAvimJsqvhj3UZO4vW_6LkF5RqaKbHvklAjor7yU,7645
37
37
  sqlalchemy/dialects/mysql/enumerated.py,sha256=ipEPPQqoXfFwcywNdcLlZCEzHBtnitHRah1Gn6nItcg,8448
@@ -48,7 +48,7 @@ sqlalchemy/dialects/mysql/reflection.py,sha256=3u34YwT1JJh3uThGZJZ3FKdnUcT7v08QB
48
48
  sqlalchemy/dialects/mysql/reserved_words.py,sha256=ucKX2p2c3UnMq2ayZuOHuf73eXhu7SKsOsTlIN1Q83I,9258
49
49
  sqlalchemy/dialects/mysql/types.py,sha256=L5cTCsMT1pTedszNEM3jSxFNZEMcHQLprYCZ0vmfsnA,24343
50
50
  sqlalchemy/dialects/oracle/__init__.py,sha256=p4-2gw7TT0bX_MoJXTGD4i8WHctYsK9kCRbkpzykBrc,1493
51
- sqlalchemy/dialects/oracle/base.py,sha256=HykzMCkN1LSRteoEttWb_ln9Q0YmOJ5tLbJan7TuWZ4,119699
51
+ sqlalchemy/dialects/oracle/base.py,sha256=zLMZedrr6j1LvJz4qYnoSjikI5RZY92YFeQHiZ_YvW0,119676
52
52
  sqlalchemy/dialects/oracle/cx_oracle.py,sha256=q8Nyj15UZCE2TWOmxuWp5ZsxiCiGMzqfd_9UkmjIja0,55235
53
53
  sqlalchemy/dialects/oracle/dictionary.py,sha256=7WMrbPkqo8ZdGjaEZyQr-5f2pajSOF1OTGb8P97z8-g,19519
54
54
  sqlalchemy/dialects/oracle/oracledb.py,sha256=fZRKGqNIwW9LG4i8yDOXABrucbfzn_yC86Od-BJ3PcM,13619
@@ -57,25 +57,25 @@ sqlalchemy/dialects/oracle/types.py,sha256=QK3hJvWzKnnCe3oD3rItwEEIwcoBze8qGg7VF
57
57
  sqlalchemy/dialects/postgresql/__init__.py,sha256=wwnNAq4wDQzrlPRzDNB06ayuq3L2HNO99nzeEvq-YcU,3892
58
58
  sqlalchemy/dialects/postgresql/_psycopg_common.py,sha256=7TudtgsPiSB8O5kX8W8KxcNYR8t5h_UHb86b_ChL0P8,5696
59
59
  sqlalchemy/dialects/postgresql/array.py,sha256=bWcame7ntmI_Kx6gmBX0-chwADFdLHeCvaDQ4iX8id8,13734
60
- sqlalchemy/dialects/postgresql/asyncpg.py,sha256=se1HXkikKQFcR2D-15jS6iKIaQs-M8Y8ke99ih0Y4NM,41132
61
- sqlalchemy/dialects/postgresql/base.py,sha256=ed49Ode09deJF3jXr8V5sSHTwVoFVq0dlvNdP3mJaBQ,178989
60
+ sqlalchemy/dialects/postgresql/asyncpg.py,sha256=9P0Itn9eeSBu67kGSsHuzx8xd4YYwRKdiZ5m7bF5onU,41074
61
+ sqlalchemy/dialects/postgresql/base.py,sha256=dGPsaV3Esw6-AwE3QcgHF0Fray3Yw5-gLLgCvgdxvS0,179083
62
62
  sqlalchemy/dialects/postgresql/dml.py,sha256=Pc69Le6qzmUHHb1FT5zeUSD31dWm6SBgdCAGW89cs3s,11212
63
63
  sqlalchemy/dialects/postgresql/ext.py,sha256=1bZ--iNh2O9ym7l2gXZX48yP3yMO4dqb9RpYro2Mj2Q,16262
64
64
  sqlalchemy/dialects/postgresql/hstore.py,sha256=otAx-RTDfpi_tcXkMuQV0JOIXtYgevgnsikLKKOkI6U,11541
65
- sqlalchemy/dialects/postgresql/json.py,sha256=73nmtG-7TN01DytjIJnG8CHa8Q7KwlRdN0bhx4fEAT0,11590
65
+ sqlalchemy/dialects/postgresql/json.py,sha256=53rQWon9cUXd1yCjIvUpJjWwNyRSy3U7Kz0HV70ftrc,11618
66
66
  sqlalchemy/dialects/postgresql/named_types.py,sha256=3IV1ufo7zJjKmX4VtGDEnoXE6xEqLJAtGG82IiqHXwY,17594
67
67
  sqlalchemy/dialects/postgresql/operators.py,sha256=NsAaWun_tL3d_be0fs9YL6T4LPKK6crnmFxxIJHgyeY,2808
68
68
  sqlalchemy/dialects/postgresql/pg8000.py,sha256=3yoekiWSF-xnaWMqG76XrYPMqerg-42TdmfsW_ivK9E,18640
69
69
  sqlalchemy/dialects/postgresql/pg_catalog.py,sha256=hY3NXEUHxTWD4umhd2aowNu3laC-61Q_qQ_pReyXTUM,9254
70
70
  sqlalchemy/dialects/postgresql/provision.py,sha256=t6TZj0XaWG9zrpCjNr0oJRjAC_WQzaNdp3kaKJIbS8I,5770
71
- sqlalchemy/dialects/postgresql/psycopg.py,sha256=ACkfuT87vUJEW4kJyUqDYTwlnl5u0FZFlDcvLzxNzFQ,23226
71
+ sqlalchemy/dialects/postgresql/psycopg.py,sha256=Uwf45f9fInOtaExiEdwiP9xzRo7hw0XyZTkRtgdom44,23168
72
72
  sqlalchemy/dialects/postgresql/psycopg2.py,sha256=kwEnflz5bAqJcuO_20eYiCtha_a4m_tg5_lppdDnaeU,31998
73
73
  sqlalchemy/dialects/postgresql/psycopg2cffi.py,sha256=M7wAYSL6Pvt-4nbfacAHGyyw4XMKJ_bQZ1tc1pBtIdg,1756
74
74
  sqlalchemy/dialects/postgresql/ranges.py,sha256=6CgV7qkxEMJ9AQsiibo_XBLJYzGh-2ZxpG83sRaesVY,32949
75
75
  sqlalchemy/dialects/postgresql/types.py,sha256=Jfxqw9JaKNOq29JRWBublywgb3lLMyzx8YZI7CXpS2s,7300
76
76
  sqlalchemy/dialects/sqlite/__init__.py,sha256=lp9DIggNn349M-7IYhUA8et8--e8FRExWD2V_r1LJk4,1182
77
77
  sqlalchemy/dialects/sqlite/aiosqlite.py,sha256=g3qGV6jmiXabWyb3282g_Nmxtj1jThxGSe9C9yalb-U,12345
78
- sqlalchemy/dialects/sqlite/base.py,sha256=P15AcHoVWS20mMNQqnCfj94owUsTEX2ULtRn290AoF0,97837
78
+ sqlalchemy/dialects/sqlite/base.py,sha256=LcnW6hzxqTtPlDBOInHumvuDt8a31THA5Jnm4vFvdFI,97811
79
79
  sqlalchemy/dialects/sqlite/dml.py,sha256=9GE55WvwoktKy2fHeT-Wbc9xPHgsbh5oBfd_fckMH5Q,8443
80
80
  sqlalchemy/dialects/sqlite/json.py,sha256=Eoplbb_4dYlfrtmQaI8Xddd2suAIHA-IdbDQYM-LIhs,2777
81
81
  sqlalchemy/dialects/sqlite/provision.py,sha256=UCpmwxf4IWlrpb2eLHGbPTpCFVbdI_KAh2mKtjiLYao,5632
@@ -95,7 +95,7 @@ sqlalchemy/engine/interfaces.py,sha256=fcVHOmnMo7JZLHzgSKoK3QsdVHH7kJ_AmrDvwW9Ka
95
95
  sqlalchemy/engine/mock.py,sha256=yvpxgFmRw5G4QsHeF-ZwQGHKES-HqQOucTxFtN1uzdk,4179
96
96
  sqlalchemy/engine/processors.py,sha256=XyfINKbo-2fjN-mW55YybvFyQMOil50_kVqsunahkNs,2379
97
97
  sqlalchemy/engine/reflection.py,sha256=gwGs8y7x6py5z-ZWx3hQqQrwpHepMCTJyQcFwWJjPlw,75364
98
- sqlalchemy/engine/result.py,sha256=j6BI4Wj2bziQNQG5OlG_Cm4KcNWY9AoYvTXVlJUU-D8,77603
98
+ sqlalchemy/engine/result.py,sha256=NZEskTMAcDzK-vjE96Fw8VvBL58s5Y6rt9vXcmZdM4w,77651
99
99
  sqlalchemy/engine/row.py,sha256=9AAQo9zYDL88GcZ3bjcQTwMT-YIcuGTSMAyTfmBJ_yM,12032
100
100
  sqlalchemy/engine/strategies.py,sha256=DqFSWaXJPL-29Omot9O0aOcuGL8KmCGyOvnPGDkAJoE,442
101
101
  sqlalchemy/engine/url.py,sha256=8eWkUaIUyDExOcJ2D4xJXRcn4OY1GQJ3Q2duSX6UGAg,30784
@@ -107,10 +107,10 @@ sqlalchemy/event/base.py,sha256=270OShTD17-bSFUFnPtKdVnB0NFJZ2AouYPo1wT0aJw,1512
107
107
  sqlalchemy/event/legacy.py,sha256=teMPs00fO-4g8a_z2omcVKkYce5wj_1uvJO2n2MIeuo,8227
108
108
  sqlalchemy/event/registry.py,sha256=nfTSSyhjZZXc5wseWB4sXn-YibSc0LKX8mg17XlWmAo,10835
109
109
  sqlalchemy/ext/__init__.py,sha256=S1fGKAbycnQDV01gs-JWGaFQ9GCD4QHwKcU2wnugg_o,322
110
- sqlalchemy/ext/associationproxy.py,sha256=5O5ANHARO8jytvqBQmOu-QjNVE4Hh3tfYquqKAj5ajs,65771
110
+ sqlalchemy/ext/associationproxy.py,sha256=ZGc_ssGf7FC6eKrja1iTvnWEKLkFZQA8CiVAjR8iVRw,66062
111
111
  sqlalchemy/ext/automap.py,sha256=r0mUSyogNyqdBL4m9AA1NXbLiTLQmtvyQymsssNEipo,61581
112
112
  sqlalchemy/ext/baked.py,sha256=H6T1il7GY84BhzPFj49UECSpZh_eBuiHomA-QIsYOYQ,17807
113
- sqlalchemy/ext/compiler.py,sha256=ONPoxoKD2yUS9R2-oOhmPsA7efm-Bs0BXo7HE1dGlsU,20391
113
+ sqlalchemy/ext/compiler.py,sha256=6X6sZCAo9v-PQfLbwBSYQUK0-XH2xTE5Jm0Zg6Ka6eM,20877
114
114
  sqlalchemy/ext/horizontal_shard.py,sha256=wuwAPnHymln0unSBnyx-cpX0AfESKSsypaSQTYCvzDk,16750
115
115
  sqlalchemy/ext/hybrid.py,sha256=IYkCaPZ29gm2cPKPg0cWMkLCEqMykD8-JJTvgacGbmc,52458
116
116
  sqlalchemy/ext/indexable.py,sha256=UkTelbydKCdKelzbv3HWFFavoET9WocKaGRPGEOVfN8,11032
@@ -122,9 +122,9 @@ sqlalchemy/ext/asyncio/__init__.py,sha256=1OqSxEyIUn7RWLGyO12F-jAUIvk1I6DXlVy80-
122
122
  sqlalchemy/ext/asyncio/base.py,sha256=fl7wxZD9KjgFiCtG3WXrYjHEvanamcsodCqq9pH9lOk,8905
123
123
  sqlalchemy/ext/asyncio/engine.py,sha256=S_IRWX4QAjj2veLSu4Y3gKBIXkKQt7_2StJAK2_KUDY,48190
124
124
  sqlalchemy/ext/asyncio/exc.py,sha256=8sII7VMXzs2TrhizhFQMzSfcroRtiesq8o3UwLfXSgQ,639
125
- sqlalchemy/ext/asyncio/result.py,sha256=ID2eh-NHW-lnNFTxbKhje8fr-tnsucUsiw_jcpGcSPc,30409
125
+ sqlalchemy/ext/asyncio/result.py,sha256=3rbVIY_wySi50JwaK3Kf2qa3c5Fc8W84FtUpt-9i9Vk,30477
126
126
  sqlalchemy/ext/asyncio/scoping.py,sha256=UxHAFxtWKqA7TEozyN2h7MJyzSspTCrS-1SlgQLTExo,52608
127
- sqlalchemy/ext/asyncio/session.py,sha256=mkFFC1C2mPuopz3BwkfSVTlp3vuIDc8hxiQx5ky5rvc,63103
127
+ sqlalchemy/ext/asyncio/session.py,sha256=QpXnqspwYnT28znD1EdpUIaVjQOO1BirtS0BJeBxeZk,63087
128
128
  sqlalchemy/ext/declarative/__init__.py,sha256=20psLdFQbbOWfpdXHZ0CTY6I1k4UqXvKemNVu1LvPOI,1818
129
129
  sqlalchemy/ext/declarative/extensions.py,sha256=uCjN1GisQt54AjqYnKYzJdUjnGd2pZBW47WWdPlS7FE,19547
130
130
  sqlalchemy/ext/mypy/__init__.py,sha256=0WebDIZmqBD0OTq5JLtd_PmfF9JGxe4d4Qv3Ml3PKUg,241
@@ -137,16 +137,16 @@ sqlalchemy/ext/mypy/util.py,sha256=DKRaurkXHI2lAMAAcEO5GLXbX_m2Xqy7l_juh8Byf5U,9
137
137
  sqlalchemy/future/__init__.py,sha256=q2mw-gxk_xoxJLEvRoyMha3vO1xSRHrslcExOHZwmPA,512
138
138
  sqlalchemy/future/engine.py,sha256=AgIw6vMsef8W6tynOTkxsjd6o_OQDwGjLdbpoMD8ue8,495
139
139
  sqlalchemy/orm/__init__.py,sha256=ZYys5nL3RFUDCMOLFDBrRI52F6er3S1U1OY9TeORuKs,8463
140
- sqlalchemy/orm/_orm_constructors.py,sha256=c4RMiYKIXzOTjuPIBbyRIzpizYjUBm2sd7k0n1vqb2o,100717
140
+ sqlalchemy/orm/_orm_constructors.py,sha256=8EQfYsDL2k_ev0eK-wxMl3algouczN38Gu43CrRlAlo,103434
141
141
  sqlalchemy/orm/_typing.py,sha256=DVBfpHmDVK4x1zxaGJPY2GoTrAsyR6uexv20Lzf1afc,4973
142
142
  sqlalchemy/orm/attributes.py,sha256=lorOHBJvJJYndOuafWJhHBbQ1pR6FAyimhqz-mErBRQ,92534
143
- sqlalchemy/orm/base.py,sha256=re6A8ooMxLyfCAeQfhBwwxeJQkiH7EtzzOZIVIiTPlw,27466
144
- sqlalchemy/orm/bulk_persistence.py,sha256=gNp2gFsGvV-5NhOPBL51TqKgR3ZRrS43jSwqUF-SwgY,71430
143
+ sqlalchemy/orm/base.py,sha256=FXkYTSCDUJFQSB5pcyPt2wG-dRctf5P6ySjyjVxQsX0,27502
144
+ sqlalchemy/orm/bulk_persistence.py,sha256=1FC23bRJKjpfbp2D5hYuV1qOVIKGSswu9XPXbbSJ5Mo,72663
145
145
  sqlalchemy/orm/clsregistry.py,sha256=IjoDZwWpjG42ji59L4M1EZvjBEoXPZykzENDtKWxU8A,17974
146
146
  sqlalchemy/orm/collections.py,sha256=WEKuUCRgLhDhJEIBhZ21UrE0pBOyRm2zxD20GvbgA9g,52243
147
147
  sqlalchemy/orm/context.py,sha256=FMPyw07OA9OXWQ32RQx52AEa2xTLSkqdYgx9R_yN1x0,112955
148
148
  sqlalchemy/orm/decl_api.py,sha256=_WPKQ_vSE5k2TLtNmkaxxYmvbhZvkRMrrvCeDxdqDQE,63998
149
- sqlalchemy/orm/decl_base.py,sha256=FTHf3bCVlg52KR6JWVEwuG3XjOaGQ5KJMYFYXastGhw,82832
149
+ sqlalchemy/orm/decl_base.py,sha256=8R7go5sULTYNRlhYiEjXIJkQ34oPp7DY_fC2nS5D5is,83343
150
150
  sqlalchemy/orm/dependency.py,sha256=hgjksUWhgbmgHK5GdJdiDCBgDAIGQXIrY-Tj79tbL2k,47631
151
151
  sqlalchemy/orm/descriptor_props.py,sha256=dR_h4Gvdtpcdp4sj_ZOR4P5Nng2J2vhsvFHouRLlntc,37244
152
152
  sqlalchemy/orm/dynamic.py,sha256=rWAZ-nfAkREuNjt8e_FRdqYrvHDdbODn1CcfyP8Y18k,9816
@@ -155,10 +155,10 @@ sqlalchemy/orm/events.py,sha256=1PiGT7JMUWTDAb3X1T79P02BMVDmcWEpatz1FwpLqoA,1277
155
155
  sqlalchemy/orm/exc.py,sha256=IP40P-wOeXhkYk0YizuTC3wqm6W9cPTaQU08f5MMaQ0,7413
156
156
  sqlalchemy/orm/identity.py,sha256=jHdCxCpCyda_8mFOfGmN_Pr0XZdKiU-2hFZshlNxbHs,9249
157
157
  sqlalchemy/orm/instrumentation.py,sha256=M-kZmkUvHUxtf-0mCA8RIM5QmMH1hWlYR_pKMwaidjA,24321
158
- sqlalchemy/orm/interfaces.py,sha256=Hmf1BjbfOarZRgMlruqghR7cgH2xyugA9v5t0x-a-wU,48502
158
+ sqlalchemy/orm/interfaces.py,sha256=7Lni4Cue41b1CsmN4VbeUyWwzuNMcKtkrpihc9U-WIw,48690
159
159
  sqlalchemy/orm/loading.py,sha256=9RacpzFOWbuKgPRWHFmyIvD4fYCLAnkpwBFASyQ2CoI,58277
160
160
  sqlalchemy/orm/mapped_collection.py,sha256=zK3d3iozORzDruBUrAmkVC0RR3Orj5szk-TSQ24xzIU,19682
161
- sqlalchemy/orm/mapper.py,sha256=bfoRzNKKnjF-CDvr2Df7HZC9TepvtuQ49LRz_fW7DGQ,171088
161
+ sqlalchemy/orm/mapper.py,sha256=W-srpoEc3UIYv_6qTXTd_dG_TVeQcToG77VGrXt85PM,171738
162
162
  sqlalchemy/orm/path_registry.py,sha256=sJZMv_WPqUpHfQtKWaX3WYFeKBcNJ8C3wOM2mkBGkTE,25920
163
163
  sqlalchemy/orm/persistence.py,sha256=dzyB2JOXNwQgaCbN8kh0sEz00WFePr48qf8NWVCUZH8,61701
164
164
  sqlalchemy/orm/properties.py,sha256=eDPFzxYUgdM3uWjHywnb1XW-i0tVKKyx7A2MCD31GQU,29306
@@ -168,11 +168,11 @@ sqlalchemy/orm/scoping.py,sha256=rJVc7_Lic4V00HZ-UvYFWkVpXqdrMayRmIs4fIwH1UA,786
168
168
  sqlalchemy/orm/session.py,sha256=CZJTQ-wPwIy0c3AMFxgJnBgaft6eEf4JzcCLcaaCSjg,195979
169
169
  sqlalchemy/orm/state.py,sha256=327-F4TG29s6mLC8oWRiO2PuvYIUZzY1MqUPjtUy7M4,37670
170
170
  sqlalchemy/orm/state_changes.py,sha256=qKYg7NxwrDkuUY3EPygAztym6oAVUFcP2wXn7QD3Mz4,6815
171
- sqlalchemy/orm/strategies.py,sha256=U5EL1FBXOmkIV5HsryIlTvfQfoajYGCnvTbuKBnH0pQ,116224
171
+ sqlalchemy/orm/strategies.py,sha256=-tsBRsmEqkaxAAIn4t2F-U5SrRIPoPCyzpqFYGTAwNs,119866
172
172
  sqlalchemy/orm/strategy_options.py,sha256=oeDl_rMDNAC_90N7ytsni-psXWAeQMhABQFyKBSmai0,85353
173
173
  sqlalchemy/orm/sync.py,sha256=g7iZfSge1HgxMk9SKRgUgtHEbpbZ1kP_CBqOIdTOXqc,5779
174
174
  sqlalchemy/orm/unitofwork.py,sha256=fiVaqcymbDDHRa1NjS90N9Z466nd5pkJOEi1dHO6QLY,27033
175
- sqlalchemy/orm/util.py,sha256=Q0JT2JydyGiNiYT8AVe9B6jOdBRVHSOVDIcWOsXXIUQ,80929
175
+ sqlalchemy/orm/util.py,sha256=5SC4MOVU0cPObexDjpMvXvetueiU5pze42raL94gj24,81021
176
176
  sqlalchemy/orm/writeonly.py,sha256=SYu2sAaHZONk2pW4PmtE871LG-O0P_bjidvKzY1H_zI,22305
177
177
  sqlalchemy/pool/__init__.py,sha256=qiDdq4r4FFAoDrK6ncugF_i6usi_X1LeJt-CuBHey0s,1804
178
178
  sqlalchemy/pool/base.py,sha256=WF4az4ZKuzQGuKeSJeyexaYjmWZUvYdC6KIi8zTGodw,52236
@@ -180,7 +180,7 @@ sqlalchemy/pool/events.py,sha256=xGjkIUZl490ZDtCHqnQF9ZCwe2Jv93eGXmnQxftB11E,131
180
180
  sqlalchemy/pool/impl.py,sha256=JwpALSkH-pCoO_6oENbkHYY00Jx9nlttyoI61LivRNc,18944
181
181
  sqlalchemy/sql/__init__.py,sha256=UNa9EUiYWoPayf-FzNcwVgQvpsBdInPZfpJesAStN9o,5820
182
182
  sqlalchemy/sql/_dml_constructors.py,sha256=YdBJex0MCVACv4q2nl_ii3uhxzwU6aDB8zAsratX5UQ,3867
183
- sqlalchemy/sql/_elements_constructors.py,sha256=1SX6o1ezeB8C9DAa2m0WxmfhM3ji3FeCprXFQkNerNY,63048
183
+ sqlalchemy/sql/_elements_constructors.py,sha256=833Flez92odZkE2Vy6SXK8LcoO1AwkfVzOnATJLWFsA,63168
184
184
  sqlalchemy/sql/_orm_types.py,sha256=T-vjcry4C1y0GToFKVxQCnmly_-Zsq4IO4SHN6bvUF4,625
185
185
  sqlalchemy/sql/_py_util.py,sha256=hiM9ePbRSGs60bAMxPFuJCIC_p9SQ1VzqXGiPchiYwE,2173
186
186
  sqlalchemy/sql/_selectable_constructors.py,sha256=wjE6HrLm9cR7bxvZXT8sFLUqT6t_J9G1XyQCnYmBDl0,18780
@@ -188,10 +188,10 @@ sqlalchemy/sql/_typing.py,sha256=oqwrYHVMtK-AuKGH9c4SgfiOEJUt5vjkzSEzzscMHkM,127
188
188
  sqlalchemy/sql/annotation.py,sha256=aqbbVz9kfbCT3_66CZ9GEirVN197Cukoqt8rq48FgkQ,18245
189
189
  sqlalchemy/sql/base.py,sha256=M1b-Tg49ikUW2mnZv0aI38oASG6dgeo4jBNWDgJgAg8,73925
190
190
  sqlalchemy/sql/cache_key.py,sha256=0Db8mR8IrpBgdzXs4TGTt98LOpL3c7KABd72MAPKUQQ,33668
191
- sqlalchemy/sql/coercions.py,sha256=KjrVc2ks6cx_o6-_Zpu6uPuNGjJy2xvFzXy8z5oshQg,40628
191
+ sqlalchemy/sql/coercions.py,sha256=hAEou9Ycyswzu8yz_Q7QkwL2_c3nctzBJQS2oDEr4iE,40664
192
192
  sqlalchemy/sql/compiler.py,sha256=hrTptbOKIgVIHapywj4Lk5OMwpXvHS-KGg3odFwlo-I,274687
193
193
  sqlalchemy/sql/crud.py,sha256=HBX4QPtW_PYYJmIKfNr-wE8IdEr963N24WXzFBUZOo0,56514
194
- sqlalchemy/sql/ddl.py,sha256=CIqMilCKfuQnF0lrZsQdTxgrbXqcTauKr0Ojzj77PFQ,45602
194
+ sqlalchemy/sql/ddl.py,sha256=lKqvOigbcYrDG0euxd5F4tu9HbBi1kmp3eFPc45HH-8,45636
195
195
  sqlalchemy/sql/default_comparator.py,sha256=utXWsZVGEjflhFfCT4ywa6RnhORc1Rryo87Hga71Rps,16707
196
196
  sqlalchemy/sql/dml.py,sha256=pn0Lm1ofC5qVZzwGWFW73lPCiNba8OsTeemurJgwRyg,65614
197
197
  sqlalchemy/sql/elements.py,sha256=YfccXzQc9DlgF8q15kDf-zKBUY_vpIe0FGaVDBPoic4,176544
@@ -204,9 +204,9 @@ sqlalchemy/sql/operators.py,sha256=himArRqBzrljob3Zfhi_ZS-Jleg1u6YFp0g3d7Co6IM,7
204
204
  sqlalchemy/sql/roles.py,sha256=pOsVn_OZD7mF2gJByHf24Rjopt0_Hu3dUCEOK5t4KS8,7662
205
205
  sqlalchemy/sql/schema.py,sha256=iFleWHkxi-3mKGiK_N1TzUqxnNwOpypB4bWDuAVQe8c,229717
206
206
  sqlalchemy/sql/selectable.py,sha256=cgyV0AsPy4CXAFdhMiTCkbgaHiFilW9sclzxlHJKH3o,236460
207
- sqlalchemy/sql/sqltypes.py,sha256=fajBVE_CCJykrQpOOnb8_HFOKCSoUF48AxljJymvGk4,127330
207
+ sqlalchemy/sql/sqltypes.py,sha256=5_N9MhprQFWYc3yjcXgFC_DmvkQU-Jz-Ok9nIMYp2Q4,127469
208
208
  sqlalchemy/sql/traversals.py,sha256=3ScTC1fh1-y8Y478h_2Azmd2xdQdWPWkDve4YgrwMf8,33664
209
- sqlalchemy/sql/type_api.py,sha256=q_FieFRALHiRkhy5Bj-cVgFHa7DXF1dP23FaRRYKeho,83717
209
+ sqlalchemy/sql/type_api.py,sha256=SN16_oNZG6G65cvG6ABPcptz_YV5vfB2fknwJZxrkOs,84464
210
210
  sqlalchemy/sql/util.py,sha256=qGHQF-tPCj-m1FBerzT7weCanGcXU7dK5m-W7NHio-4,48077
211
211
  sqlalchemy/sql/visitors.py,sha256=71wdVvhhZL4nJvVwFAs6ssaW-qZgNRSmKjpAcOzF_TA,36317
212
212
  sqlalchemy/testing/__init__.py,sha256=zgitAYzsCWT_U48ZiifXHHLJFo8nZBYmI-5TueA4_lE,3160
@@ -247,12 +247,12 @@ sqlalchemy/testing/suite/test_sequence.py,sha256=66bCoy4xo99GBSaX6Hxb88foANAykLG
247
247
  sqlalchemy/testing/suite/test_types.py,sha256=K4MGHvnTtgqeksoQOBCZRVQYC7HoYO6Z6rVt5vj2t9o,67805
248
248
  sqlalchemy/testing/suite/test_unicode_ddl.py,sha256=c3_eIxLyORuSOhNDP0jWKxPyUf3SwMFpdalxtquwqlM,6141
249
249
  sqlalchemy/testing/suite/test_update_delete.py,sha256=yTiM2unnfOK9rK8ZkqeTTU_MkT-RsKFLmdYliniZfAY,3994
250
- sqlalchemy/util/__init__.py,sha256=B3bedg-LSQEscwqgmYYU-VENUX8_zAE3q9vb7tkfJNY,8277
250
+ sqlalchemy/util/__init__.py,sha256=5D5Mquvx3SOmud0QErKzzGvBTkqMdhrrd_sXijOILeo,8312
251
251
  sqlalchemy/util/_collections.py,sha256=aZoSAVOXnHBoYEsxDOi0O9odg9wqLbGb7PGjaWQKiyY,20078
252
252
  sqlalchemy/util/_concurrency_py3k.py,sha256=zb0Bow2Y_QjTdaACEviBEEaFvqDuVvpJfmwCjaw8xNE,9170
253
253
  sqlalchemy/util/_has_cy.py,sha256=wCQmeSjT3jaH_oxfCEtGk-1g0gbSpt5MCK5UcWdMWqk,1247
254
254
  sqlalchemy/util/_py_collections.py,sha256=U6L5AoyLdgSv7cdqB4xxQbw1rpeJjyOZVXffgxgga8I,16714
255
- sqlalchemy/util/compat.py,sha256=fJWqZVkW7qPY2l0DxK-7fHKjyp7b-wa-5wOlmuZlick,8724
255
+ sqlalchemy/util/compat.py,sha256=cnucBQOKspo58vjRpQXUBrHGguHOSFvftpD-I8vfUy0,8760
256
256
  sqlalchemy/util/concurrency.py,sha256=9lT_cMoO1fZNdY8QTUZ22oeSf-L5I-79Ke7chcBNPA0,3304
257
257
  sqlalchemy/util/deprecations.py,sha256=YBwvvYhSB8LhasIZRKvg_-WNoVhPUcaYI1ZrnjDn868,11971
258
258
  sqlalchemy/util/langhelpers.py,sha256=uIK3szZuq9aMnO-vEpSlNekNWv4I-E391e56bkTnUm0,65090
@@ -261,8 +261,8 @@ sqlalchemy/util/queue.py,sha256=CaeSEaYZ57YwtmLdNdOIjT5PK_LCuwMFiO0mpp39ybM,1018
261
261
  sqlalchemy/util/tool_support.py,sha256=9braZyidaiNrZVsWtGmkSmus50-byhuYrlAqvhjcmnA,6135
262
262
  sqlalchemy/util/topological.py,sha256=N3M3Le7KzGHCmqPGg0ZBqixTDGwmFLhOZvBtc4rHL_g,3458
263
263
  sqlalchemy/util/typing.py,sha256=lFcGo1dJbZIZ9drAnvef-PzP0cX4LMxMSwgk3lJBb0g,18182
264
- SQLAlchemy-2.0.35.dist-info/LICENSE,sha256=PA9Zq4h9BB3mpOUv_j6e212VIt6Qn66abNettue-MpM,1100
265
- SQLAlchemy-2.0.35.dist-info/METADATA,sha256=nz-ukujebAhwlZl0txMOxlkTwDyPwTn3tWuKTcw8OMU,9632
266
- SQLAlchemy-2.0.35.dist-info/WHEEL,sha256=GV9aMThwP_4oNCtvEC2ec3qUYutgWeAzklro_0m4WJQ,91
267
- SQLAlchemy-2.0.35.dist-info/top_level.txt,sha256=rp-ZgB7D8G11ivXON5VGPjupT1voYmWqkciDt5Uaw_Q,11
268
- SQLAlchemy-2.0.35.dist-info/RECORD,,
264
+ SQLAlchemy-2.0.36.dist-info/LICENSE,sha256=PA9Zq4h9BB3mpOUv_j6e212VIt6Qn66abNettue-MpM,1100
265
+ SQLAlchemy-2.0.36.dist-info/METADATA,sha256=EZH514FydYtyOhgoZk_OF1ZQEtI4eTAEddlnUlRjzac,9692
266
+ SQLAlchemy-2.0.36.dist-info/WHEEL,sha256=GV9aMThwP_4oNCtvEC2ec3qUYutgWeAzklro_0m4WJQ,91
267
+ SQLAlchemy-2.0.36.dist-info/top_level.txt,sha256=rp-ZgB7D8G11ivXON5VGPjupT1voYmWqkciDt5Uaw_Q,11
268
+ SQLAlchemy-2.0.36.dist-info/RECORD,,
sqlalchemy/__init__.py CHANGED
@@ -269,7 +269,7 @@ from .types import Uuid as Uuid
269
269
  from .types import VARBINARY as VARBINARY
270
270
  from .types import VARCHAR as VARCHAR
271
271
 
272
- __version__ = "2.0.35"
272
+ __version__ = "2.0.36"
273
273
 
274
274
 
275
275
  def __go(lcls: Any) -> None:
@@ -9,7 +9,6 @@
9
9
  """
10
10
  .. dialect:: mssql
11
11
  :name: Microsoft SQL Server
12
- :full_support: 2017
13
12
  :normal_support: 2012+
14
13
  :best_effort: 2005+
15
14
 
@@ -11,7 +11,6 @@ r"""
11
11
 
12
12
  .. dialect:: mysql
13
13
  :name: MySQL / MariaDB
14
- :full_support: 5.6, 5.7, 8.0 / 10.8, 10.9
15
14
  :normal_support: 5.6+ / 10+
16
15
  :best_effort: 5.0.2+ / 5.0.2+
17
16
 
@@ -1850,7 +1849,15 @@ class MySQLDDLCompiler(compiler.DDLCompiler):
1850
1849
  else:
1851
1850
  default = self.get_column_default_string(column)
1852
1851
  if default is not None:
1853
- colspec.append("DEFAULT " + default)
1852
+ if (
1853
+ isinstance(
1854
+ column.server_default.arg, functions.FunctionElement
1855
+ )
1856
+ and self.dialect._support_default_function
1857
+ ):
1858
+ colspec.append(f"DEFAULT ({default})")
1859
+ else:
1860
+ colspec.append("DEFAULT " + default)
1854
1861
  return " ".join(colspec)
1855
1862
 
1856
1863
  def post_create_table(self, table):
@@ -2895,6 +2902,17 @@ class MySQLDialect(default.DefaultDialect):
2895
2902
  # ref https://dev.mysql.com/doc/relnotes/mysql/8.0/en/news-8-0-17.html#mysqld-8-0-17-feature # noqa
2896
2903
  return self.server_version_info >= (8, 0, 17)
2897
2904
 
2905
+ @property
2906
+ def _support_default_function(self):
2907
+ if not self.server_version_info:
2908
+ return False
2909
+ elif self.is_mariadb:
2910
+ # ref https://mariadb.com/kb/en/mariadb-1021-release-notes/
2911
+ return self.server_version_info >= (10, 2, 1)
2912
+ else:
2913
+ # ref https://dev.mysql.com/doc/refman/8.0/en/data-type-defaults.html # noqa
2914
+ return self.server_version_info >= (8, 0, 13)
2915
+
2898
2916
  @property
2899
2917
  def _is_mariadb(self):
2900
2918
  return self.is_mariadb
@@ -3052,29 +3070,47 @@ class MySQLDialect(default.DefaultDialect):
3052
3070
  return s
3053
3071
 
3054
3072
  default_schema_name = connection.dialect.default_schema_name
3055
- col_tuples = [
3056
- (
3057
- lower(rec["referred_schema"] or default_schema_name),
3058
- lower(rec["referred_table"]),
3059
- col_name,
3060
- )
3061
- for rec in fkeys
3062
- for col_name in rec["referred_columns"]
3063
- ]
3064
3073
 
3065
- if col_tuples:
3066
- correct_for_wrong_fk_case = connection.execute(
3067
- sql.text(
3068
- """
3069
- select table_schema, table_name, column_name
3070
- from information_schema.columns
3071
- where (table_schema, table_name, lower(column_name)) in
3072
- :table_data;
3073
- """
3074
- ).bindparams(sql.bindparam("table_data", expanding=True)),
3075
- dict(table_data=col_tuples),
3074
+ # NOTE: using (table_schema, table_name, lower(column_name)) in (...)
3075
+ # is very slow since mysql does not seem able to properly use indexse.
3076
+ # Unpack the where condition instead.
3077
+ schema_by_table_by_column = defaultdict(lambda: defaultdict(list))
3078
+ for rec in fkeys:
3079
+ sch = lower(rec["referred_schema"] or default_schema_name)
3080
+ tbl = lower(rec["referred_table"])
3081
+ for col_name in rec["referred_columns"]:
3082
+ schema_by_table_by_column[sch][tbl].append(col_name)
3083
+
3084
+ if schema_by_table_by_column:
3085
+
3086
+ condition = sql.or_(
3087
+ *(
3088
+ sql.and_(
3089
+ _info_columns.c.table_schema == schema,
3090
+ sql.or_(
3091
+ *(
3092
+ sql.and_(
3093
+ _info_columns.c.table_name == table,
3094
+ sql.func.lower(
3095
+ _info_columns.c.column_name
3096
+ ).in_(columns),
3097
+ )
3098
+ for table, columns in tables.items()
3099
+ )
3100
+ ),
3101
+ )
3102
+ for schema, tables in schema_by_table_by_column.items()
3103
+ )
3076
3104
  )
3077
3105
 
3106
+ select = sql.select(
3107
+ _info_columns.c.table_schema,
3108
+ _info_columns.c.table_name,
3109
+ _info_columns.c.column_name,
3110
+ ).where(condition)
3111
+
3112
+ correct_for_wrong_fk_case = connection.execute(select)
3113
+
3078
3114
  # in casing=0, table name and schema name come back in their
3079
3115
  # exact case.
3080
3116
  # in casing=1, table name and schema name come back in lower
@@ -3447,3 +3483,12 @@ class _DecodingRow:
3447
3483
  return item.decode(self.charset)
3448
3484
  else:
3449
3485
  return item
3486
+
3487
+
3488
+ _info_columns = sql.table(
3489
+ "columns",
3490
+ sql.column("table_schema", VARCHAR(64)),
3491
+ sql.column("table_name", VARCHAR(64)),
3492
+ sql.column("column_name", VARCHAR(64)),
3493
+ schema="information_schema",
3494
+ )
@@ -10,7 +10,6 @@
10
10
  r"""
11
11
  .. dialect:: oracle
12
12
  :name: Oracle
13
- :full_support: 18c
14
13
  :normal_support: 11+
15
14
  :best_effort: 9+
16
15
 
@@ -263,15 +263,11 @@ class AsyncpgBigInteger(sqltypes.BigInteger):
263
263
 
264
264
 
265
265
  class AsyncpgJSON(json.JSON):
266
- render_bind_cast = True
267
-
268
266
  def result_processor(self, dialect, coltype):
269
267
  return None
270
268
 
271
269
 
272
270
  class AsyncpgJSONB(json.JSONB):
273
- render_bind_cast = True
274
-
275
271
  def result_processor(self, dialect, coltype):
276
272
  return None
277
273
 
@@ -9,7 +9,6 @@
9
9
  r"""
10
10
  .. dialect:: postgresql
11
11
  :name: PostgreSQL
12
- :full_support: 12, 13, 14, 15
13
12
  :normal_support: 9.6+
14
13
  :best_effort: 9+
15
14
 
@@ -4689,6 +4688,8 @@ class PGDialect(default.DefaultDialect):
4689
4688
  pg_catalog.pg_class.c.oid
4690
4689
  == pg_catalog.pg_description.c.objoid,
4691
4690
  pg_catalog.pg_description.c.objsubid == 0,
4691
+ pg_catalog.pg_description.c.classoid
4692
+ == sql.func.cast("pg_catalog.pg_class", REGCLASS),
4692
4693
  ),
4693
4694
  )
4694
4695
  .where(self._pg_class_relkind_condition(relkinds))
@@ -144,6 +144,7 @@ class JSON(sqltypes.JSON):
144
144
 
145
145
  """ # noqa
146
146
 
147
+ render_bind_cast = True
147
148
  astext_type = sqltypes.Text()
148
149
 
149
150
  def __init__(self, none_as_null=False, astext_type=None):
@@ -126,8 +126,6 @@ class _PGREGCONFIG(REGCONFIG):
126
126
 
127
127
 
128
128
  class _PGJSON(JSON):
129
- render_bind_cast = True
130
-
131
129
  def bind_processor(self, dialect):
132
130
  return self._make_bind_processor(None, dialect._psycopg_Json)
133
131
 
@@ -136,8 +134,6 @@ class _PGJSON(JSON):
136
134
 
137
135
 
138
136
  class _PGJSONB(JSONB):
139
- render_bind_cast = True
140
-
141
137
  def bind_processor(self, dialect):
142
138
  return self._make_bind_processor(None, dialect._psycopg_Jsonb)
143
139
 
@@ -10,7 +10,6 @@
10
10
  r"""
11
11
  .. dialect:: sqlite
12
12
  :name: SQLite
13
- :full_support: 3.36.0
14
13
  :normal_support: 3.12+
15
14
  :best_effort: 3.7.16+
16
15
 
@@ -1452,11 +1452,11 @@ class Result(_WithKeys, ResultInternal[Row[_TP]]):
1452
1452
  """Return exactly one scalar result or raise an exception.
1453
1453
 
1454
1454
  This is equivalent to calling :meth:`_engine.Result.scalars` and
1455
- then :meth:`_engine.Result.one`.
1455
+ then :meth:`_engine.ScalarResult.one`.
1456
1456
 
1457
1457
  .. seealso::
1458
1458
 
1459
- :meth:`_engine.Result.one`
1459
+ :meth:`_engine.ScalarResult.one`
1460
1460
 
1461
1461
  :meth:`_engine.Result.scalars`
1462
1462
 
@@ -1475,11 +1475,11 @@ class Result(_WithKeys, ResultInternal[Row[_TP]]):
1475
1475
  """Return exactly one scalar result or ``None``.
1476
1476
 
1477
1477
  This is equivalent to calling :meth:`_engine.Result.scalars` and
1478
- then :meth:`_engine.Result.one_or_none`.
1478
+ then :meth:`_engine.ScalarResult.one_or_none`.
1479
1479
 
1480
1480
  .. seealso::
1481
1481
 
1482
- :meth:`_engine.Result.one_or_none`
1482
+ :meth:`_engine.ScalarResult.one_or_none`
1483
1483
 
1484
1484
  :meth:`_engine.Result.scalars`
1485
1485
 
@@ -1917,11 +1917,11 @@ class TupleResult(FilterResult[_R], util.TypingOnly):
1917
1917
  """Return exactly one scalar result or raise an exception.
1918
1918
 
1919
1919
  This is equivalent to calling :meth:`_engine.Result.scalars`
1920
- and then :meth:`_engine.Result.one`.
1920
+ and then :meth:`_engine.ScalarResult.one`.
1921
1921
 
1922
1922
  .. seealso::
1923
1923
 
1924
- :meth:`_engine.Result.one`
1924
+ :meth:`_engine.ScalarResult.one`
1925
1925
 
1926
1926
  :meth:`_engine.Result.scalars`
1927
1927
 
@@ -1940,11 +1940,11 @@ class TupleResult(FilterResult[_R], util.TypingOnly):
1940
1940
  """Return exactly one or no scalar result.
1941
1941
 
1942
1942
  This is equivalent to calling :meth:`_engine.Result.scalars`
1943
- and then :meth:`_engine.Result.one_or_none`.
1943
+ and then :meth:`_engine.ScalarResult.one_or_none`.
1944
1944
 
1945
1945
  .. seealso::
1946
1946
 
1947
- :meth:`_engine.Result.one_or_none`
1947
+ :meth:`_engine.ScalarResult.one_or_none`
1948
1948
 
1949
1949
  :meth:`_engine.Result.scalars`
1950
1950
 
@@ -98,6 +98,7 @@ def association_proxy(
98
98
  default_factory: Union[_NoArg, Callable[[], _T]] = _NoArg.NO_ARG,
99
99
  compare: Union[_NoArg, bool] = _NoArg.NO_ARG,
100
100
  kw_only: Union[_NoArg, bool] = _NoArg.NO_ARG,
101
+ hash: Union[_NoArg, bool, None] = _NoArg.NO_ARG, # noqa: A002
101
102
  ) -> AssociationProxy[Any]:
102
103
  r"""Return a Python property implementing a view of a target
103
104
  attribute which references an attribute on members of the
@@ -198,6 +199,13 @@ def association_proxy(
198
199
 
199
200
  .. versionadded:: 2.0.0b4
200
201
 
202
+ :param hash: Specific to
203
+ :ref:`orm_declarative_native_dataclasses`, controls if this field
204
+ is included when generating the ``__hash__()`` method for the mapped
205
+ class.
206
+
207
+ .. versionadded:: 2.0.36
208
+
201
209
  :param info: optional, will be assigned to
202
210
  :attr:`.AssociationProxy.info` if present.
203
211
 
@@ -237,7 +245,7 @@ def association_proxy(
237
245
  cascade_scalar_deletes=cascade_scalar_deletes,
238
246
  create_on_none_assignment=create_on_none_assignment,
239
247
  attribute_options=_AttributeOptions(
240
- init, repr, default, default_factory, compare, kw_only
248
+ init, repr, default, default_factory, compare, kw_only, hash
241
249
  ),
242
250
  )
243
251
 
@@ -333,11 +333,11 @@ class AsyncResult(_WithKeys, AsyncCommon[Row[_TP]]):
333
333
  """Return exactly one scalar result or raise an exception.
334
334
 
335
335
  This is equivalent to calling :meth:`_asyncio.AsyncResult.scalars` and
336
- then :meth:`_asyncio.AsyncResult.one`.
336
+ then :meth:`_asyncio.AsyncScalarResult.one`.
337
337
 
338
338
  .. seealso::
339
339
 
340
- :meth:`_asyncio.AsyncResult.one`
340
+ :meth:`_asyncio.AsyncScalarResult.one`
341
341
 
342
342
  :meth:`_asyncio.AsyncResult.scalars`
343
343
 
@@ -356,11 +356,11 @@ class AsyncResult(_WithKeys, AsyncCommon[Row[_TP]]):
356
356
  """Return exactly one scalar result or ``None``.
357
357
 
358
358
  This is equivalent to calling :meth:`_asyncio.AsyncResult.scalars` and
359
- then :meth:`_asyncio.AsyncResult.one_or_none`.
359
+ then :meth:`_asyncio.AsyncScalarResult.one_or_none`.
360
360
 
361
361
  .. seealso::
362
362
 
363
- :meth:`_asyncio.AsyncResult.one_or_none`
363
+ :meth:`_asyncio.AsyncScalarResult.one_or_none`
364
364
 
365
365
  :meth:`_asyncio.AsyncResult.scalars`
366
366
 
@@ -869,11 +869,11 @@ class AsyncTupleResult(AsyncCommon[_R], util.TypingOnly):
869
869
  """Return exactly one scalar result or raise an exception.
870
870
 
871
871
  This is equivalent to calling :meth:`_engine.Result.scalars`
872
- and then :meth:`_engine.Result.one`.
872
+ and then :meth:`_engine.AsyncScalarResult.one`.
873
873
 
874
874
  .. seealso::
875
875
 
876
- :meth:`_engine.Result.one`
876
+ :meth:`_engine.AsyncScalarResult.one`
877
877
 
878
878
  :meth:`_engine.Result.scalars`
879
879
 
@@ -892,11 +892,11 @@ class AsyncTupleResult(AsyncCommon[_R], util.TypingOnly):
892
892
  """Return exactly one or no scalar result.
893
893
 
894
894
  This is equivalent to calling :meth:`_engine.Result.scalars`
895
- and then :meth:`_engine.Result.one_or_none`.
895
+ and then :meth:`_engine.AsyncScalarResult.one_or_none`.
896
896
 
897
897
  .. seealso::
898
898
 
899
- :meth:`_engine.Result.one_or_none`
899
+ :meth:`_engine.AsyncScalarResult.one_or_none`
900
900
 
901
901
  :meth:`_engine.Result.scalars`
902
902
 
@@ -1863,7 +1863,7 @@ class AsyncSessionTransaction(
1863
1863
  ) -> AsyncSessionTransaction:
1864
1864
  self.sync_transaction = self._assign_proxied(
1865
1865
  await greenlet_spawn(
1866
- self.session.sync_session.begin_nested # type: ignore
1866
+ self.session.sync_session.begin_nested
1867
1867
  if self.nested
1868
1868
  else self.session.sync_session.begin
1869
1869
  )