SQLAlchemy 2.0.30__py3-none-any.whl → 2.0.31__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.
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: SQLAlchemy
3
- Version: 2.0.30
3
+ Version: 2.0.31
4
4
  Summary: Database Abstraction Library
5
5
  Home-page: https://www.sqlalchemy.org
6
6
  Author: Mike Bayer
@@ -27,7 +27,7 @@ Requires-Python: >=3.7
27
27
  Description-Content-Type: text/x-rst
28
28
  License-File: LICENSE
29
29
  Requires-Dist: typing-extensions >=4.6.0
30
- Requires-Dist: greenlet !=0.4.17 ; platform_machine == "aarch64" or (platform_machine == "ppc64le" or (platform_machine == "x86_64" or (platform_machine == "amd64" or (platform_machine == "AMD64" or (platform_machine == "win32" or platform_machine == "WIN32")))))
30
+ Requires-Dist: greenlet !=0.4.17 ; python_version < "3.13" and (platform_machine == "aarch64" or (platform_machine == "ppc64le" or (platform_machine == "x86_64" or (platform_machine == "amd64" or (platform_machine == "AMD64" or (platform_machine == "win32" or platform_machine == "WIN32"))))))
31
31
  Requires-Dist: importlib-metadata ; python_version < "3.8"
32
32
  Provides-Extra: aiomysql
33
33
  Requires-Dist: greenlet !=0.4.17 ; extra == 'aiomysql'
@@ -1,4 +1,4 @@
1
- sqlalchemy/__init__.py,sha256=yI12J_Tdp5kmBfaR8P8wQjcZg4U0qua6pbbB7JTvCsw,13033
1
+ sqlalchemy/__init__.py,sha256=sz89h0rk4HnopZTE-CXiZz3UlVY8JOD-IuYU_8VFqxU,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
@@ -29,8 +29,8 @@ sqlalchemy/dialects/mssql/provision.py,sha256=RTVbgYLFAHzEnpVQDJroU8ji_10MqBTiZf
29
29
  sqlalchemy/dialects/mssql/pymssql.py,sha256=eZRLz7HGt3SdoZUjFBmA9BS43N7AhIASw7VPBPEJuG0,4038
30
30
  sqlalchemy/dialects/mssql/pyodbc.py,sha256=vwM-vBlmRwrqxOc73P0sFOrBSwn24wzc5IkEOpalbXQ,27056
31
31
  sqlalchemy/dialects/mysql/__init__.py,sha256=bxbi4hkysUK2OOVvr1F49akUj1cky27kKb07tgFzI9U,2153
32
- sqlalchemy/dialects/mysql/aiomysql.py,sha256=67JrSUD1BmN88k_ASk6GvrttZFQiFjDY0wBiwdllxMk,9964
33
- sqlalchemy/dialects/mysql/asyncmy.py,sha256=CGILIRKf_2Ut9Ng2yBlmdg62laL-ockEm6GMuN7xlKE,10033
32
+ sqlalchemy/dialects/mysql/aiomysql.py,sha256=-oMZnCqNsSki8mlQRTWIwiQPT1OVdZIuANkb90q8LAs,9999
33
+ sqlalchemy/dialects/mysql/asyncmy.py,sha256=YpuuOh8VknEeqHqUXQGfQ3jhfO3Xb-vZv78Jq5cscJ0,10067
34
34
  sqlalchemy/dialects/mysql/base.py,sha256=KA7tvRxKUw0KwHwMth2rz-NWV0xMkVbYvPoBM9wrAFw,120850
35
35
  sqlalchemy/dialects/mysql/cymysql.py,sha256=eXT1ry0w_qRxjiO24M980c-8PZ9qSsbhqBHntjEiKB0,2300
36
36
  sqlalchemy/dialects/mysql/dml.py,sha256=HXJMAvimJsqvhj3UZO4vW_6LkF5RqaKbHvklAjor7yU,7645
@@ -44,7 +44,7 @@ sqlalchemy/dialects/mysql/mysqldb.py,sha256=zPHKMQbHu8bFuD7YvOJewn2axQbfwA93NZoe
44
44
  sqlalchemy/dialects/mysql/provision.py,sha256=4oGkClQ8jC3YLPF54sB4kCjFc8HRTwf5zl5zftAAXGo,3474
45
45
  sqlalchemy/dialects/mysql/pymysql.py,sha256=GUnSHd2M2uKjmN46Hheymtm26g7phEgwYOXrX0zLY8M,4083
46
46
  sqlalchemy/dialects/mysql/pyodbc.py,sha256=072crI4qVyPhajYvHnsfFeSrNjLFVPIjBQKo5uyz5yk,4297
47
- sqlalchemy/dialects/mysql/reflection.py,sha256=XXM8AGpaRTqDvuObg89Bzn_4h2ETG03viYBpWZJM3vc,22822
47
+ sqlalchemy/dialects/mysql/reflection.py,sha256=3u34YwT1JJh3uThGZJZ3FKdnUcT7v08QB-tAl1r7VRk,22834
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
@@ -57,7 +57,7 @@ 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=e4Zv7hTb8OdwfvrM_B82GXgORBJeNQ2vChVfogvN7KI,40240
60
+ sqlalchemy/dialects/postgresql/asyncpg.py,sha256=nfujNbmAjkVPPt9jhh5ZJp8QziZQJ0fMG4JNnLTdsag,40206
61
61
  sqlalchemy/dialects/postgresql/base.py,sha256=ed49Ode09deJF3jXr8V5sSHTwVoFVq0dlvNdP3mJaBQ,178989
