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.
- {SQLAlchemy-2.0.30.dist-info → SQLAlchemy-2.0.31.dist-info}/METADATA +2 -2
- {SQLAlchemy-2.0.30.dist-info → SQLAlchemy-2.0.31.dist-info}/RECORD +31 -31
- sqlalchemy/__init__.py +1 -1
- sqlalchemy/dialects/mysql/aiomysql.py +11 -10
- sqlalchemy/dialects/mysql/asyncmy.py +10 -10
- sqlalchemy/dialects/mysql/reflection.py +1 -1
- sqlalchemy/dialects/postgresql/asyncpg.py +21 -26
- sqlalchemy/dialects/postgresql/psycopg.py +9 -14
- sqlalchemy/dialects/sqlite/aiosqlite.py +10 -10
- sqlalchemy/event/base.py +7 -0
- sqlalchemy/ext/asyncio/scoping.py +1 -1
- sqlalchemy/ext/asyncio/session.py +1 -1
- sqlalchemy/ext/serializer.py +19 -23
- sqlalchemy/orm/_orm_constructors.py +31 -0
- sqlalchemy/orm/decl_base.py +34 -6
- sqlalchemy/orm/scoping.py +1 -1
- sqlalchemy/orm/session.py +1 -1
- sqlalchemy/orm/state.py +13 -6
- sqlalchemy/orm/strategies.py +28 -4
- sqlalchemy/orm/strategy_options.py +4 -4
- sqlalchemy/orm/util.py +4 -2
- sqlalchemy/sql/elements.py +65 -16
- sqlalchemy/sql/schema.py +20 -6
- sqlalchemy/sql/selectable.py +8 -4
- sqlalchemy/sql/sqltypes.py +24 -6
- sqlalchemy/util/_collections.py +3 -3
- sqlalchemy/util/_concurrency_py3k.py +22 -24
- sqlalchemy/util/langhelpers.py +2 -0
- {SQLAlchemy-2.0.30.dist-info → SQLAlchemy-2.0.31.dist-info}/LICENSE +0 -0
- {SQLAlchemy-2.0.30.dist-info → SQLAlchemy-2.0.31.dist-info}/WHEEL +0 -0
- {SQLAlchemy-2.0.30.dist-info → SQLAlchemy-2.0.31.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.
|
|
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=
|
|
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
|
|
33
|
-
sqlalchemy/dialects/mysql/asyncmy.py,sha256=
|
|
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=
|
|
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=
|
|
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=
|
|
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=
|
|
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=
|
|
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=
|
|
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=
|
|
127
|
-
sqlalchemy/ext/asyncio/session.py,sha256=
|
|
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=
|
|
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=
|
|
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=
|
|
168
|
-
sqlalchemy/orm/session.py,sha256=
|
|
169
|
-
sqlalchemy/orm/state.py,sha256=
|
|
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=
|
|
172
|
-
sqlalchemy/orm/strategy_options.py,sha256
|
|
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=
|
|
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=
|
|
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
|
|
206
|
-
sqlalchemy/sql/selectable.py,sha256=
|
|
207
|
-
sqlalchemy/sql/sqltypes.py,sha256=
|
|
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=
|
|
252
|
-
sqlalchemy/util/_concurrency_py3k.py,sha256=
|
|
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=
|
|
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.
|
|
265
|
-
SQLAlchemy-2.0.
|
|
266
|
-
SQLAlchemy-2.0.
|
|
267
|
-
SQLAlchemy-2.0.
|
|
268
|
-
SQLAlchemy-2.0.
|
|
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
|
@@ -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 =
|
|
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.
|
|
123
|
+
yield self._rows.popleft()
|
|
122
124
|
|
|
123
125
|
def fetchone(self):
|
|
124
126
|
if self._rows:
|
|
125
|
-
return self._rows.
|
|
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
|
-
|
|
134
|
-
|
|
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 =
|
|
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.
|
|
124
|
+
yield self._rows.popleft()
|
|
124
125
|
|
|
125
126
|
def fetchone(self):
|
|
126
127
|
if self._rows:
|
|
127
|
-
return self._rows.
|
|
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
|
-
|
|
136
|
-
|
|
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
|
|
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.
|
|
586
|
+
yield self._rows.popleft()
|
|
587
587
|
|
|
588
588
|
def fetchone(self):
|
|
589
589
|
if self._rows:
|
|
590
|
-
return self._rows.
|
|
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
|
-
|
|
599
|
-
|
|
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 =
|
|
613
|
+
self._rowbuffer = deque()
|
|
615
614
|
|
|
616
615
|
def close(self):
|
|
617
616
|
self._cursor = None
|
|
618
|
-
self._rowbuffer
|
|
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
|
|
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
|
-
|
|
654
|
-
|
|
650
|
+
assert self._cursor is not None
|
|
651
|
+
rb = self._rowbuffer
|
|
652
|
+
lb = len(rb)
|
|
655
653
|
if size > lb:
|
|
656
|
-
|
|
654
|
+
rb.extend(
|
|
657
655
|
self._adapt_connection.await_(self._cursor.fetch(size - lb))
|
|
658
656
|
)
|
|
659
657
|
|
|
660
|
-
|
|
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)
|
|
666
|
-
|
|
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
|
-
|
|
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.
|
|
603
|
+
yield self._rows.popleft()
|
|
607
604
|
|
|
608
605
|
def fetchone(self):
|
|
609
606
|
if self._rows:
|
|
610
|
-
|
|
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
|
-
|
|
620
|
-
|
|
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.
|
|
165
|
+
yield self._rows.popleft()
|
|
165
166
|
|
|
166
167
|
def fetchone(self):
|
|
167
168
|
if self._rows:
|
|
168
|
-
return self._rows.
|
|
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
|
-
|
|
177
|
-
|
|
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
|