SQLAlchemy 2.0.22__py3-none-any.whl → 2.0.23__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.22.dist-info → SQLAlchemy-2.0.23.dist-info}/METADATA +5 -2
- {SQLAlchemy-2.0.22.dist-info → SQLAlchemy-2.0.23.dist-info}/RECORD +50 -47
- {SQLAlchemy-2.0.22.dist-info → SQLAlchemy-2.0.23.dist-info}/WHEEL +1 -1
- sqlalchemy/__init__.py +1 -1
- sqlalchemy/connectors/aioodbc.py +187 -0
- sqlalchemy/connectors/asyncio.py +209 -0
- sqlalchemy/dialects/mssql/__init__.py +1 -0
- sqlalchemy/dialects/mssql/aioodbc.py +64 -0
- sqlalchemy/dialects/mssql/base.py +3 -9
- sqlalchemy/dialects/mssql/information_schema.py +1 -1
- sqlalchemy/dialects/mssql/provision.py +1 -1
- sqlalchemy/dialects/mssql/pyodbc.py +8 -2
- sqlalchemy/dialects/mysql/aiomysql.py +8 -0
- sqlalchemy/dialects/mysql/asyncmy.py +6 -0
- sqlalchemy/dialects/mysql/base.py +40 -3
- sqlalchemy/dialects/mysql/mariadbconnector.py +2 -0
- sqlalchemy/dialects/mysql/mysqldb.py +1 -1
- sqlalchemy/dialects/mysql/pymysql.py +34 -0
- sqlalchemy/dialects/oracle/cx_oracle.py +2 -2
- sqlalchemy/dialects/oracle/types.py +55 -26
- sqlalchemy/dialects/postgresql/asyncpg.py +6 -0
- sqlalchemy/dialects/postgresql/types.py +10 -0
- sqlalchemy/dialects/sqlite/aiosqlite.py +35 -0
- sqlalchemy/dialects/sqlite/base.py +4 -3
- sqlalchemy/ext/asyncio/__init__.py +1 -0
- sqlalchemy/ext/asyncio/scoping.py +9 -1
- sqlalchemy/ext/asyncio/session.py +28 -2
- sqlalchemy/orm/_typing.py +1 -0
- sqlalchemy/orm/bulk_persistence.py +1 -1
- sqlalchemy/orm/decl_base.py +11 -3
- sqlalchemy/orm/scoping.py +3 -2
- sqlalchemy/orm/session.py +6 -4
- sqlalchemy/orm/strategies.py +5 -4
- sqlalchemy/orm/strategy_options.py +37 -14
- sqlalchemy/orm/util.py +10 -7
- sqlalchemy/sql/base.py +1 -0
- sqlalchemy/sql/cache_key.py +3 -0
- sqlalchemy/sql/compiler.py +16 -11
- sqlalchemy/sql/sqltypes.py +10 -19
- sqlalchemy/sql/type_api.py +0 -27
- sqlalchemy/testing/assertsql.py +1 -0
- sqlalchemy/testing/plugin/plugin_base.py +13 -6
- sqlalchemy/testing/requirements.py +8 -0
- sqlalchemy/testing/suite/test_insert.py +0 -2
- sqlalchemy/testing/suite/test_results.py +2 -2
- sqlalchemy/testing/suite/test_types.py +109 -1
- sqlalchemy/testing/suite/test_update_delete.py +67 -0
- sqlalchemy/util/langhelpers.py +11 -4
- {SQLAlchemy-2.0.22.dist-info → SQLAlchemy-2.0.23.dist-info}/LICENSE +0 -0
- {SQLAlchemy-2.0.22.dist-info → SQLAlchemy-2.0.23.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.23
|
|
4
4
|
Summary: Database Abstraction Library
|
|
5
5
|
Home-page: https://www.sqlalchemy.org
|
|
6
6
|
Author: Mike Bayer
|
|
@@ -31,6 +31,9 @@ Requires-Dist: importlib-metadata ; python_version < "3.8"
|
|
|
31
31
|
Provides-Extra: aiomysql
|
|
32
32
|
Requires-Dist: greenlet !=0.4.17 ; extra == 'aiomysql'
|
|
33
33
|
Requires-Dist: aiomysql >=0.2.0 ; extra == 'aiomysql'
|
|
34
|
+
Provides-Extra: aioodbc
|
|
35
|
+
Requires-Dist: greenlet !=0.4.17 ; extra == 'aioodbc'
|
|
36
|
+
Requires-Dist: aioodbc ; extra == 'aioodbc'
|
|
34
37
|
Provides-Extra: aiosqlite
|
|
35
38
|
Requires-Dist: greenlet !=0.4.17 ; extra == 'aiosqlite'
|
|
36
39
|
Requires-Dist: aiosqlite ; extra == 'aiosqlite'
|
|
@@ -55,7 +58,7 @@ Requires-Dist: mysqlclient >=1.4.0 ; extra == 'mysql'
|
|
|
55
58
|
Provides-Extra: mysql_connector
|
|
56
59
|
Requires-Dist: mysql-connector-python ; extra == 'mysql_connector'
|
|
57
60
|
Provides-Extra: oracle
|
|
58
|
-
Requires-Dist: cx-oracle >=
|
|
61
|
+
Requires-Dist: cx-oracle >=8 ; extra == 'oracle'
|
|
59
62
|
Provides-Extra: oracle_oracledb
|
|
60
63
|
Requires-Dist: oracledb >=1.0.1 ; extra == 'oracle_oracledb'
|
|
61
64
|
Provides-Extra: postgresql
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
sqlalchemy/__init__.py,sha256=
|
|
1
|
+
sqlalchemy/__init__.py,sha256=DjKCAltzrHGfaVdXVeFJpBmTaX6JmyloHANzewBUWo4,12708
|
|
2
2
|
sqlalchemy/events.py,sha256=pRcPKKsPQHGPH_pvTtKRmzuEIy-QHCtkUiZl4MUbxKs,536
|
|
3
3
|
sqlalchemy/exc.py,sha256=4SMKOJtz7_SWt5vskCSeXSi4ZlFyL4jh53Q8sk4-ODQ,24011
|
|
4
4
|
sqlalchemy/inspection.py,sha256=i3aR-IV101YU8D9TA8Pxb2wi08QZuJ34sMy6L5M__rY,5145
|
|
@@ -7,6 +7,8 @@ sqlalchemy/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
|
7
7
|
sqlalchemy/schema.py,sha256=mt74CGCBtfv_qI1_6zzNFMexYGyWDj2Jkh-XdH4kEWI,3194
|
|
8
8
|
sqlalchemy/types.py,sha256=DgBpPaT-vtsn6_glx5wocrIhR2A1vy56SQNRY3NiPUw,3168
|
|
9
9
|
sqlalchemy/connectors/__init__.py,sha256=uKUYWQoXyleIyjWBuh7gzgnazJokx3DaasKJbFOfQGA,476
|
|
10
|
+
sqlalchemy/connectors/aioodbc.py,sha256=QiafuN9bx_wcIs8tByLftTmGAegXPoFPwUaxCDU_ZQA,5737
|
|
11
|
+
sqlalchemy/connectors/asyncio.py,sha256=ZZmJSFT50u-GEjZzytQOdB_tkBFxi3XPWRrNhs_nASc,6139
|
|
10
12
|
sqlalchemy/connectors/pyodbc.py,sha256=NskMydn26ZkHL8aQ1V3L4WIAWin3zwJ5VEnlHvAD1DE,8453
|
|
11
13
|
sqlalchemy/cyextension/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
12
14
|
sqlalchemy/cyextension/collections.pyx,sha256=KDI5QTOyYz9gDl-3d7MbGMA0Kc-wxpJqnLmCaUmQy2U,12323
|
|
@@ -18,43 +20,44 @@ sqlalchemy/cyextension/util.pyx,sha256=lv03p63oVn23jLhMI4_RYGewUnJfh-4FkrNMEFL7A
|
|
|
18
20
|
sqlalchemy/dialects/__init__.py,sha256=hLsgIEomunlp4mNLnvjCQTLOnBVva8N7IT2-RYrN2_4,1770
|
|
19
21
|
sqlalchemy/dialects/_typing.py,sha256=P2ML2o4b_bWAAy3zbdoUjx3vXsMNwpiOblef8ThCxlM,648
|
|
20
22
|
sqlalchemy/dialects/type_migration_guidelines.txt,sha256=-uHNdmYFGB7bzUNT6i8M5nb4j6j9YUKAtW4lcBZqsMg,8239
|
|
21
|
-
sqlalchemy/dialects/mssql/__init__.py,sha256=
|
|
22
|
-
sqlalchemy/dialects/mssql/
|
|
23
|
-
sqlalchemy/dialects/mssql/
|
|
23
|
+
sqlalchemy/dialects/mssql/__init__.py,sha256=CYbbydyMSLjUq8vY1siNStd4lvjVXod8ddeDS6ELHLk,1871
|
|
24
|
+
sqlalchemy/dialects/mssql/aioodbc.py,sha256=ncj3yyfvW91o3g19GB5s1I0oaZKUO_P-R2nwnLF0t9E,2013
|
|
25
|
+
sqlalchemy/dialects/mssql/base.py,sha256=l9vX6fK6DJEYA00N9uDnvSbqfgvxXfYUn2C4AF5T920,133649
|
|
26
|
+
sqlalchemy/dialects/mssql/information_schema.py,sha256=ll0zAupJ4cPvhi9v5hTi7PQLU1lae4o6eQ5Vg7gykXQ,8074
|
|
24
27
|
sqlalchemy/dialects/mssql/json.py,sha256=B0m6H08CKuk-yomDHcCwfQbVuVN2WLufuVueA_qb1NQ,4573
|
|
25
|
-
sqlalchemy/dialects/mssql/provision.py,sha256=
|
|
28
|
+
sqlalchemy/dialects/mssql/provision.py,sha256=x7XRSQDxz4jz2uIpqwhuIXpL9bic0Vw7Mhy39HOkyqY,5013
|
|
26
29
|
sqlalchemy/dialects/mssql/pymssql.py,sha256=BfJp9t-IQabqWXySJBmP9pwNTWnJqbjA2jJM9M4XeWc,4029
|
|
27
|
-
sqlalchemy/dialects/mssql/pyodbc.py,sha256=
|
|
30
|
+
sqlalchemy/dialects/mssql/pyodbc.py,sha256=qwZ8ByOTZ1WObjxeOravoJBSBX-s4RJ_PZ5VJ_Ch5Ws,27048
|
|
28
31
|
sqlalchemy/dialects/mysql/__init__.py,sha256=btLABiNnmbWt9ziW-XgVWEB1qHWQcSFz7zxZNw4m_LY,2144
|
|
29
|
-
sqlalchemy/dialects/mysql/aiomysql.py,sha256=
|
|
30
|
-
sqlalchemy/dialects/mysql/asyncmy.py,sha256=
|
|
31
|
-
sqlalchemy/dialects/mysql/base.py,sha256=
|
|
32
|
+
sqlalchemy/dialects/mysql/aiomysql.py,sha256=Zb-_F9Pzl0t-fT1bZwbNNne6jjCUqBXxeizbhMFPqls,9750
|
|
33
|
+
sqlalchemy/dialects/mysql/asyncmy.py,sha256=zqupDz7AJihjv3E8w_4XAtq95d8stdrETNx60MLNVr0,9819
|
|
34
|
+
sqlalchemy/dialects/mysql/base.py,sha256=q-DzkR_txwDTeWTEByzHAoIArYU3Bb5HT2Bnmuw7WIM,120688
|
|
32
35
|
sqlalchemy/dialects/mysql/cymysql.py,sha256=5CQVJAlqQ3pT4IDGSQJH2hCzj-EWjUitA21MLqJwEEs,2291
|
|
33
36
|
sqlalchemy/dialects/mysql/dml.py,sha256=qw0ZweHbMsbNyVSfC17HqylCnf7XAuIjtgofiWABT8k,7636
|
|
34
37
|
sqlalchemy/dialects/mysql/enumerated.py,sha256=1L2J2wT6nQEmRS4z-jzZpoi44IqIaHgBRZZB9m55czo,8439
|
|
35
38
|
sqlalchemy/dialects/mysql/expression.py,sha256=WW5G2XPwqJfXjuzHBt4BRP0pCLcPJkPD1mvZX1g0JL0,4066
|
|
36
39
|
sqlalchemy/dialects/mysql/json.py,sha256=JlSFBAHhJ9JmV-3azH80xkLgeh7g6A6DVyNVCNZiKPU,2260
|
|
37
40
|
sqlalchemy/dialects/mysql/mariadb.py,sha256=Sugyngvo6j6SfFFuJ23rYeFWEPdZ9Ji9guElsk_1WSQ,844
|
|
38
|
-
sqlalchemy/dialects/mysql/mariadbconnector.py,sha256=
|
|
41
|
+
sqlalchemy/dialects/mysql/mariadbconnector.py,sha256=F1VPosecC1hDZqjzZI29j4GUduyU4ewPwb-ekBQva5w,8725
|
|
39
42
|
sqlalchemy/dialects/mysql/mysqlconnector.py,sha256=5glmkPhD_KP-Mci8ZXBr4yzqH1MDfzCJ9F_kZNyXcGo,5666
|
|
40
|
-
sqlalchemy/dialects/mysql/mysqldb.py,sha256=
|
|
43
|
+
sqlalchemy/dialects/mysql/mysqldb.py,sha256=R5BDiXiHX5oFuAOzyxZ6TYUTGzly-dulMeQLkeia6kk,9649
|
|
41
44
|
sqlalchemy/dialects/mysql/provision.py,sha256=uPT6-BIoP_12XLmWAza1TDFNhOVVJ3rmQoMH7nvh-Vg,3226
|
|
42
|
-
sqlalchemy/dialects/mysql/pymysql.py,sha256=
|
|
45
|
+
sqlalchemy/dialects/mysql/pymysql.py,sha256=d2-00IPoyEDkR9REQTE-DGEQrGshUq_0G5liZ5FiSEM,4032
|
|
43
46
|
sqlalchemy/dialects/mysql/pyodbc.py,sha256=mkOvumrxpmAi6noZlkaTVKz2F7G5vLh2vx0cZSn9VTA,4288
|
|
44
47
|
sqlalchemy/dialects/mysql/reflection.py,sha256=ak6E-eCP9346ixnILYNJcrRYblWbIT0sjXf4EqmfBsY,22556
|
|
45
48
|
sqlalchemy/dialects/mysql/reserved_words.py,sha256=DsPHsW3vwOrvU7bv3Nbfact2Z_jyZ9xUTT-mdeQvqxo,9145
|
|
46
49
|
sqlalchemy/dialects/mysql/types.py,sha256=i8DpRkOL1QhPErZ25AmCQOuFLciWhdjNL3I0CeHEhdY,24258
|
|
47
50
|
sqlalchemy/dialects/oracle/__init__.py,sha256=pjk1aWi9XFCAHWNSJzSzmoIcL32-AkU_1J9IV4PtwpA,1318
|
|
48
51
|
sqlalchemy/dialects/oracle/base.py,sha256=u55_R9NrCRijud7ioHMxT-r0MSW0gMFjOwbrDdPgFsc,118036
|
|
49
|
-
sqlalchemy/dialects/oracle/cx_oracle.py,sha256=
|
|
52
|
+
sqlalchemy/dialects/oracle/cx_oracle.py,sha256=L0GvcB6xb0-zyv5dx3bpQCeptp0KSqH6g9FUQ4y-d-g,55108
|
|
50
53
|
sqlalchemy/dialects/oracle/dictionary.py,sha256=iUoyFEFM8z0sfVWR2n_nnre14kaQkV_syKO0R5Dos4M,19487
|
|
51
54
|
sqlalchemy/dialects/oracle/oracledb.py,sha256=_-fUQ94xai80B7v9WLVGoGDIv8u54nVspBdyGEyI76g,3457
|
|
52
55
|
sqlalchemy/dialects/oracle/provision.py,sha256=5cvIc3yTWxz4AIRYxcesbRJ1Ft-zT9GauQ911yPnN2o,8055
|
|
53
|
-
sqlalchemy/dialects/oracle/types.py,sha256=
|
|
56
|
+
sqlalchemy/dialects/oracle/types.py,sha256=TeOhUW5W9qZC8SaJ-9b3u6OvOPOarNq4MmCQ7l3wWX0,8204
|
|
54
57
|
sqlalchemy/dialects/postgresql/__init__.py,sha256=bZEPsLbRtB7s6TMQAHCIzKBgkxUa3eDXvCkeARua37E,3734
|
|
55
58
|
sqlalchemy/dialects/postgresql/_psycopg_common.py,sha256=U3aWzbKD3VOj6Z6r-4IsIQmtjGGIB4RDZH6NXfd8Xz0,5655
|
|
56
59
|
sqlalchemy/dialects/postgresql/array.py,sha256=tLyU9GDAeIypNhjTuFQUYbaTeijVM1VVJS6UdzzXXn4,13682
|
|
57
|
-
sqlalchemy/dialects/postgresql/asyncpg.py,sha256=
|
|
60
|
+
sqlalchemy/dialects/postgresql/asyncpg.py,sha256=XNaoOZ5Da4-jUTaES1zEOTEW3WG8UKyVCoIS3LsFhzE,39967
|
|
58
61
|
sqlalchemy/dialects/postgresql/base.py,sha256=DGhaquFJWDQL7wIvQ2EE57LxD7zGR06BKQxvNZHFLgY,175634
|
|
59
62
|
sqlalchemy/dialects/postgresql/dml.py,sha256=_He69efdpDA5gGmBsE7Lo4ViSi3QnR38BiFmrR1tw6k,11203
|
|
60
63
|
sqlalchemy/dialects/postgresql/ext.py,sha256=oPP22Pq-n2lMmQ8ahifYmsmzRhSiSv1RV-xrTT0gycw,16253
|
|
@@ -69,10 +72,10 @@ sqlalchemy/dialects/postgresql/psycopg.py,sha256=YMubzQHMYN1By8QJScIPb_PwNiACv6s
|
|
|
69
72
|
sqlalchemy/dialects/postgresql/psycopg2.py,sha256=3Xci4bTA2BvhrZAQa727uFWdaXEZmvfD-Z-upE3NyQE,31592
|
|
70
73
|
sqlalchemy/dialects/postgresql/psycopg2cffi.py,sha256=2EOuDwBetfvelcPoTzSwOHe6X8lTwaYH7znNzXJt9eM,1739
|
|
71
74
|
sqlalchemy/dialects/postgresql/ranges.py,sha256=yHB1BRlUreQPZB3VEn0KMMLf02zjf5jjYdmg4N4S2Sw,30220
|
|
72
|
-
sqlalchemy/dialects/postgresql/types.py,sha256
|
|
75
|
+
sqlalchemy/dialects/postgresql/types.py,sha256=l24rs8_nK4vqLyQC0aUkf4S7ecw6T_7Pgq50Icc5CBs,7292
|
|
73
76
|
sqlalchemy/dialects/sqlite/__init__.py,sha256=wnZ9vtfm0QXmth1jiGiubFgRiKxIoQoNthb1bp4FhCs,1173
|
|
74
|
-
sqlalchemy/dialects/sqlite/aiosqlite.py,sha256=
|
|
75
|
-
sqlalchemy/dialects/sqlite/base.py,sha256=
|
|
77
|
+
sqlalchemy/dialects/sqlite/aiosqlite.py,sha256=GZJioZLot0D5CQ6ovPQoqv2iV8FAFm3G75lEFCzopoE,12296
|
|
78
|
+
sqlalchemy/dialects/sqlite/base.py,sha256=YYEB5BeuemLC3FAR7EB8vA0zoUOwHTKoF_srvnAStps,96785
|
|
76
79
|
sqlalchemy/dialects/sqlite/dml.py,sha256=PYESBj8Ip7bGs_Fi7QjbWLXLnU9a-SbP96JZiUoZNHg,8434
|
|
77
80
|
sqlalchemy/dialects/sqlite/json.py,sha256=XFPwSdNx0DxDfxDZn7rmGGqsAgL4vpJbjjGaA73WruQ,2533
|
|
78
81
|
sqlalchemy/dialects/sqlite/provision.py,sha256=O4JDoybdb2RBblXErEVPE2P_5xHab927BQItJa203zU,5383
|
|
@@ -115,13 +118,13 @@ sqlalchemy/ext/instrumentation.py,sha256=rjjSbTGilYeGLdyEWV932TfTaGxiVP44_RajinA
|
|
|
115
118
|
sqlalchemy/ext/mutable.py,sha256=d3Pp8PcAVN4pHN9rhc1ReXBWe0Q70Q5S1klFoYGyDPA,37393
|
|
116
119
|
sqlalchemy/ext/orderinglist.py,sha256=8Vcg7UUkLg-QbYAbLVDSqu-5REkR6L-FLLhCYsHYxCQ,14384
|
|
117
120
|
sqlalchemy/ext/serializer.py,sha256=ox6dbMOBmFR0H2RQFt17mcYBOGKgn1cNVFfqY8-jpgQ,6178
|
|
118
|
-
sqlalchemy/ext/asyncio/__init__.py,sha256=
|
|
121
|
+
sqlalchemy/ext/asyncio/__init__.py,sha256=iG_0TmBO1pCB316WS-p17AImwqRtUoaKo7UphYZ7bYw,1317
|
|
119
122
|
sqlalchemy/ext/asyncio/base.py,sha256=PXF4YqfRi2-mADAtaL2_-Uv7CzoBVojPbzyA5phJ9To,8959
|
|
120
123
|
sqlalchemy/ext/asyncio/engine.py,sha256=h4pe3ixuX6YfI97B5QWo2V4_CCCnOvM_EHPZhX19Mgc,47796
|
|
121
124
|
sqlalchemy/ext/asyncio/exc.py,sha256=1hCdOKzvSryc_YE4jgj0l9JASOmZXutdzShEYPiLbGI,639
|
|
122
125
|
sqlalchemy/ext/asyncio/result.py,sha256=zETerVB53gql1DL6tkO_JiqeU-m1OM-8kX0ULxmoL_I,30554
|
|
123
|
-
sqlalchemy/ext/asyncio/scoping.py,sha256=
|
|
124
|
-
sqlalchemy/ext/asyncio/session.py,sha256=
|
|
126
|
+
sqlalchemy/ext/asyncio/scoping.py,sha256=cBNluB7n_lwdAAo6pySbvNRqPN7UBzwQHZ6XhRDyWgA,52685
|
|
127
|
+
sqlalchemy/ext/asyncio/session.py,sha256=yWwhI5i_yVWjykxmxkcP3-xmw3UpoGYNhHZL8sYXQMA,62998
|
|
125
128
|
sqlalchemy/ext/declarative/__init__.py,sha256=VJu8S1efxil20W48fJlpDn6gHorOudn5p3-lF72WcJ8,1818
|
|
126
129
|
sqlalchemy/ext/declarative/extensions.py,sha256=vwZjudPFA_mao1U04-RZCaU_tvPMBgQa5OTmSI7K7SU,19547
|
|
127
130
|
sqlalchemy/ext/mypy/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
@@ -135,15 +138,15 @@ sqlalchemy/future/__init__.py,sha256=79DZx3v7TQZpkS_qThlmuCOm1a9UK2ObNZhyMmjfNB0
|
|
|
135
138
|
sqlalchemy/future/engine.py,sha256=6uOpOedIqiT1-3qJSJIlv9_raMJU8NTkhQwN_Ngg8kI,499
|
|
136
139
|
sqlalchemy/orm/__init__.py,sha256=cBn0aPWyDFY4ya-cHRshQBcuThk1smTUCTrlp6LHdlE,8463
|
|
137
140
|
sqlalchemy/orm/_orm_constructors.py,sha256=_7_GY6qw2sA-GG_WXLz1GOO-0qC-SCBeA43GhVuS2Qw,99803
|
|
138
|
-
sqlalchemy/orm/_typing.py,sha256=
|
|
141
|
+
sqlalchemy/orm/_typing.py,sha256=oRUJVAGpU3_DhSkIb1anXgneweVIARjB51HlPhMNfcM,5015
|
|
139
142
|
sqlalchemy/orm/attributes.py,sha256=NFhYheqqu2VcXmKTdcvQKiRR_6qo0rHLK7nda7rpviA,92578
|
|
140
143
|
sqlalchemy/orm/base.py,sha256=iZXsygk4fn8wd7wx1iXn_PfnGDY7d41YRfS0mC_q5vE,27700
|
|
141
|
-
sqlalchemy/orm/bulk_persistence.py,sha256=
|
|
144
|
+
sqlalchemy/orm/bulk_persistence.py,sha256=S9VK5a6GSqnw3z7O5UG5OOnc9WxzmS_ooDkA5JmCIsY,69878
|
|
142
145
|
sqlalchemy/orm/clsregistry.py,sha256=4J-kKshmLOEyx3VBqREm2k_XY0cer4zwUoHJT3n5Xmw,17949
|
|
143
146
|
sqlalchemy/orm/collections.py,sha256=0AZFr9us9MiHo_Xcyi7DUsN02jSBERUOd-jIK8qQ1DA,52159
|
|
144
147
|
sqlalchemy/orm/context.py,sha256=VyJl1ZJ5OnJUACKlM-bPLyyoqu4tyaKKdxeC-QF4EuU,111698
|
|
145
148
|
sqlalchemy/orm/decl_api.py,sha256=a2Cyvjh6j5BlXJQ2i0jpQx7xkeI_6xo5MMxr0d2ndQY,63589
|
|
146
|
-
sqlalchemy/orm/decl_base.py,sha256=
|
|
149
|
+
sqlalchemy/orm/decl_base.py,sha256=g9xW9G-n9iStMI0i3i-9Rt4LDRW8--3iCCRPlWF6Cko,81660
|
|
147
150
|
sqlalchemy/orm/dependency.py,sha256=g3R_1H_OGzagXFeen3Irm3c1lO3yeXGdGa0muUZgZAk,47583
|
|
148
151
|
sqlalchemy/orm/descriptor_props.py,sha256=SdrfVu05zhWLGe_DnBlgbU6e5sWkkfBTirH9Nrr1MLk,37176
|
|
149
152
|
sqlalchemy/orm/dynamic.py,sha256=pYlMIrpp80Ex4KByqdyhx0x0kIrl_cIADwkeVxvYu4s,9798
|
|
@@ -161,15 +164,15 @@ sqlalchemy/orm/persistence.py,sha256=qr1jUgo-NZ0tLa5eIis2271QDt4KNJwYlYU_9CaKNhQ
|
|
|
161
164
|
sqlalchemy/orm/properties.py,sha256=dt1Gy06pbRY6zgm4QGR9nU6z2WCyoTZWBJYKpUhLq_c,29095
|
|
162
165
|
sqlalchemy/orm/query.py,sha256=VBSD0k15xU_XykggvLGAwGdwNglBAoBKbOk8qAoMKdI,117714
|
|
163
166
|
sqlalchemy/orm/relationships.py,sha256=wrHyICb8A5qPoyxf-nITQVJ13kCNr2MedDqEY8QMSt8,127816
|
|
164
|
-
sqlalchemy/orm/scoping.py,sha256=
|
|
165
|
-
sqlalchemy/orm/session.py,sha256=
|
|
167
|
+
sqlalchemy/orm/scoping.py,sha256=75iPEWDFhPcIXgl8EUd_sPTCL6punfegEaTRE5mP3e8,78835
|
|
168
|
+
sqlalchemy/orm/session.py,sha256=TeBcZNdY4HWQFdXNCIqbsQTtkvfJkBweMzvA9p3BiPA,193279
|
|
166
169
|
sqlalchemy/orm/state.py,sha256=EaWkVNWHaDeJ_FZGXHakSamUk51BXmtMWLGdFhlJmh8,37536
|
|
167
170
|
sqlalchemy/orm/state_changes.py,sha256=pqkjSDOR6H5BufMKdzFUIatDp3DY90SovOJiJ1k6Ayw,6815
|
|
168
|
-
sqlalchemy/orm/strategies.py,sha256=
|
|
169
|
-
sqlalchemy/orm/strategy_options.py,sha256=
|
|
171
|
+
sqlalchemy/orm/strategies.py,sha256=V0o-1kB1IVTxhOGqGtRyjddZqAbPdsl_h-k0N3MKCGo,114052
|
|
172
|
+
sqlalchemy/orm/strategy_options.py,sha256=EmgH28uMQhwwBCDVcXmywLk_Q8AbpnK02seMsMV4nmc,84102
|
|
170
173
|
sqlalchemy/orm/sync.py,sha256=5Nt_OqP4IfhAtHwFRar4dw-YjLENRLvp4d3jDC4wpnw,5749
|
|
171
174
|
sqlalchemy/orm/unitofwork.py,sha256=Wk5YZocBbxe4m1wU2aFQ7gY1Cp5CROi13kDEM1iOSz4,27033
|
|
172
|
-
sqlalchemy/orm/util.py,sha256=
|
|
175
|
+
sqlalchemy/orm/util.py,sha256=7hCRYbQjqhWJTkrPf_NXY9zF_18VWTpyguu-nfYfc6c,80340
|
|
173
176
|
sqlalchemy/orm/writeonly.py,sha256=WCPXCAwHqVCfhVWXQEFCP3OocIiHgqNJ5KnuJwSgGq4,22329
|
|
174
177
|
sqlalchemy/pool/__init__.py,sha256=CIv4b6ctueY7w3sML_LxyLKAdl59esYOhz3O7W5w7WE,1815
|
|
175
178
|
sqlalchemy/pool/base.py,sha256=wuwKIak5d_4-TqKI2RFN8OYMEyOvV0djnoSVR8gbxAQ,52249
|
|
@@ -183,10 +186,10 @@ sqlalchemy/sql/_py_util.py,sha256=iiwgX3dQhOjdB5-10jtgHPIdibUqGk49bC1qdZMBpYI,21
|
|
|
183
186
|
sqlalchemy/sql/_selectable_constructors.py,sha256=RDqgejqiUuU12Be1jBpMIx_YdJho8fhKfnMoJLPFTFE,18812
|
|
184
187
|
sqlalchemy/sql/_typing.py,sha256=C8kNZQ3TIpM-Q12Of3tTaESB1UxIfRME_lXouqgwMT8,12252
|
|
185
188
|
sqlalchemy/sql/annotation.py,sha256=pTNidcQatCar6H1I9YAoPP1e6sOewaJ15B7_-7ykZOE,18271
|
|
186
|
-
sqlalchemy/sql/base.py,sha256=
|
|
187
|
-
sqlalchemy/sql/cache_key.py,sha256=
|
|
189
|
+
sqlalchemy/sql/base.py,sha256=dVvZoPoa3pb6iuwTU4QoCvVWQPyHZthaekl5J2zV_SU,73928
|
|
190
|
+
sqlalchemy/sql/cache_key.py,sha256=Dl163qHjTkMCa5LTipZud8X3w0d8DvdIvGvv4AqriHE,32823
|
|
188
191
|
sqlalchemy/sql/coercions.py,sha256=ju8xEi7b9G_GzxaQ6Nwu0cFIWFZ--ottIVfdiuhHY7Y,40553
|
|
189
|
-
sqlalchemy/sql/compiler.py,sha256=
|
|
192
|
+
sqlalchemy/sql/compiler.py,sha256=9Wx423H72Yq7NHR8cmMAH6GpMCJmghs1L85YJqs_Lng,268763
|
|
190
193
|
sqlalchemy/sql/crud.py,sha256=nyAPlmvuyWxMqSBdWPffC5P3CGXTQKK0bJoDbNgB3iQ,56457
|
|
191
194
|
sqlalchemy/sql/ddl.py,sha256=XuUhulJLvvPjU4nYD6N42QLg8rEgquD6Jwn_yIHZejk,45542
|
|
192
195
|
sqlalchemy/sql/default_comparator.py,sha256=SE0OaK1BlY0RinQ21ZXJOUGkO00oGv6GMMmAH-4iNTQ,16663
|
|
@@ -201,14 +204,14 @@ sqlalchemy/sql/operators.py,sha256=BYATjkBQLJAmwHAlGUSV-dv9RLtGw_ziAvFbKDrN4YU,7
|
|
|
201
204
|
sqlalchemy/sql/roles.py,sha256=71zm_xpRkUdnu-WzG6lxQVnFHwvUjf6X6e3kRIkbzAs,7686
|
|
202
205
|
sqlalchemy/sql/schema.py,sha256=TOBTbcRY6ehosJEcpYn2NX0_UGZP9lfFs-o8lJVc5tI,228104
|
|
203
206
|
sqlalchemy/sql/selectable.py,sha256=9dO2yhN83zjna7nPjOE1hcvGyJGjc_lj5SAz7SP5CBQ,233041
|
|
204
|
-
sqlalchemy/sql/sqltypes.py,sha256=
|
|
207
|
+
sqlalchemy/sql/sqltypes.py,sha256=_0FpFLH0AFueb3TIB5Vcx9nXWDNj31XFQTP0u8OXnSo,126540
|
|
205
208
|
sqlalchemy/sql/traversals.py,sha256=7b98JSeLxqecmGHhhLXT_2M4QMke6W-xCci5RXndhxI,33521
|
|
206
|
-
sqlalchemy/sql/type_api.py,sha256=
|
|
209
|
+
sqlalchemy/sql/type_api.py,sha256=D9Kq-ppwZvlNmxaHqvVmM8IVg4n6_erzJpVioye9WKE,83823
|
|
207
210
|
sqlalchemy/sql/util.py,sha256=lBEAf_-eRepTErOBCp1PbEMZDYdJqAiK1GemQtgojYo,48175
|
|
208
211
|
sqlalchemy/sql/visitors.py,sha256=KD1qOYm6RdftCufVGB8q6jFTIZIQKS3zPCg78cVV0mQ,36427
|
|
209
212
|
sqlalchemy/testing/__init__.py,sha256=9M2SMxBBLJ8xLUWXNCWDzkcvOqFznWcJzrSd712vATU,3126
|
|
210
213
|
sqlalchemy/testing/assertions.py,sha256=lNNZ-gfF4TDRXmB7hZDdch7JYZRb_qWGeqWDFKtopx0,31439
|
|
211
|
-
sqlalchemy/testing/assertsql.py,sha256=
|
|
214
|
+
sqlalchemy/testing/assertsql.py,sha256=EIVk3i5qjiSI63c1ikTPoGhulZl88SSeOS2VNo1LJvM,16817
|
|
212
215
|
sqlalchemy/testing/asyncio.py,sha256=cAw68tzu3h5wjdIKfOqhFATcbMb38XeK0ThjIalUHuQ,3728
|
|
213
216
|
sqlalchemy/testing/config.py,sha256=MZOWz7wqzc1pbwHWSAR0RJkt2C-SD6ox-nYY7VHdi_U,12030
|
|
214
217
|
sqlalchemy/testing/engines.py,sha256=w5-0FbanItRsOt6x4n7wM_OnToCzJnrvZZ2hk5Yzng8,13355
|
|
@@ -217,7 +220,7 @@ sqlalchemy/testing/exclusions.py,sha256=uoYLEwyNOK1eR8rpfOZ2Q3dxgY0akM-RtsIFML-F
|
|
|
217
220
|
sqlalchemy/testing/pickleable.py,sha256=B9dXGF7E2PywB67SngHPjSMIBDTFhyAV4rkDUcyMulk,2833
|
|
218
221
|
sqlalchemy/testing/profiling.py,sha256=HPjYvRLT1nD90FCZ7AA8j9ygkMtf1SGA47Xze2QPueo,10148
|
|
219
222
|
sqlalchemy/testing/provision.py,sha256=w4F_ceGHPpWHUeh6cVcE5ktCC-ISrGc2yOSnXauOd5U,14200
|
|
220
|
-
sqlalchemy/testing/requirements.py,sha256=
|
|
223
|
+
sqlalchemy/testing/requirements.py,sha256=gkviA8f5p4qdoDwAK791I4oGvnEqlm0ZZwJZpJzobFY,51393
|
|
221
224
|
sqlalchemy/testing/schema.py,sha256=OSfMoIJ7ORbevGkeJdrKcTrQ0s7wXebuCU08mC1Y9jA,6513
|
|
222
225
|
sqlalchemy/testing/util.py,sha256=Wsu4GZgCW6wX9mmxfiffhDz1cZm3778OB3LtiWNgb3Y,14080
|
|
223
226
|
sqlalchemy/testing/warnings.py,sha256=pmfT33PF1q1PI7DdHOsup3LxHq1AC4-aYl1oL8HmrYo,1546
|
|
@@ -228,22 +231,22 @@ sqlalchemy/testing/fixtures/orm.py,sha256=x27qjpK54JETATcYuiphtW-HXRy8ej8h3aCDke
|
|
|
228
231
|
sqlalchemy/testing/fixtures/sql.py,sha256=Q7Qq0n4qTT681nWt5DqjThopgjv5BB2KmSmrmAxUqHM,15704
|
|
229
232
|
sqlalchemy/testing/plugin/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
230
233
|
sqlalchemy/testing/plugin/bootstrap.py,sha256=GrBB27KbswjE3Tt-zJlj6uSqGh9N-_CXkonnJSSBz84,1437
|
|
231
|
-
sqlalchemy/testing/plugin/plugin_base.py,sha256=
|
|
234
|
+
sqlalchemy/testing/plugin/plugin_base.py,sha256=4SizjghFdDddt5o5gQ16Nw0bJHrtuBa4smxJcea-ti8,21573
|
|
232
235
|
sqlalchemy/testing/plugin/pytestplugin.py,sha256=yh4PP406O0TwPMDzpJHpcNdU2WHXCLYI10F3oOLePjE,27295
|
|
233
236
|
sqlalchemy/testing/suite/__init__.py,sha256=_firVc2uS3TMZ3vH2baQzNb17ubM78RHtb9kniSybmk,476
|
|
234
237
|
sqlalchemy/testing/suite/test_cte.py,sha256=O5idVeBnHm9zdiG3tuCBUn4hYU_TA63-6LNnRygr8g0,6205
|
|
235
238
|
sqlalchemy/testing/suite/test_ddl.py,sha256=xWimTjggpTe3S1Xfmt_IPofTXkUUcKuVSVCIfIyGMbA,11785
|
|
236
239
|
sqlalchemy/testing/suite/test_deprecations.py,sha256=XI8ZU1NxC-6uvPDImaaq9O7Ov6MF5gmy-yk3TfesLAo,5082
|
|
237
240
|
sqlalchemy/testing/suite/test_dialect.py,sha256=HUpHZb7pnHbsoRpDLONpsCO_oWhBgjglU9pBO-EOUw4,22673
|
|
238
|
-
sqlalchemy/testing/suite/test_insert.py,sha256=
|
|
241
|
+
sqlalchemy/testing/suite/test_insert.py,sha256=Wm_pW0qqUNV1Fs7mXoxtmaTHMQGmaVDgDsYgZs1jlxM,18308
|
|
239
242
|
sqlalchemy/testing/suite/test_reflection.py,sha256=Nd4Ao_J3Sr-VeAeWbUe3gs6STPvik9DC37WkyJc-PVg,106205
|
|
240
|
-
sqlalchemy/testing/suite/test_results.py,sha256=
|
|
243
|
+
sqlalchemy/testing/suite/test_results.py,sha256=Hd6R4jhBNNQSp0xGa8wwTgpw-XUrCEZ3dWXpoZ4_DKs,15687
|
|
241
244
|
sqlalchemy/testing/suite/test_rowcount.py,sha256=zhKVv0ibFSQmnE5luLwgHAn840zOJ6HxtkR3oL995cs,7652
|
|
242
245
|
sqlalchemy/testing/suite/test_select.py,sha256=QHsBX16EZpxlEZZLM0pMNcwayPU0dig39McKwiiith0,58325
|
|
243
246
|
sqlalchemy/testing/suite/test_sequence.py,sha256=c80CBWrU930GPnPfr9TCRbTTuITR7BpIactncLIj2XU,9672
|
|
244
|
-
sqlalchemy/testing/suite/test_types.py,sha256=
|
|
247
|
+
sqlalchemy/testing/suite/test_types.py,sha256=QjV48MqR7dB8UVzt56UL2z7Nt28-IhywX3DKuQeLYsY,65429
|
|
245
248
|
sqlalchemy/testing/suite/test_unicode_ddl.py,sha256=7obItCpFt4qlWaDqe25HWgQT6FoUhgz1W7_Xycfz9Xk,5887
|
|
246
|
-
sqlalchemy/testing/suite/test_update_delete.py,sha256=
|
|
249
|
+
sqlalchemy/testing/suite/test_update_delete.py,sha256=1hT0BTxB4SNipd6hnVlMnq25dLtQQoXov7z7UR0Sgi8,3658
|
|
247
250
|
sqlalchemy/util/__init__.py,sha256=Bh0SkfkeCsz6-rbDmC41lAWOuCvKCiXVZthN2cWJEXk,8245
|
|
248
251
|
sqlalchemy/util/_collections.py,sha256=FYqVQg3CaqiEd21OFN1pNCfFbQ8gvlchW_TMtihSFNE,20169
|
|
249
252
|
sqlalchemy/util/_concurrency_py3k.py,sha256=31vs1oXaLzeTRgmOXRrWToRQskWmJk-CBs3-JxSTcck,8223
|
|
@@ -252,14 +255,14 @@ sqlalchemy/util/_py_collections.py,sha256=cYjsYLCLBy5jdGBJATLJCmtfzr_AaJ-HKTUN8O
|
|
|
252
255
|
sqlalchemy/util/compat.py,sha256=FkeHnW9asJYJvNmxVltee8jQNwQSdVRdKJlVRRInJI4,9388
|
|
253
256
|
sqlalchemy/util/concurrency.py,sha256=ZxcQYOKy-GBsQkPmCrBO5MzMpqW3JZme2Hiyqpbt9uc,2284
|
|
254
257
|
sqlalchemy/util/deprecations.py,sha256=pr9DSAf1ECqDk7X7F6TNc1jrhOeFihL33uEb5Wt2_T0,11971
|
|
255
|
-
sqlalchemy/util/langhelpers.py,sha256=
|
|
258
|
+
sqlalchemy/util/langhelpers.py,sha256=CQQP2Q9c68nL5mcWL-Q38-INrtoDHDnBmq7QhnWyEDM,64980
|
|
256
259
|
sqlalchemy/util/preloaded.py,sha256=KKNLJEqChDW1TNUsM_TzKu7JYEA3kkuh2N-quM_2_Y4,5905
|
|
257
260
|
sqlalchemy/util/queue.py,sha256=ITejs6KS4Hz_ojrss2oFeUO9MoIeR3qWmZQ8J7yyrNU,10205
|
|
258
261
|
sqlalchemy/util/tool_support.py,sha256=epm8MzDZpVmhE6LIjrjJrP8BUf12Wab2m28A9lGq95s,5969
|
|
259
262
|
sqlalchemy/util/topological.py,sha256=hjJWL3C_B7Rpv9s7jj7wcTckcZUSkxc6xRDhiN1xyec,3458
|
|
260
263
|
sqlalchemy/util/typing.py,sha256=ESYm4oQtt-SarN04YTXCgovXT8tFupMiPmuGCDCMEIc,15831
|
|
261
|
-
SQLAlchemy-2.0.
|
|
262
|
-
SQLAlchemy-2.0.
|
|
263
|
-
SQLAlchemy-2.0.
|
|
264
|
-
SQLAlchemy-2.0.
|
|
265
|
-
SQLAlchemy-2.0.
|
|
264
|
+
SQLAlchemy-2.0.23.dist-info/LICENSE,sha256=2lSTeluT1aC-5eJXO8vhkzf93qCSeV_mFXLrv3tNdIU,1100
|
|
265
|
+
SQLAlchemy-2.0.23.dist-info/METADATA,sha256=znDChLueFNPCOPuNix-FfY7FG6aQOCM-lQwwN-cPLQs,9551
|
|
266
|
+
SQLAlchemy-2.0.23.dist-info/WHEEL,sha256=Xo9-1PvkuimrydujYJAjF7pCkriuXBpUPEjma1nZyJ0,92
|
|
267
|
+
SQLAlchemy-2.0.23.dist-info/top_level.txt,sha256=rp-ZgB7D8G11ivXON5VGPjupT1voYmWqkciDt5Uaw_Q,11
|
|
268
|
+
SQLAlchemy-2.0.23.dist-info/RECORD,,
|
sqlalchemy/__init__.py
CHANGED
|
@@ -0,0 +1,187 @@
|
|
|
1
|
+
# connectors/aioodbc.py
|
|
2
|
+
# Copyright (C) 2005-2023 the SQLAlchemy authors and contributors
|
|
3
|
+
# <see AUTHORS file>
|
|
4
|
+
#
|
|
5
|
+
# This module is part of SQLAlchemy and is released under
|
|
6
|
+
# the MIT License: https://www.opensource.org/licenses/mit-license.php
|
|
7
|
+
# mypy: ignore-errors
|
|
8
|
+
|
|
9
|
+
from __future__ import annotations
|
|
10
|
+
|
|
11
|
+
from typing import TYPE_CHECKING
|
|
12
|
+
|
|
13
|
+
from .asyncio import AsyncAdapt_dbapi_connection
|
|
14
|
+
from .asyncio import AsyncAdapt_dbapi_cursor
|
|
15
|
+
from .asyncio import AsyncAdapt_dbapi_ss_cursor
|
|
16
|
+
from .asyncio import AsyncAdaptFallback_dbapi_connection
|
|
17
|
+
from .pyodbc import PyODBCConnector
|
|
18
|
+
from .. import pool
|
|
19
|
+
from .. import util
|
|
20
|
+
from ..util.concurrency import await_fallback
|
|
21
|
+
from ..util.concurrency import await_only
|
|
22
|
+
|
|
23
|
+
if TYPE_CHECKING:
|
|
24
|
+
from ..engine.interfaces import ConnectArgsType
|
|
25
|
+
from ..engine.url import URL
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
class AsyncAdapt_aioodbc_cursor(AsyncAdapt_dbapi_cursor):
|
|
29
|
+
__slots__ = ()
|
|
30
|
+
|
|
31
|
+
def setinputsizes(self, *inputsizes):
|
|
32
|
+
# see https://github.com/aio-libs/aioodbc/issues/451
|
|
33
|
+
return self._cursor._impl.setinputsizes(*inputsizes)
|
|
34
|
+
|
|
35
|
+
# how it's supposed to work
|
|
36
|
+
# return self.await_(self._cursor.setinputsizes(*inputsizes))
|
|
37
|
+
|
|
38
|
+
|
|
39
|
+
class AsyncAdapt_aioodbc_ss_cursor(
|
|
40
|
+
AsyncAdapt_aioodbc_cursor, AsyncAdapt_dbapi_ss_cursor
|
|
41
|
+
):
|
|
42
|
+
__slots__ = ()
|
|
43
|
+
|
|
44
|
+
|
|
45
|
+
class AsyncAdapt_aioodbc_connection(AsyncAdapt_dbapi_connection):
|
|
46
|
+
_cursor_cls = AsyncAdapt_aioodbc_cursor
|
|
47
|
+
_ss_cursor_cls = AsyncAdapt_aioodbc_ss_cursor
|
|
48
|
+
__slots__ = ()
|
|
49
|
+
|
|
50
|
+
@property
|
|
51
|
+
def autocommit(self):
|
|
52
|
+
return self._connection.autocommit
|
|
53
|
+
|
|
54
|
+
@autocommit.setter
|
|
55
|
+
def autocommit(self, value):
|
|
56
|
+
# https://github.com/aio-libs/aioodbc/issues/448
|
|
57
|
+
# self._connection.autocommit = value
|
|
58
|
+
|
|
59
|
+
self._connection._conn.autocommit = value
|
|
60
|
+
|
|
61
|
+
def cursor(self, server_side=False):
|
|
62
|
+
# aioodbc sets connection=None when closed and just fails with
|
|
63
|
+
# AttributeError here. Here we use the same ProgrammingError +
|
|
64
|
+
# message that pyodbc uses, so it triggers is_disconnect() as well.
|
|
65
|
+
if self._connection.closed:
|
|
66
|
+
raise self.dbapi.ProgrammingError(
|
|
67
|
+
"Attempt to use a closed connection."
|
|
68
|
+
)
|
|
69
|
+
return super().cursor(server_side=server_side)
|
|
70
|
+
|
|
71
|
+
def rollback(self):
|
|
72
|
+
# aioodbc sets connection=None when closed and just fails with
|
|
73
|
+
# AttributeError here. should be a no-op
|
|
74
|
+
if not self._connection.closed:
|
|
75
|
+
super().rollback()
|
|
76
|
+
|
|
77
|
+
def commit(self):
|
|
78
|
+
# aioodbc sets connection=None when closed and just fails with
|
|
79
|
+
# AttributeError here. should be a no-op
|
|
80
|
+
if not self._connection.closed:
|
|
81
|
+
super().commit()
|
|
82
|
+
|
|
83
|
+
def close(self):
|
|
84
|
+
# aioodbc sets connection=None when closed and just fails with
|
|
85
|
+
# AttributeError here. should be a no-op
|
|
86
|
+
if not self._connection.closed:
|
|
87
|
+
super().close()
|
|
88
|
+
|
|
89
|
+
|
|
90
|
+
class AsyncAdaptFallback_aioodbc_connection(
|
|
91
|
+
AsyncAdaptFallback_dbapi_connection, AsyncAdapt_aioodbc_connection
|
|
92
|
+
):
|
|
93
|
+
__slots__ = ()
|
|
94
|
+
|
|
95
|
+
|
|
96
|
+
class AsyncAdapt_aioodbc_dbapi:
|
|
97
|
+
def __init__(self, aioodbc, pyodbc):
|
|
98
|
+
self.aioodbc = aioodbc
|
|
99
|
+
self.pyodbc = pyodbc
|
|
100
|
+
self.paramstyle = pyodbc.paramstyle
|
|
101
|
+
self._init_dbapi_attributes()
|
|
102
|
+
self.Cursor = AsyncAdapt_dbapi_cursor
|
|
103
|
+
self.version = pyodbc.version
|
|
104
|
+
|
|
105
|
+
def _init_dbapi_attributes(self):
|
|
106
|
+
for name in (
|
|
107
|
+
"Warning",
|
|
108
|
+
"Error",
|
|
109
|
+
"InterfaceError",
|
|
110
|
+
"DataError",
|
|
111
|
+
"DatabaseError",
|
|
112
|
+
"OperationalError",
|
|
113
|
+
"InterfaceError",
|
|
114
|
+
"IntegrityError",
|
|
115
|
+
"ProgrammingError",
|
|
116
|
+
"InternalError",
|
|
117
|
+
"NotSupportedError",
|
|
118
|
+
"NUMBER",
|
|
119
|
+
"STRING",
|
|
120
|
+
"DATETIME",
|
|
121
|
+
"BINARY",
|
|
122
|
+
"Binary",
|
|
123
|
+
"BinaryNull",
|
|
124
|
+
"SQL_VARCHAR",
|
|
125
|
+
"SQL_WVARCHAR",
|
|
126
|
+
):
|
|
127
|
+
setattr(self, name, getattr(self.pyodbc, name))
|
|
128
|
+
|
|
129
|
+
def connect(self, *arg, **kw):
|
|
130
|
+
async_fallback = kw.pop("async_fallback", False)
|
|
131
|
+
creator_fn = kw.pop("async_creator_fn", self.aioodbc.connect)
|
|
132
|
+
|
|
133
|
+
if util.asbool(async_fallback):
|
|
134
|
+
return AsyncAdaptFallback_aioodbc_connection(
|
|
135
|
+
self,
|
|
136
|
+
await_fallback(creator_fn(*arg, **kw)),
|
|
137
|
+
)
|
|
138
|
+
else:
|
|
139
|
+
return AsyncAdapt_aioodbc_connection(
|
|
140
|
+
self,
|
|
141
|
+
await_only(creator_fn(*arg, **kw)),
|
|
142
|
+
)
|
|
143
|
+
|
|
144
|
+
|
|
145
|
+
class aiodbcConnector(PyODBCConnector):
|
|
146
|
+
is_async = True
|
|
147
|
+
supports_statement_cache = True
|
|
148
|
+
|
|
149
|
+
supports_server_side_cursors = True
|
|
150
|
+
|
|
151
|
+
@classmethod
|
|
152
|
+
def import_dbapi(cls):
|
|
153
|
+
return AsyncAdapt_aioodbc_dbapi(
|
|
154
|
+
__import__("aioodbc"), __import__("pyodbc")
|
|
155
|
+
)
|
|
156
|
+
|
|
157
|
+
def create_connect_args(self, url: URL) -> ConnectArgsType:
|
|
158
|
+
arg, kw = super().create_connect_args(url)
|
|
159
|
+
if arg and arg[0]:
|
|
160
|
+
kw["dsn"] = arg[0]
|
|
161
|
+
|
|
162
|
+
return (), kw
|
|
163
|
+
|
|
164
|
+
@classmethod
|
|
165
|
+
def get_pool_class(cls, url):
|
|
166
|
+
async_fallback = url.query.get("async_fallback", False)
|
|
167
|
+
|
|
168
|
+
if util.asbool(async_fallback):
|
|
169
|
+
return pool.FallbackAsyncAdaptedQueuePool
|
|
170
|
+
else:
|
|
171
|
+
return pool.AsyncAdaptedQueuePool
|
|
172
|
+
|
|
173
|
+
def _do_isolation_level(self, connection, autocommit, isolation_level):
|
|
174
|
+
connection.set_autocommit(autocommit)
|
|
175
|
+
connection.set_isolation_level(isolation_level)
|
|
176
|
+
|
|
177
|
+
def _do_autocommit(self, connection, value):
|
|
178
|
+
connection.set_autocommit(value)
|
|
179
|
+
|
|
180
|
+
def set_readonly(self, connection, value):
|
|
181
|
+
connection.set_read_only(value)
|
|
182
|
+
|
|
183
|
+
def set_deferrable(self, connection, value):
|
|
184
|
+
connection.set_deferrable(value)
|
|
185
|
+
|
|
186
|
+
def get_driver_connection(self, connection):
|
|
187
|
+
return connection._connection
|