62
62
  sqlalchemy/dialects/postgresql/dml.py,sha256=Pc69Le6qzmUHHb1FT5zeUSD31dWm6SBgdCAGW89cs3s,11212
63
63
  sqlalchemy/dialects/postgresql/ext.py,sha256=1bZ--iNh2O9ym7l2gXZX48yP3yMO4dqb9RpYro2Mj2Q,16262
@@ -68,13 +68,13 @@ sqlalchemy/dialects/postgresql/operators.py,sha256=NsAaWun_tL3d_be0fs9YL6T4LPKK6
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=yqyx-aDFO9l2YcL9f4T5HBP_Lnt5dHsMjpuXUG8mi7A,5762
71
- sqlalchemy/dialects/postgresql/psycopg.py,sha256=3_xRoZ71mgTR-tYKDb6N0ebbrRD3dFwVRI5-ZuFFOg8,23378
71
+ sqlalchemy/dialects/postgresql/psycopg.py,sha256=ACkfuT87vUJEW4kJyUqDYTwlnl5u0FZFlDcvLzxNzFQ,23226
72
72
  sqlalchemy/dialects/postgresql/psycopg2.py,sha256=DbCB1-90O8YQDaIR67RtKOjzW3nvrdHoiwnVWYv_mX4,31605
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
- sqlalchemy/dialects/sqlite/aiosqlite.py,sha256=OMvxP2eWyqk5beF-sHhzxRmjzO4VCQp55q7NH2XPVTE,12305
77
+ sqlalchemy/dialects/sqlite/aiosqlite.py,sha256=g3qGV6jmiXabWyb3282g_Nmxtj1jThxGSe9C9yalb-U,12345
78
78
  sqlalchemy/dialects/sqlite/base.py,sha256=lUtigjn7NdPBq831zQsLcBwdwRJqdgKM_tUaDrMElOE,96794
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
@@ -103,7 +103,7 @@ sqlalchemy/engine/util.py,sha256=bNirO8k1S8yOW61uNH-a9QrWtAJ9VGFgbiR0lk1lUQU,568
103
103
  sqlalchemy/event/__init__.py,sha256=KBrp622xojnC3FFquxa2JsMamwAbfkvzfv6Op0NKiYc,997
104
104
  sqlalchemy/event/api.py,sha256=DtDVgjKSorOfp9MGJ7fgMWrj4seC_hkwF4D8CW1RFZU,8226
105
105
  sqlalchemy/event/attr.py,sha256=X8QeHGK4ioSYht1vkhc11f606_mq_t91jMNIT314ubs,20751
106
- sqlalchemy/event/base.py,sha256=3n9FmUkcXYHHyGzfpjKDsrIUVCNST_hq4zOtrNm0_a4,14954
106
+ sqlalchemy/event/base.py,sha256=XeNX-y2X2rYZqxNEnylx-_UUTYpVc4TWjLWIGjx4Jkc,15161
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
@@ -117,14 +117,14 @@ sqlalchemy/ext/indexable.py,sha256=UkTelbydKCdKelzbv3HWFFavoET9WocKaGRPGEOVfN8,1
117
117
  sqlalchemy/ext/instrumentation.py,sha256=sg8ghDjdHSODFXh_jAmpgemnNX1rxCeeXEG3-PMdrNk,15707
118
118
  sqlalchemy/ext/mutable.py,sha256=L5ZkHBGYhMaqO75Xtyrk2DBR44RDk0g6Rz2HzHH0F8Q,37355
119
119
  sqlalchemy/ext/orderinglist.py,sha256=TGYbsGH72wEZcFNQDYDsZg9OSPuzf__P8YX8_2HtYUo,14384
120
- sqlalchemy/ext/serializer.py,sha256=YemanWdeMVUDweHCnQc-iMO6mVVXNo2qQ5NK0Eb2_Es,6178
120
+ sqlalchemy/ext/serializer.py,sha256=D0g4jMZkRk0Gjr0L-FZe81SR63h0Zs-9JzuWtT_SD7k,6140
121
121
  sqlalchemy/ext/asyncio/__init__.py,sha256=1OqSxEyIUn7RWLGyO12F-jAUIvk1I6DXlVy80-Gvkds,1317
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
125
  sqlalchemy/ext/asyncio/result.py,sha256=ID2eh-NHW-lnNFTxbKhje8fr-tnsucUsiw_jcpGcSPc,30409
