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.
Files changed (50) hide show
  1. {SQLAlchemy-2.0.22.dist-info → SQLAlchemy-2.0.23.dist-info}/METADATA +5 -2
  2. {SQLAlchemy-2.0.22.dist-info → SQLAlchemy-2.0.23.dist-info}/RECORD +50 -47
  3. {SQLAlchemy-2.0.22.dist-info → SQLAlchemy-2.0.23.dist-info}/WHEEL +1 -1
  4. sqlalchemy/__init__.py +1 -1
  5. sqlalchemy/connectors/aioodbc.py +187 -0
  6. sqlalchemy/connectors/asyncio.py +209 -0
  7. sqlalchemy/dialects/mssql/__init__.py +1 -0
  8. sqlalchemy/dialects/mssql/aioodbc.py +64 -0
  9. sqlalchemy/dialects/mssql/base.py +3 -9
  10. sqlalchemy/dialects/mssql/information_schema.py +1 -1
  11. sqlalchemy/dialects/mssql/provision.py +1 -1
  12. sqlalchemy/dialects/mssql/pyodbc.py +8 -2
  13. sqlalchemy/dialects/mysql/aiomysql.py +8 -0
  14. sqlalchemy/dialects/mysql/asyncmy.py +6 -0
  15. sqlalchemy/dialects/mysql/base.py +40 -3
  16. sqlalchemy/dialects/mysql/mariadbconnector.py +2 -0
  17. sqlalchemy/dialects/mysql/mysqldb.py +1 -1
  18. sqlalchemy/dialects/mysql/pymysql.py +34 -0
  19. sqlalchemy/dialects/oracle/cx_oracle.py +2 -2
  20. sqlalchemy/dialects/oracle/types.py +55 -26
  21. sqlalchemy/dialects/postgresql/asyncpg.py +6 -0
  22. sqlalchemy/dialects/postgresql/types.py +10 -0
  23. sqlalchemy/dialects/sqlite/aiosqlite.py +35 -0
  24. sqlalchemy/dialects/sqlite/base.py +4 -3
  25. sqlalchemy/ext/asyncio/__init__.py +1 -0
  26. sqlalchemy/ext/asyncio/scoping.py +9 -1
  27. sqlalchemy/ext/asyncio/session.py +28 -2
  28. sqlalchemy/orm/_typing.py +1 -0
  29. sqlalchemy/orm/bulk_persistence.py +1 -1
  30. sqlalchemy/orm/decl_base.py +11 -3
  31. sqlalchemy/orm/scoping.py +3 -2
  32. sqlalchemy/orm/session.py +6 -4
  33. sqlalchemy/orm/strategies.py +5 -4
  34. sqlalchemy/orm/strategy_options.py +37 -14
  35. sqlalchemy/orm/util.py +10 -7
  36. sqlalchemy/sql/base.py +1 -0
  37. sqlalchemy/sql/cache_key.py +3 -0
  38. sqlalchemy/sql/compiler.py +16 -11
  39. sqlalchemy/sql/sqltypes.py +10 -19
  40. sqlalchemy/sql/type_api.py +0 -27
  41. sqlalchemy/testing/assertsql.py +1 -0
  42. sqlalchemy/testing/plugin/plugin_base.py +13 -6
  43. sqlalchemy/testing/requirements.py +8 -0
  44. sqlalchemy/testing/suite/test_insert.py +0 -2
  45. sqlalchemy/testing/suite/test_results.py +2 -2
  46. sqlalchemy/testing/suite/test_types.py +109 -1
  47. sqlalchemy/testing/suite/test_update_delete.py +67 -0
  48. sqlalchemy/util/langhelpers.py +11 -4
  49. {SQLAlchemy-2.0.22.dist-info → SQLAlchemy-2.0.23.dist-info}/LICENSE +0 -0
  50. {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.22
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 >=7 ; extra == '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=I-8Nq50JT9jAtqjhumiySbIFIFUAwkgf7_e-_dagOnU,12708
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=cHfYkDNsBKHrhaRVNdz7HFnYKAV4mQogP3sZdB5tUdA,1841
22
- sqlalchemy/dialects/mssql/base.py,sha256=iuc9XaQN_-iXnl1paW-5ZYjNjuOXuZh6IHn-g3eq2mQ,133881
23
- sqlalchemy/dialects/mssql/information_schema.py,sha256=vVsIan_fwm2HmU13SMoBP4QgrSJ52itHgr8dOXu5INk,8067
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=qNslme0Z62slaOiU1o1eOckJ6UaYUgbcRRfnR1N2lzw,4996
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=FMpDyh3YeprRPL6mSVkcsZJEZX9eKPPWEBhyZ9P0swA,26812
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=no19qMZKagz4Caf77gB3rc8ymcjdoi025knucubIeNE,9514
30
- sqlalchemy/dialects/mysql/asyncmy.py,sha256=qtm7Ljay4W370M404A9qMKSsu17eDk4nvxT3Hh7lWhg,9642
31
- sqlalchemy/dialects/mysql/base.py,sha256=ssHFdCmRKSJcuj6bC8nOOfMLPrwymYhQwqEMB5iXMV4,119313
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=4G01eErLpv40R-NRKHMTwDM8ZhCj-l5_Y_CczcYdaQo,8696
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=dPXGcjZtvMx0CoH6530kDNginDE5YfGgxWUz0L28_0A,9654
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=gLaQkaTU-RISblBiOlxvx5Kdumq04NI_p4fpVKXTRuQ,2944
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=9Oox86BY4jJKGE-6F_HFQzohZtWXrWgmoRobL5A2_VQ,55108
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=IhDjnE7m98jYBOp28BOull4QOaSTacNUNAOVryNFfpU,7481
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=F7BsHkh700h6zzysEjky0Q7Nh5GrpQoJ8kz5knPQU2U,39862
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=-T0m_4ukrsUfM_Z49Y0kGLeUbk7ZVyhqr0QLQ6oyOrw,6938
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=T8Vq-H-7tgIW24JOl9_KAHfqwhA6edemuByt9SJfNxQ,10897
75
- sqlalchemy/dialects/sqlite/base.py,sha256=YQ6DR97AOws_VHcuWRopTPmN8djG7Ni0KBSVbZA7uGU,96699
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=oaV5vnuL6DOd_n1TApySI157_380Pd9bskjjriS7iik,1255
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=9AdL3FJj4T8cAMNKIJmfQO3v--6l9Pp14rzYDil3B-g,52312
124
- sqlalchemy/ext/asyncio/session.py,sha256=jiYB3i1LIpGYg24S8oi6t9EnwGNOmqS01JJtsnuaUNs,62282
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=wUVKo6a0drHhwIQwk4ryvXDPhycqNNjCd72RYUmIsqc,4992
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=J5oFlnqZ4l9GtD5wMg8U5lsUjlrgIN2fMtrdzzuJTvM,69862
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=gbMkC2Bi-JE3QxaAwA3ZzHITIDByLgrXChdaWBsiTpc,81230
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=TirYe206fri0IPP5pzy7nduY8IEzrYoXlwgzY6QYQNE,78766
165
- sqlalchemy/orm/session.py,sha256=nZkmycbgCJfLyRizKRwJnw4mqQF0NI2otEXWjNWRzgU,193160
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=fLUd1OFbFngJ95KBT5dNNEmnRnIkedRyHXgPLsIVfD4,114095
169
- sqlalchemy/orm/strategy_options.py,sha256=p30mgcxRq2JijmmjRStcRC6nwJkgWqAistDHRK6dOn4,83390
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=MulBE0TYiZsRtUIAtAsaQU44hhm2kPPzQVlr-JARNuc,80234
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=uHn1t3vSUxojTNx6cckZJYMGNkcIsaTLvrRbtrT_1zE,73894
187
- sqlalchemy/sql/cache_key.py,sha256=ObhC6btwzChajxhNskBnBCrJ3aVpPzMC1KKII0bbhsc,32747
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=NlQdx_fgw1XtA1GDX92ItnFwiMp1-vU7sMm-muzVFtg,268385
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=8OITtdgdyxYH-MRxbXRiekwAcJ0aCc8t7e3w8E2M10o,126882
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=gtmRalEx60yP9nWQG9syjBaItJD3de_s-A9p8MxU_KU,84900
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=fIlHNWaGUR439L6yF98kGz4E_VBIJw5BvpnnQoCutCA,16775
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=sdo9_AYuX6ZyvvVAGaeeRFsK-W-ufiTeX8PPbV3FVnU,51147
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=rC7dG-eNJ824DQtsQ-Ic0o5BCoX8q4LLQKRHRbbs6qw,21279
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=egppckkbmfOMZHNyWWznKn3eqBLTaIcBEfuYeuVjq0E,18425
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=BSNHQ1SxhU964RS5AIkKMqE_JrVjCabtODLHr5EYfHo,15665
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=GTully5oymZ9I_GCrw1q0_kVRcnPSOnfT89shObI8x0,61834
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=VxhsI37iivEYejQ38duuT4dida9iXH_4EK3QMvaXMZM,1648
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=HgI1A4-Mv08aSXej_sI4reDv6mLgsUSWca43uMXfXAs,64697
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.22.dist-info/LICENSE,sha256=2lSTeluT1aC-5eJXO8vhkzf93qCSeV_mFXLrv3tNdIU,1100
262
- SQLAlchemy-2.0.22.dist-info/METADATA,sha256=xKFkm7Vf9J6W6hIC9iQ6yecmKeY_VUBAtv-0LhDPzH0,9429
263
- SQLAlchemy-2.0.22.dist-info/WHEEL,sha256=yQN5g4mg4AybRjkgi-9yy4iQEFibGQmlz78Pik5Or-A,92
264
- SQLAlchemy-2.0.22.dist-info/top_level.txt,sha256=rp-ZgB7D8G11ivXON5VGPjupT1voYmWqkciDt5Uaw_Q,11
265
- SQLAlchemy-2.0.22.dist-info/RECORD,,
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,,
@@ -1,5 +1,5 @@
1
1
  Wheel-Version: 1.0
2
- Generator: bdist_wheel (0.41.2)
2
+ Generator: bdist_wheel (0.41.3)
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any
5
5
 
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.22"
272
+ __version__ = "2.0.23"
273
273
 
274
274
 
275
275
  def __go(lcls: Any) -> None:
@@ -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