126
- sqlalchemy/ext/asyncio/scoping.py,sha256=BmE1UbFV_C4BXB4WngJc523DeMH-nTchNb8ORiSPYfE,52597
127
- sqlalchemy/ext/asyncio/session.py,sha256=ZZklu124Rm2p9B5pbcDbR0zVyEuq-rn69_ltByuKNXo,63092
126
+ sqlalchemy/ext/asyncio/scoping.py,sha256=UxHAFxtWKqA7TEozyN2h7MJyzSspTCrS-1SlgQLTExo,52608
127
+ sqlalchemy/ext/asyncio/session.py,sha256=mkFFC1C2mPuopz3BwkfSVTlp3vuIDc8hxiQx5ky5rvc,63103
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,7 +137,7 @@ sqlalchemy/ext/mypy/util.py,sha256=1zuDQG8ezmF-XhJmAQU_lcBHiD--sL-lq20clg8t4lE,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=tlTZoY87CFSBpnw7iIYKTCeofjLg-r2ibfCfMfbyEMU,99461
140
+ sqlalchemy/orm/_orm_constructors.py,sha256=lVn8IZzU_Yq88you3qC8cnm4D1V9Wsf_LeEVTMX-QGc,100158
141
141
  sqlalchemy/orm/_typing.py,sha256=DVBfpHmDVK4x1zxaGJPY2GoTrAsyR6uexv20Lzf1afc,4973
142
142
  sqlalchemy/orm/attributes.py,sha256=wGpyY9aIxWRkL3y6qlbUgIW78rGA4X38ZhOaWI9S818,92535
143
143
  sqlalchemy/orm/base.py,sha256=re6A8ooMxLyfCAeQfhBwwxeJQkiH7EtzzOZIVIiTPlw,27466
@@ -146,7 +146,7 @@ sqlalchemy/orm/clsregistry.py,sha256=29LyYiuj0qbebOpgW6DbBPNB2ikTweFQar1byCst7I0
146
146
  sqlalchemy/orm/collections.py,sha256=jpMsJGVixmrW9kfT8wevm9kpatKRqyDLcqWd7CjKPxE,52179
147
147
  sqlalchemy/orm/context.py,sha256=pFFc-1ZjaV3aQMAO27UIh0W6NyLc30n2IbuWNprMtS8,112445
148
148
  sqlalchemy/orm/decl_api.py,sha256=_WPKQ_vSE5k2TLtNmkaxxYmvbhZvkRMrrvCeDxdqDQE,63998
149
- sqlalchemy/orm/decl_base.py,sha256=Tq6I3Jm3bkM01mmoiHfdFXLE94YDk1ik2u2dXL1RxLc,81601
149
+ sqlalchemy/orm/decl_base.py,sha256=oeL7xrty2J81FyDx03dNe02BtZ-R6iYpum-BoA1rhik,82822
150
150
  sqlalchemy/orm/dependency.py,sha256=hgjksUWhgbmgHK5GdJdiDCBgDAIGQXIrY-Tj79tbL2k,47631
151
151
  sqlalchemy/orm/descriptor_props.py,sha256=pKtpP7H1LB_YuHRVrEYpfFZybEnUUdPwQXxduYFe2hA,37180
152
152
  sqlalchemy/orm/dynamic.py,sha256=jksBDCOsm6EBMVParcNGuMeaAv12hX4IzouKspC-HPA,9786
@@ -164,15 +164,15 @@ sqlalchemy/orm/persistence.py,sha256=dzyB2JOXNwQgaCbN8kh0sEz00WFePr48qf8NWVCUZH8
164
164
  sqlalchemy/orm/properties.py,sha256=eDPFzxYUgdM3uWjHywnb1XW-i0tVKKyx7A2MCD31GQU,29306
165
165
  sqlalchemy/orm/query.py,sha256=qKuFTUlbGVjs84AQ7APBY0PJhrzc2JJ1upeI658MV_o,117596
166
166
  sqlalchemy/orm/relationships.py,sha256=dS5SY0v1MiD7iCNnAQlHaI6prUQhL5EkXT7ijc8FR8E,128644
167
- sqlalchemy/orm/scoping.py,sha256=gFYywLeMmd5qjFdVPzeuCX727mTaChrCv8aqn4wPke0,78677
168
- sqlalchemy/orm/session.py,sha256=Da-wd01Rw5fCqRr05RBY3dath-ssdloB4BvVrTVy8LA,195250
169
- sqlalchemy/orm/state.py,sha256=mW2f1hMSNeTJ89foutOE1EqLLD6DZkrSeO-pgagZweg,37520
167
+ sqlalchemy/orm/scoping.py,sha256=rJVc7_Lic4V00HZ-UvYFWkVpXqdrMayRmIs4fIwH1UA,78688
168
+ sqlalchemy/orm/session.py,sha256=aBBbHL08H-diS6UxGbySgitga6FCRWdN-EcpP3tPC4M,195261
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=OtmMtWpCDk4ZiaM_ipzGn80sPOi6Opwj3Co4lUHpd_w,114206
172
- sqlalchemy/orm/strategy_options.py,sha256=tFDJllL8Evxo2UjpyMkrxxRdphaclM-FBUd9O8WArdY,85366
171
+ sqlalchemy/orm/strategies.py,sha256=3fYRUlO61WKgxH2ZSn1kwkJyTRHZk7b9vlfCR4i1kXY,114994
172
+ sqlalchemy/orm/strategy_options.py,sha256=-n44NV8QX-3uWjhFMA_R_7vYy-d57gJY9snB9JeOj-w,85341
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=PvU_J4PSNcaOoNnsLY9qZ0lcElG71ykvdZSDZ76WSwg,80660
175
+ sqlalchemy/orm/util.py,sha256=JdroiJ788zPjrNdLYae_bj0hsxzEDJjLbpUMwqonLCU,80728
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
@@ -194,7 +194,7 @@ sqlalchemy/sql/crud.py,sha256=g9xcol2KRGjZi1qsb2-bVz8zgVy_53gfMtJcnNO2vyQ,56521
194
194
  sqlalchemy/sql/ddl.py,sha256=CIqMilCKfuQnF0lrZsQdTxgrbXqcTauKr0Ojzj77PFQ,45602
195
195
  sqlalchemy/sql/default_comparator.py,sha256=utXWsZVGEjflhFfCT4ywa6RnhORc1Rryo87Hga71Rps,16707
196
196
  sqlalchemy/sql/dml.py,sha256=pn0Lm1ofC5qVZzwGWFW73lPCiNba8OsTeemurJgwRyg,65614
197
- sqlalchemy/sql/elements.py,sha256=coAHu2qUNrEKOv0ZvnDsc3G8_6o9lciylZn-K6fJDXU,174621
197
+ sqlalchemy/sql/elements.py,sha256=XpfBuu4sh5W5lHHUZN95DTl4FM4MM_zs0GKqHZvdXXM,176146
198
198
  sqlalchemy/sql/events.py,sha256=iC_Q1Htm1Aobt5tOYxWfHHqNpoytrULORmUKcusH_-E,18290
199
199
  sqlalchemy/sql/expression.py,sha256=VMX-dLpsZYnVRJpYNDozDUgaj7iQ0HuewUKVefD57PE,7586
200
200
  sqlalchemy/sql/functions.py,sha256=kMMYplvuIHFAPwxBI03SizwaLcYEHzysecWk-R1V-JM,63762
@@ -202,9 +202,9 @@ sqlalchemy/sql/lambdas.py,sha256=DP0Qz7Ypo8QhzMwygGHYgRhwJMx-rNezO1euouH3iYU,492
202
202
  sqlalchemy/sql/naming.py,sha256=ZHs1qSV3ou8TYmZ92uvU3sfdklUQlIz4uhe330n05SU,6858
203
203
  sqlalchemy/sql/operators.py,sha256=r4oQp4h5zTMFFOpiFNV56joIK-QIjJCobatsmaZ-724,75935
204
204
  sqlalchemy/sql/roles.py,sha256=pOsVn_OZD7mF2gJByHf24Rjopt0_Hu3dUCEOK5t4KS8,7662
205
- sqlalchemy/sql/schema.py,sha256=GctEXTYd5R9nqS07xgf5uFC-_3UIZJ7q3RaetzSs0Pk,229225
206
- sqlalchemy/sql/selectable.py,sha256=XHL0xJeLWnQeGG_dK7zQ8lNsCGdP8DeJQuCF4bCW-bo,233505
207
- sqlalchemy/sql/sqltypes.py,sha256=AAXED0rebCNmrY8K8kL6zox8_GD0L_p0lRzwM3SxCGk,126076
205
+ sqlalchemy/sql/schema.py,sha256=-5QrCcIJNbs1Et6oRzfpTDvhP4R3KbRJkGiYuJExayI,229767
206
+ sqlalchemy/sql/selectable.py,sha256=gAOLh2hq0xRVqAaO6ctQr9cgLgdz40iCEhCJ_Gp49cE,233587
207
+ sqlalchemy/sql/sqltypes.py,sha256=d3xNVCDPV2MaPInKWvIpLDGS8NwGFLP614_dWws3B_U,126808
208
208
  sqlalchemy/sql/traversals.py,sha256=NFgJrVJzInO3HrnG90CklxrDXhFydZohPs2vRJkh3Bo,33589
209
209
  sqlalchemy/sql/type_api.py,sha256=CJAvRix_rRoOsE77sH4BqeGX0lIdtk8dX-StjGx3mUo,83208
210
210
  sqlalchemy/sql/util.py,sha256=qGHQF-tPCj-m1FBerzT7weCanGcXU7dK5m-W7NHio-4,48077
@@ -248,21 +248,21 @@ sqlalchemy/testing/suite/test_types.py,sha256=rFmTOg6XuMch9L2-XthfLJRCTTwpZbMfrN
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
250
  sqlalchemy/util/__init__.py,sha256=B3bedg-LSQEscwqgmYYU-VENUX8_zAE3q9vb7tkfJNY,8277
251
- sqlalchemy/util/_collections.py,sha256=NE9dGJo8UNXIMbY3l3k8AO9BdPW04DlKTYraKCinchI,20063
252
- sqlalchemy/util/_concurrency_py3k.py,sha256=IBxZDTSyLbEx9I9ViQVXYP1twxM-pTa-3x_-U8snmLU,9191
251
+ sqlalchemy/util/_collections.py,sha256=aZoSAVOXnHBoYEsxDOi0O9odg9wqLbGb7PGjaWQKiyY,20078
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
255
  sqlalchemy/util/compat.py,sha256=R6bpBydldtbr6h7oJePihQxFb7jKiI-YDsK465MSOzk,8714
256
256
  sqlalchemy/util/concurrency.py,sha256=9lT_cMoO1fZNdY8QTUZ22oeSf-L5I-79Ke7chcBNPA0,3304
257
257
  sqlalchemy/util/deprecations.py,sha256=YBwvvYhSB8LhasIZRKvg_-WNoVhPUcaYI1ZrnjDn868,11971
258
- sqlalchemy/util/langhelpers.py,sha256=kT7kwtTOPzHUFs6PhM1IEoW5ioeuFUFg2pjHSbH4d94,64891
258
+ sqlalchemy/util/langhelpers.py,sha256=5XpX5X6sqKtZ6B07WmlP2oOCbUn7CptBNVTe4LR7jqA,64957
259
259
  sqlalchemy/util/preloaded.py,sha256=az7NmLJLsqs0mtM9uBkIu10-841RYDq8wOyqJ7xXvqE,5904
260
260
  sqlalchemy/util/queue.py,sha256=CaeSEaYZ57YwtmLdNdOIjT5PK_LCuwMFiO0mpp39ybM,10185
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=UctfgugSTnFJgZraikXJbB-5RoV7oyccZmbf2NeRfoA,16671
264
- SQLAlchemy-2.0.30.dist-info/LICENSE,sha256=PA9Zq4h9BB3mpOUv_j6e212VIt6Qn66abNettue-MpM,1100
265
- SQLAlchemy-2.0.30.dist-info/METADATA,sha256=je_u9qkpPX36jMg6zWrd8VjcEuly2P0zmsxfGP9GAHE,9602
266
- SQLAlchemy-2.0.30.dist-info/WHEEL,sha256=GJ7t_kWBFywbagK5eo9IoUwLW6oyOeTKmQ-9iHFVNxQ,92
267
- SQLAlchemy-2.0.30.dist-info/top_level.txt,sha256=rp-ZgB7D8G11ivXON5VGPjupT1voYmWqkciDt5Uaw_Q,11
268
- SQLAlchemy-2.0.30.dist-info/RECORD,,
264
+ SQLAlchemy-2.0.31.dist-info/LICENSE,sha256=PA9Zq4h9BB3mpOUv_j6e212VIt6Qn66abNettue-MpM,1100
265
+ SQLAlchemy-2.0.31.dist-info/METADATA,sha256=Fv-yTpqMYGTC6PU1Jc8Ka1Evr74lqaBGNQCG7ALeO3g,9632
266
+ SQLAlchemy-2.0.31.dist-info/WHEEL,sha256=GJ7t_kWBFywbagK5eo9IoUwLW6oyOeTKmQ-9iHFVNxQ,92
267
+ SQLAlchemy-2.0.31.dist-info/top_level.txt,sha256=rp-ZgB7D8G11ivXON5VGPjupT1voYmWqkciDt5Uaw_Q,11
268
+ SQLAlchemy-2.0.31.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.30"
272
+ __version__ = "2.0.31"
273
273
 
274
274
 
275
275
  def __go(lcls: Any) -> None:
@@ -27,6 +27,8 @@ This dialect should normally be used only with the
27
27
 
28
28
 
29
29
  """ # noqa
30
+ from collections import deque
31
+
30
32
  from .pymysql import MySQLDialect_pymysql
31
33
  from ... import pool
32
34
  from ... import util
@@ -57,7 +59,7 @@ class AsyncAdapt_aiomysql_cursor:
57
59
 
58
60
  # see https://github.com/aio-libs/aiomysql/issues/543
59
61
  self._cursor = self.await_(cursor.__aenter__())
60
- self._rows = []
62
+ self._rows = deque()
61
63
 
62
64
  @property
63
65
  def description(self):
@@ -87,7 +89,7 @@ class AsyncAdapt_aiomysql_cursor:
87
89
  # exhausting rows, which we already have done for sync cursor.
88
90
  # another option would be to emulate aiosqlite dialect and assign
89
91
  # cursor only if we are doing server side cursor operation.
90
- self._rows[:] = []
92
+ self._rows.clear()
91
93
 
92
94
  def execute(self, operation, parameters=None):
93
95
  return self.await_(self._execute_async(operation, parameters))
@@ -106,7 +108,7 @@ class AsyncAdapt_aiomysql_cursor:
106
108
  # of that here since our default result is not async.
107
109
  # we could just as easily grab "_rows" here and be done with it
108
110
  # but this is safer.
109
- self._rows = list(await self._cursor.fetchall())
111
+ self._rows = deque(await self._cursor.fetchall())
110
112
  return result
111
113
 
112
114
  async def _executemany_async(self, operation, seq_of_parameters):
@@ -118,11 +120,11 @@ class AsyncAdapt_aiomysql_cursor:
118
120
 
119
121
  def __iter__(self):
120
122
  while self._rows:
121
- yield self._rows.pop(0)
123
+ yield self._rows.popleft()
122
124
 
123
125
  def fetchone(self):
124
126
  if self._rows:
125
- return self._rows.pop(0)
127
+ return self._rows.popleft()
126
128
  else:
127
129
  return None
128
130
 
@@ -130,13 +132,12 @@ class AsyncAdapt_aiomysql_cursor:
130
132
  if size is None:
131
133
  size = self.arraysize
132
134
 
133
- retval = self._rows[0:size]
134
- self._rows[:] = self._rows[size:]
135
- return retval
135
+ rr = self._rows
136
+ return [rr.popleft() for _ in range(min(size, len(rr)))]
136
137
 
137
138
  def fetchall(self):
138
- retval = self._rows[:]
139
- self._rows[:] = []
139
+ retval = list(self._rows)
140
+ self._rows.clear()
140
141
  return retval
141
142
 
142
143
 
@@ -25,6 +25,7 @@ This dialect should normally be used only with the
25
25
 
26
26
 
27
27
  """ # noqa
28
+ from collections import deque
28
29
  from contextlib import asynccontextmanager
29
30
 
30
31
  from .pymysql import MySQLDialect_pymysql
@@ -56,7 +57,7 @@ class AsyncAdapt_asyncmy_cursor:
56
57
  cursor = self._connection.cursor()
57
58
 
58
59
  self._cursor = self.await_(cursor.__aenter__())
59
- self._rows = []
60
+ self._rows = deque()
60
61
 
61
62
  @property
62
63
  def description(self):
@@ -86,7 +87,7 @@ class AsyncAdapt_asyncmy_cursor:
86
87
  # exhausting rows, which we already have done for sync cursor.
87
88
  # another option would be to emulate aiosqlite dialect and assign
88
89
  # cursor only if we are doing server side cursor operation.
89
- self._rows[:] = []
90
+ self._rows.clear()
90
91
 
91
92
  def execute(self, operation, parameters=None):
92
93
  return self.await_(self._execute_async(operation, parameters))
@@ -108,7 +109,7 @@ class AsyncAdapt_asyncmy_cursor:
108
109
  # of that here since our default result is not async.
109
110
  # we could just as easily grab "_rows" here and be done with it
110
111
  # but this is safer.
111
- self._rows = list(await self._cursor.fetchall())
112
+ self._rows = deque(await self._cursor.fetchall())
112
113
  return result
113
114
 
114
115
  async def _executemany_async(self, operation, seq_of_parameters):
@@ -120,11 +121,11 @@ class AsyncAdapt_asyncmy_cursor:
120
121
 
121
122
  def __iter__(self):
122
123
  while self._rows:
123
- yield self._rows.pop(0)
124
+ yield self._rows.popleft()
124
125
 
125
126
  def fetchone(self):
126
127
  if self._rows:
127
- return self._rows.pop(0)
128
+ return self._rows.popleft()
128
129
  else:
129
130
  return None
130
131
 
@@ -132,13 +133,12 @@ class AsyncAdapt_asyncmy_cursor:
132
133
  if size is None:
133
134
  size = self.arraysize
134
135
 
135
- retval = self._rows[0:size]
136
- self._rows[:] = self._rows[size:]
137
- return retval
136
+ rr = self._rows
137
+ return [rr.popleft() for _ in range(min(size, len(rr)))]
138
138
 
139
139
  def fetchall(self):
140
- retval = self._rows[:]
141
- self._rows[:] = []
140
+ retval = list(self._rows)
141
+ self._rows.clear()
142
142
  return retval
143
143
 
144
144
 
@@ -505,7 +505,7 @@ class MySQLTableDefinitionParser:
505
505
  #
506
506
  # unique constraints come back as KEYs
507
507
  kw = quotes.copy()
508
- kw["on"] = "RESTRICT|CASCADE|SET NULL|NO ACTION"
508
+ kw["on"] = "RESTRICT|CASCADE|SET NULL|NO ACTION|SET DEFAULT"
509
509
  self._re_fk_constraint = _re_compile(
510
510
  r" "
511
511
  r"CONSTRAINT +"
@@ -171,7 +171,7 @@ client using this setting passed to :func:`_asyncio.create_async_engine`::
171
171
 
172
172
  from __future__ import annotations
173
173
 
174
- import collections
174
+ from collections import deque
175
175
  import decimal
176
176
  import json as _py_json
177
177
  import re
@@ -487,7 +487,7 @@ class AsyncAdapt_asyncpg_cursor:
487
487
  def __init__(self, adapt_connection):
488
488
  self._adapt_connection = adapt_connection
489
489
  self._connection = adapt_connection._connection
490
- self._rows = []
490
+ self._rows = deque()
491
491
  self._cursor = None
492
492
  self.description = None
493
493
  self.arraysize = 1
@@ -495,7 +495,7 @@ class AsyncAdapt_asyncpg_cursor:
495
495
  self._invalidate_schema_cache_asof = 0
496
496
 
497
497
  def close(self):
498
- self._rows[:] = []
498
+ self._rows.clear()
499
499
 
500
500
  def _handle_exception(self, error):
501
501
  self._adapt_connection._handle_exception(error)
@@ -535,7 +535,7 @@ class AsyncAdapt_asyncpg_cursor:
535
535
  self._cursor = await prepared_stmt.cursor(*parameters)
536
536
  self.rowcount = -1
537
537
  else:
538
- self._rows = await prepared_stmt.fetch(*parameters)
538
+ self._rows = deque(await prepared_stmt.fetch(*parameters))
539
539
  status = prepared_stmt.get_statusmsg()
540
540
 
541
541
  reg = re.match(
@@ -583,11 +583,11 @@ class AsyncAdapt_asyncpg_cursor:
583
583
 
584
584
  def __iter__(self):
585
585
  while self._rows:
586
- yield self._rows.pop(0)
586
+ yield self._rows.popleft()
587
587
 
588
588
  def fetchone(self):
589
589
  if self._rows:
590
- return self._rows.pop(0)
590
+ return self._rows.popleft()
591
591
  else:
592
592
  return None
593
593
 
@@ -595,13 +595,12 @@ class AsyncAdapt_asyncpg_cursor:
595
595
  if size is None:
596
596
  size = self.arraysize
597
597
 
598
- retval = self._rows[0:size]
599
- self._rows[:] = self._rows[size:]
600
- return retval
598
+ rr = self._rows
599
+ return [rr.popleft() for _ in range(min(size, len(rr)))]
601
600
 
602
601
  def fetchall(self):
603
- retval = self._rows[:]
604
- self._rows[:] = []
602
+ retval = list(self._rows)
603
+ self._rows.clear()
605
604
  return retval
606
605
 
607
606
 
@@ -611,23 +610,21 @@ class AsyncAdapt_asyncpg_ss_cursor(AsyncAdapt_asyncpg_cursor):
611
610
 
612
611
  def __init__(self, adapt_connection):
613
612
  super().__init__(adapt_connection)
614
- self._rowbuffer = None
613
+ self._rowbuffer = deque()
615
614
 
616
615
  def close(self):
617
616
  self._cursor = None
618
- self._rowbuffer = None
617
+ self._rowbuffer.clear()
619
618
 
620
619
  def _buffer_rows(self):
620
+ assert self._cursor is not None
621
621
  new_rows = self._adapt_connection.await_(self._cursor.fetch(50))
622
- self._rowbuffer = collections.deque(new_rows)
622
+ self._rowbuffer.extend(new_rows)
623
623
 
624
624
  def __aiter__(self):
625
625
  return self
626
626
 
627
627
  async def __anext__(self):
628
- if not self._rowbuffer:
629
- self._buffer_rows()
630
-
631
628
  while True:
632
629
  while self._rowbuffer:
633
630
  yield self._rowbuffer.popleft()
@@ -650,21 +647,19 @@ class AsyncAdapt_asyncpg_ss_cursor(AsyncAdapt_asyncpg_cursor):
650
647
  if not self._rowbuffer:
651
648
  self._buffer_rows()
652
649
 
653
- buf = list(self._rowbuffer)
654
- lb = len(buf)
650
+ assert self._cursor is not None
651
+ rb = self._rowbuffer
652
+ lb = len(rb)
655
653
  if size > lb:
656
- buf.extend(
654
+ rb.extend(
657
655
  self._adapt_connection.await_(self._cursor.fetch(size - lb))
658
656
  )
659
657
 
660
- result = buf[0:size]
661
- self._rowbuffer = collections.deque(buf[size:])
662
- return result
658
+ return [rb.popleft() for _ in range(min(size, len(rb)))]
663
659
 
664
660
  def fetchall(self):
665
- ret = list(self._rowbuffer) + list(
666
- self._adapt_connection.await_(self._all())
667
- )
661
+ ret = list(self._rowbuffer)
662
+ ret.extend(self._adapt_connection.await_(self._all()))
668
663
  self._rowbuffer.clear()
669
664
  return ret
670
665
 
@@ -85,6 +85,7 @@ specified::
85
85
  """ # noqa
86
86
  from __future__ import annotations
87
87
 
88
+ from collections import deque
88
89
  import logging
89
90
  import re
90
91
  from typing import cast
@@ -564,7 +565,7 @@ class AsyncAdapt_psycopg_cursor:
564
565
  def __init__(self, cursor, await_) -> None:
565
566
  self._cursor = cursor
566
567
  self.await_ = await_
567
- self._rows = []
568
+ self._rows = deque()
568
569
 
569
570
  def __getattr__(self, name):
570
571
  return getattr(self._cursor, name)
@@ -591,24 +592,19 @@ class AsyncAdapt_psycopg_cursor:
591
592
  # eq/ne
592
593
  if res and res.status == self._psycopg_ExecStatus.TUPLES_OK:
593
594
  rows = self.await_(self._cursor.fetchall())
594
- if not isinstance(rows, list):
595
- self._rows = list(rows)
596
- else:
597
- self._rows = rows
595
+ self._rows = deque(rows)
598
596
  return result
599
597
 
600
598
  def executemany(self, query, params_seq):
601
599
  return self.await_(self._cursor.executemany(query, params_seq))
602
600
 
603
601
  def __iter__(self):
604
- # TODO: try to avoid pop(0) on a list
605
602
  while self._rows:
606
- yield self._rows.pop(0)
603
+ yield self._rows.popleft()
607
604
 
608
605
  def fetchone(self):
609
606
  if self._rows:
610
- # TODO: try to avoid pop(0) on a list
611
- return self._rows.pop(0)
607
+ return self._rows.popleft()
612
608
  else:
613
609
  return None
614
610
 
@@ -616,13 +612,12 @@ class AsyncAdapt_psycopg_cursor:
616
612
  if size is None:
617
613
  size = self._cursor.arraysize
618
614
 
619
- retval = self._rows[0:size]
620
- self._rows = self._rows[size:]
621
- return retval
615
+ rr = self._rows
616
+ return [rr.popleft() for _ in range(min(size, len(rr)))]
622
617
 
623
618
  def fetchall(self):
624
- retval = self._rows
625
- self._rows = []
619
+ retval = list(self._rows)
620
+ self._rows.clear()
626
621
  return retval
627
622
 
628
623
 
@@ -78,6 +78,7 @@ The solution is similar to :ref:`pysqlite_serializable`. This is achieved by the
78
78
  """ # noqa
79
79
 
80
80
  import asyncio
81
+ from collections import deque
81
82
  from functools import partial
82
83
 
83
84
  from .base import SQLiteExecutionContext
@@ -113,10 +114,10 @@ class AsyncAdapt_aiosqlite_cursor:
113
114
  self.arraysize = 1
114
115
  self.rowcount = -1
115
116
  self.description = None
116
- self._rows = []
117
+ self._rows = deque()
117
118
 
118
119
  def close(self):
119
- self._rows[:] = []
120
+ self._rows.clear()
120
121
 
121
122
  def execute(self, operation, parameters=None):
122
123
  try:
@@ -132,7 +133,7 @@ class AsyncAdapt_aiosqlite_cursor:
132
133
  self.lastrowid = self.rowcount = -1
133
134
 
134
135
  if not self.server_side:
135
- self._rows = self.await_(_cursor.fetchall())
136
+ self._rows = deque(self.await_(_cursor.fetchall()))
136
137
  else:
137
138
  self.description = None
138
139
  self.lastrowid = _cursor.lastrowid
@@ -161,11 +162,11 @@ class AsyncAdapt_aiosqlite_cursor:
161
162
 
162
163
  def __iter__(self):
163
164
  while self._rows:
164
- yield self._rows.pop(0)
165
+ yield self._rows.popleft()
165
166
 
166
167
  def fetchone(self):
167
168
  if self._rows:
168
- return self._rows.pop(0)
169
+ return self._rows.popleft()
169
170
  else:
170
171
  return None
171
172
 
@@ -173,13 +174,12 @@ class AsyncAdapt_aiosqlite_cursor:
173
174
  if size is None:
174
175
  size = self.arraysize
175
176
 
176
- retval = self._rows[0:size]
177
- self._rows[:] = self._rows[size:]
178
- return retval
177
+ rr = self._rows
178
+ return [rr.popleft() for _ in range(min(size, len(rr)))]
179
179
 
180
180
  def fetchall(self):
181
- retval = self._rows[:]
182
- self._rows[:] = []
181
+ retval = list(self._rows)
182
+ self._rows.clear()
183
183
  return retval
184
184
 
185
185
 
sqlalchemy/event/base.py CHANGED
@@ -198,6 +198,10 @@ class _Dispatch(_DispatchCommon[_ET]):
198
198
  {"__slots__": self._event_names},
199
199
  )
200
200
  self.__class__._joined_dispatch_cls = cls
201
+
202
+ # establish pickle capability by adding it to this module
203
+ globals()[cls.__name__] = cls
204
+
201
205
  return self._joined_dispatch_cls(self, other)
202
206
 
203
207
  def __reduce__(self) -> Union[str, Tuple[Any, ...]]:
@@ -398,6 +402,9 @@ class _JoinedDispatcher(_DispatchCommon[_ET]):
398
402
  self.parent = parent
399
403
  self._instance_cls = self.local._instance_cls
400
404
 
405
+ def __reduce__(self) -> Any:
406
+ return (self.__class__, (self.local, self.parent))
407
+
401
408
  def __getattr__(self, name: str) -> _JoinedListener[_ET]:
402
409
  # Assign _JoinedListeners as attributes on demand
403
410
  # to reduce startup time for new dispatch objects.
@@ -864,7 +864,7 @@ class async_scoped_session(Generic[_AS]):
864
864
 
865
865
  This method retrieves the history for each instrumented
866
866
  attribute on the instance and performs a comparison of the current
867
- value to its previously committed value, if any.
867
+ value to its previously flushed or committed value, if any.
868
868
 
869
869
  It is in effect a more expensive and accurate
870
870
  version of checking for the given instance in the
@@ -1307,7 +1307,7 @@ class AsyncSession(ReversibleProxy[Session]):
1307
1307
 
1308
1308
  This method retrieves the history for each instrumented
1309
1309
  attribute on the instance and performs a comparison of the current
1310
- value to its previously committed value, if any.
1310
+ value to its previously flushed or committed value, if any.
1311
1311
 
1312
1312
  It is in effect a more expensive and accurate
1313
1313
  version of checking for the given instance in the