sqlspec 0.36.0__cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.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 (531) hide show
  1. ac8f31065839703b4e70__mypyc.cpython-310-aarch64-linux-gnu.so +0 -0
  2. sqlspec/__init__.py +140 -0
  3. sqlspec/__main__.py +12 -0
  4. sqlspec/__metadata__.py +14 -0
  5. sqlspec/_serialization.py +315 -0
  6. sqlspec/_typing.py +700 -0
  7. sqlspec/adapters/__init__.py +0 -0
  8. sqlspec/adapters/adbc/__init__.py +5 -0
  9. sqlspec/adapters/adbc/_typing.py +82 -0
  10. sqlspec/adapters/adbc/adk/__init__.py +5 -0
  11. sqlspec/adapters/adbc/adk/store.py +1273 -0
  12. sqlspec/adapters/adbc/config.py +295 -0
  13. sqlspec/adapters/adbc/core.cpython-310-aarch64-linux-gnu.so +0 -0
  14. sqlspec/adapters/adbc/core.py +735 -0
  15. sqlspec/adapters/adbc/data_dictionary.py +334 -0
  16. sqlspec/adapters/adbc/driver.py +529 -0
  17. sqlspec/adapters/adbc/events/__init__.py +5 -0
  18. sqlspec/adapters/adbc/events/store.py +285 -0
  19. sqlspec/adapters/adbc/litestar/__init__.py +5 -0
  20. sqlspec/adapters/adbc/litestar/store.py +502 -0
  21. sqlspec/adapters/adbc/type_converter.cpython-310-aarch64-linux-gnu.so +0 -0
  22. sqlspec/adapters/adbc/type_converter.py +140 -0
  23. sqlspec/adapters/aiosqlite/__init__.py +25 -0
  24. sqlspec/adapters/aiosqlite/_typing.py +82 -0
  25. sqlspec/adapters/aiosqlite/adk/__init__.py +5 -0
  26. sqlspec/adapters/aiosqlite/adk/store.py +818 -0
  27. sqlspec/adapters/aiosqlite/config.py +334 -0
  28. sqlspec/adapters/aiosqlite/core.cpython-310-aarch64-linux-gnu.so +0 -0
  29. sqlspec/adapters/aiosqlite/core.py +315 -0
  30. sqlspec/adapters/aiosqlite/data_dictionary.py +208 -0
  31. sqlspec/adapters/aiosqlite/driver.py +313 -0
  32. sqlspec/adapters/aiosqlite/events/__init__.py +5 -0
  33. sqlspec/adapters/aiosqlite/events/store.py +20 -0
  34. sqlspec/adapters/aiosqlite/litestar/__init__.py +5 -0
  35. sqlspec/adapters/aiosqlite/litestar/store.py +279 -0
  36. sqlspec/adapters/aiosqlite/pool.py +533 -0
  37. sqlspec/adapters/asyncmy/__init__.py +21 -0
  38. sqlspec/adapters/asyncmy/_typing.py +87 -0
  39. sqlspec/adapters/asyncmy/adk/__init__.py +5 -0
  40. sqlspec/adapters/asyncmy/adk/store.py +703 -0
  41. sqlspec/adapters/asyncmy/config.py +302 -0
  42. sqlspec/adapters/asyncmy/core.cpython-310-aarch64-linux-gnu.so +0 -0
  43. sqlspec/adapters/asyncmy/core.py +360 -0
  44. sqlspec/adapters/asyncmy/data_dictionary.py +124 -0
  45. sqlspec/adapters/asyncmy/driver.py +383 -0
  46. sqlspec/adapters/asyncmy/events/__init__.py +5 -0
  47. sqlspec/adapters/asyncmy/events/store.py +104 -0
  48. sqlspec/adapters/asyncmy/litestar/__init__.py +5 -0
  49. sqlspec/adapters/asyncmy/litestar/store.py +296 -0
  50. sqlspec/adapters/asyncpg/__init__.py +19 -0
  51. sqlspec/adapters/asyncpg/_typing.py +88 -0
  52. sqlspec/adapters/asyncpg/adk/__init__.py +5 -0
  53. sqlspec/adapters/asyncpg/adk/store.py +748 -0
  54. sqlspec/adapters/asyncpg/config.py +569 -0
  55. sqlspec/adapters/asyncpg/core.cpython-310-aarch64-linux-gnu.so +0 -0
  56. sqlspec/adapters/asyncpg/core.py +367 -0
  57. sqlspec/adapters/asyncpg/data_dictionary.py +162 -0
  58. sqlspec/adapters/asyncpg/driver.py +487 -0
  59. sqlspec/adapters/asyncpg/events/__init__.py +6 -0
  60. sqlspec/adapters/asyncpg/events/backend.py +286 -0
  61. sqlspec/adapters/asyncpg/events/store.py +40 -0
  62. sqlspec/adapters/asyncpg/litestar/__init__.py +5 -0
  63. sqlspec/adapters/asyncpg/litestar/store.py +251 -0
  64. sqlspec/adapters/bigquery/__init__.py +14 -0
  65. sqlspec/adapters/bigquery/_typing.py +86 -0
  66. sqlspec/adapters/bigquery/adk/__init__.py +5 -0
  67. sqlspec/adapters/bigquery/adk/store.py +827 -0
  68. sqlspec/adapters/bigquery/config.py +353 -0
  69. sqlspec/adapters/bigquery/core.cpython-310-aarch64-linux-gnu.so +0 -0
  70. sqlspec/adapters/bigquery/core.py +715 -0
  71. sqlspec/adapters/bigquery/data_dictionary.py +128 -0
  72. sqlspec/adapters/bigquery/driver.py +548 -0
  73. sqlspec/adapters/bigquery/events/__init__.py +5 -0
  74. sqlspec/adapters/bigquery/events/store.py +139 -0
  75. sqlspec/adapters/bigquery/litestar/__init__.py +5 -0
  76. sqlspec/adapters/bigquery/litestar/store.py +325 -0
  77. sqlspec/adapters/bigquery/type_converter.cpython-310-aarch64-linux-gnu.so +0 -0
  78. sqlspec/adapters/bigquery/type_converter.py +107 -0
  79. sqlspec/adapters/cockroach_asyncpg/__init__.py +24 -0
  80. sqlspec/adapters/cockroach_asyncpg/_typing.py +72 -0
  81. sqlspec/adapters/cockroach_asyncpg/adk/__init__.py +3 -0
  82. sqlspec/adapters/cockroach_asyncpg/adk/store.py +410 -0
  83. sqlspec/adapters/cockroach_asyncpg/config.py +238 -0
  84. sqlspec/adapters/cockroach_asyncpg/core.cpython-310-aarch64-linux-gnu.so +0 -0
  85. sqlspec/adapters/cockroach_asyncpg/core.py +55 -0
  86. sqlspec/adapters/cockroach_asyncpg/data_dictionary.py +107 -0
  87. sqlspec/adapters/cockroach_asyncpg/driver.py +144 -0
  88. sqlspec/adapters/cockroach_asyncpg/events/__init__.py +3 -0
  89. sqlspec/adapters/cockroach_asyncpg/events/store.py +20 -0
  90. sqlspec/adapters/cockroach_asyncpg/litestar/__init__.py +3 -0
  91. sqlspec/adapters/cockroach_asyncpg/litestar/store.py +142 -0
  92. sqlspec/adapters/cockroach_psycopg/__init__.py +38 -0
  93. sqlspec/adapters/cockroach_psycopg/_typing.py +129 -0
  94. sqlspec/adapters/cockroach_psycopg/adk/__init__.py +13 -0
  95. sqlspec/adapters/cockroach_psycopg/adk/store.py +868 -0
  96. sqlspec/adapters/cockroach_psycopg/config.py +484 -0
  97. sqlspec/adapters/cockroach_psycopg/core.cpython-310-aarch64-linux-gnu.so +0 -0
  98. sqlspec/adapters/cockroach_psycopg/core.py +63 -0
  99. sqlspec/adapters/cockroach_psycopg/data_dictionary.py +215 -0
  100. sqlspec/adapters/cockroach_psycopg/driver.py +284 -0
  101. sqlspec/adapters/cockroach_psycopg/events/__init__.py +6 -0
  102. sqlspec/adapters/cockroach_psycopg/events/store.py +34 -0
  103. sqlspec/adapters/cockroach_psycopg/litestar/__init__.py +3 -0
  104. sqlspec/adapters/cockroach_psycopg/litestar/store.py +325 -0
  105. sqlspec/adapters/duckdb/__init__.py +25 -0
  106. sqlspec/adapters/duckdb/_typing.py +81 -0
  107. sqlspec/adapters/duckdb/adk/__init__.py +14 -0
  108. sqlspec/adapters/duckdb/adk/store.py +850 -0
  109. sqlspec/adapters/duckdb/config.py +463 -0
  110. sqlspec/adapters/duckdb/core.cpython-310-aarch64-linux-gnu.so +0 -0
  111. sqlspec/adapters/duckdb/core.py +257 -0
  112. sqlspec/adapters/duckdb/data_dictionary.py +140 -0
  113. sqlspec/adapters/duckdb/driver.py +430 -0
  114. sqlspec/adapters/duckdb/events/__init__.py +5 -0
  115. sqlspec/adapters/duckdb/events/store.py +57 -0
  116. sqlspec/adapters/duckdb/litestar/__init__.py +5 -0
  117. sqlspec/adapters/duckdb/litestar/store.py +330 -0
  118. sqlspec/adapters/duckdb/pool.py +293 -0
  119. sqlspec/adapters/duckdb/type_converter.cpython-310-aarch64-linux-gnu.so +0 -0
  120. sqlspec/adapters/duckdb/type_converter.py +118 -0
  121. sqlspec/adapters/mock/__init__.py +72 -0
  122. sqlspec/adapters/mock/_typing.py +147 -0
  123. sqlspec/adapters/mock/config.py +483 -0
  124. sqlspec/adapters/mock/core.py +319 -0
  125. sqlspec/adapters/mock/data_dictionary.py +366 -0
  126. sqlspec/adapters/mock/driver.py +721 -0
  127. sqlspec/adapters/mysqlconnector/__init__.py +36 -0
  128. sqlspec/adapters/mysqlconnector/_typing.py +141 -0
  129. sqlspec/adapters/mysqlconnector/adk/__init__.py +15 -0
  130. sqlspec/adapters/mysqlconnector/adk/store.py +1060 -0
  131. sqlspec/adapters/mysqlconnector/config.py +394 -0
  132. sqlspec/adapters/mysqlconnector/core.cpython-310-aarch64-linux-gnu.so +0 -0
  133. sqlspec/adapters/mysqlconnector/core.py +303 -0
  134. sqlspec/adapters/mysqlconnector/data_dictionary.py +235 -0
  135. sqlspec/adapters/mysqlconnector/driver.py +483 -0
  136. sqlspec/adapters/mysqlconnector/events/__init__.py +8 -0
  137. sqlspec/adapters/mysqlconnector/events/store.py +98 -0
  138. sqlspec/adapters/mysqlconnector/litestar/__init__.py +5 -0
  139. sqlspec/adapters/mysqlconnector/litestar/store.py +426 -0
  140. sqlspec/adapters/oracledb/__init__.py +60 -0
  141. sqlspec/adapters/oracledb/_numpy_handlers.py +141 -0
  142. sqlspec/adapters/oracledb/_typing.py +182 -0
  143. sqlspec/adapters/oracledb/_uuid_handlers.py +166 -0
  144. sqlspec/adapters/oracledb/adk/__init__.py +10 -0
  145. sqlspec/adapters/oracledb/adk/store.py +2369 -0
  146. sqlspec/adapters/oracledb/config.py +550 -0
  147. sqlspec/adapters/oracledb/core.cpython-310-aarch64-linux-gnu.so +0 -0
  148. sqlspec/adapters/oracledb/core.py +543 -0
  149. sqlspec/adapters/oracledb/data_dictionary.py +536 -0
  150. sqlspec/adapters/oracledb/driver.py +1229 -0
  151. sqlspec/adapters/oracledb/events/__init__.py +16 -0
  152. sqlspec/adapters/oracledb/events/backend.py +347 -0
  153. sqlspec/adapters/oracledb/events/store.py +420 -0
  154. sqlspec/adapters/oracledb/litestar/__init__.py +5 -0
  155. sqlspec/adapters/oracledb/litestar/store.py +781 -0
  156. sqlspec/adapters/oracledb/migrations.py +535 -0
  157. sqlspec/adapters/oracledb/type_converter.cpython-310-aarch64-linux-gnu.so +0 -0
  158. sqlspec/adapters/oracledb/type_converter.py +211 -0
  159. sqlspec/adapters/psqlpy/__init__.py +17 -0
  160. sqlspec/adapters/psqlpy/_typing.py +79 -0
  161. sqlspec/adapters/psqlpy/adk/__init__.py +5 -0
  162. sqlspec/adapters/psqlpy/adk/store.py +766 -0
  163. sqlspec/adapters/psqlpy/config.py +304 -0
  164. sqlspec/adapters/psqlpy/core.cpython-310-aarch64-linux-gnu.so +0 -0
  165. sqlspec/adapters/psqlpy/core.py +480 -0
  166. sqlspec/adapters/psqlpy/data_dictionary.py +126 -0
  167. sqlspec/adapters/psqlpy/driver.py +438 -0
  168. sqlspec/adapters/psqlpy/events/__init__.py +6 -0
  169. sqlspec/adapters/psqlpy/events/backend.py +310 -0
  170. sqlspec/adapters/psqlpy/events/store.py +20 -0
  171. sqlspec/adapters/psqlpy/litestar/__init__.py +5 -0
  172. sqlspec/adapters/psqlpy/litestar/store.py +270 -0
  173. sqlspec/adapters/psqlpy/type_converter.cpython-310-aarch64-linux-gnu.so +0 -0
  174. sqlspec/adapters/psqlpy/type_converter.py +113 -0
  175. sqlspec/adapters/psycopg/__init__.py +32 -0
  176. sqlspec/adapters/psycopg/_typing.py +164 -0
  177. sqlspec/adapters/psycopg/adk/__init__.py +10 -0
  178. sqlspec/adapters/psycopg/adk/store.py +1387 -0
  179. sqlspec/adapters/psycopg/config.py +576 -0
  180. sqlspec/adapters/psycopg/core.cpython-310-aarch64-linux-gnu.so +0 -0
  181. sqlspec/adapters/psycopg/core.py +450 -0
  182. sqlspec/adapters/psycopg/data_dictionary.py +289 -0
  183. sqlspec/adapters/psycopg/driver.py +975 -0
  184. sqlspec/adapters/psycopg/events/__init__.py +20 -0
  185. sqlspec/adapters/psycopg/events/backend.py +458 -0
  186. sqlspec/adapters/psycopg/events/store.py +42 -0
  187. sqlspec/adapters/psycopg/litestar/__init__.py +5 -0
  188. sqlspec/adapters/psycopg/litestar/store.py +552 -0
  189. sqlspec/adapters/psycopg/type_converter.cpython-310-aarch64-linux-gnu.so +0 -0
  190. sqlspec/adapters/psycopg/type_converter.py +93 -0
  191. sqlspec/adapters/pymysql/__init__.py +21 -0
  192. sqlspec/adapters/pymysql/_typing.py +71 -0
  193. sqlspec/adapters/pymysql/adk/__init__.py +5 -0
  194. sqlspec/adapters/pymysql/adk/store.py +540 -0
  195. sqlspec/adapters/pymysql/config.py +195 -0
  196. sqlspec/adapters/pymysql/core.cpython-310-aarch64-linux-gnu.so +0 -0
  197. sqlspec/adapters/pymysql/core.py +299 -0
  198. sqlspec/adapters/pymysql/data_dictionary.py +122 -0
  199. sqlspec/adapters/pymysql/driver.py +259 -0
  200. sqlspec/adapters/pymysql/events/__init__.py +5 -0
  201. sqlspec/adapters/pymysql/events/store.py +50 -0
  202. sqlspec/adapters/pymysql/litestar/__init__.py +5 -0
  203. sqlspec/adapters/pymysql/litestar/store.py +232 -0
  204. sqlspec/adapters/pymysql/pool.py +137 -0
  205. sqlspec/adapters/spanner/__init__.py +40 -0
  206. sqlspec/adapters/spanner/_typing.py +86 -0
  207. sqlspec/adapters/spanner/adk/__init__.py +5 -0
  208. sqlspec/adapters/spanner/adk/store.py +732 -0
  209. sqlspec/adapters/spanner/config.py +352 -0
  210. sqlspec/adapters/spanner/core.cpython-310-aarch64-linux-gnu.so +0 -0
  211. sqlspec/adapters/spanner/core.py +188 -0
  212. sqlspec/adapters/spanner/data_dictionary.py +120 -0
  213. sqlspec/adapters/spanner/dialect/__init__.py +6 -0
  214. sqlspec/adapters/spanner/dialect/_spangres.py +57 -0
  215. sqlspec/adapters/spanner/dialect/_spanner.py +130 -0
  216. sqlspec/adapters/spanner/driver.py +373 -0
  217. sqlspec/adapters/spanner/events/__init__.py +5 -0
  218. sqlspec/adapters/spanner/events/store.py +187 -0
  219. sqlspec/adapters/spanner/litestar/__init__.py +5 -0
  220. sqlspec/adapters/spanner/litestar/store.py +291 -0
  221. sqlspec/adapters/spanner/type_converter.cpython-310-aarch64-linux-gnu.so +0 -0
  222. sqlspec/adapters/spanner/type_converter.py +331 -0
  223. sqlspec/adapters/sqlite/__init__.py +19 -0
  224. sqlspec/adapters/sqlite/_typing.py +80 -0
  225. sqlspec/adapters/sqlite/adk/__init__.py +5 -0
  226. sqlspec/adapters/sqlite/adk/store.py +958 -0
  227. sqlspec/adapters/sqlite/config.py +280 -0
  228. sqlspec/adapters/sqlite/core.cpython-310-aarch64-linux-gnu.so +0 -0
  229. sqlspec/adapters/sqlite/core.py +312 -0
  230. sqlspec/adapters/sqlite/data_dictionary.py +202 -0
  231. sqlspec/adapters/sqlite/driver.py +359 -0
  232. sqlspec/adapters/sqlite/events/__init__.py +5 -0
  233. sqlspec/adapters/sqlite/events/store.py +20 -0
  234. sqlspec/adapters/sqlite/litestar/__init__.py +5 -0
  235. sqlspec/adapters/sqlite/litestar/store.py +316 -0
  236. sqlspec/adapters/sqlite/pool.py +198 -0
  237. sqlspec/adapters/sqlite/type_converter.cpython-310-aarch64-linux-gnu.so +0 -0
  238. sqlspec/adapters/sqlite/type_converter.py +114 -0
  239. sqlspec/base.py +747 -0
  240. sqlspec/builder/__init__.py +179 -0
  241. sqlspec/builder/_base.cpython-310-aarch64-linux-gnu.so +0 -0
  242. sqlspec/builder/_base.py +1022 -0
  243. sqlspec/builder/_column.cpython-310-aarch64-linux-gnu.so +0 -0
  244. sqlspec/builder/_column.py +521 -0
  245. sqlspec/builder/_ddl.cpython-310-aarch64-linux-gnu.so +0 -0
  246. sqlspec/builder/_ddl.py +1642 -0
  247. sqlspec/builder/_delete.cpython-310-aarch64-linux-gnu.so +0 -0
  248. sqlspec/builder/_delete.py +95 -0
  249. sqlspec/builder/_dml.cpython-310-aarch64-linux-gnu.so +0 -0
  250. sqlspec/builder/_dml.py +365 -0
  251. sqlspec/builder/_explain.cpython-310-aarch64-linux-gnu.so +0 -0
  252. sqlspec/builder/_explain.py +579 -0
  253. sqlspec/builder/_expression_wrappers.cpython-310-aarch64-linux-gnu.so +0 -0
  254. sqlspec/builder/_expression_wrappers.py +46 -0
  255. sqlspec/builder/_factory.cpython-310-aarch64-linux-gnu.so +0 -0
  256. sqlspec/builder/_factory.py +1697 -0
  257. sqlspec/builder/_insert.cpython-310-aarch64-linux-gnu.so +0 -0
  258. sqlspec/builder/_insert.py +328 -0
  259. sqlspec/builder/_join.cpython-310-aarch64-linux-gnu.so +0 -0
  260. sqlspec/builder/_join.py +499 -0
  261. sqlspec/builder/_merge.cpython-310-aarch64-linux-gnu.so +0 -0
  262. sqlspec/builder/_merge.py +821 -0
  263. sqlspec/builder/_parsing_utils.cpython-310-aarch64-linux-gnu.so +0 -0
  264. sqlspec/builder/_parsing_utils.py +297 -0
  265. sqlspec/builder/_select.cpython-310-aarch64-linux-gnu.so +0 -0
  266. sqlspec/builder/_select.py +1660 -0
  267. sqlspec/builder/_temporal.cpython-310-aarch64-linux-gnu.so +0 -0
  268. sqlspec/builder/_temporal.py +139 -0
  269. sqlspec/builder/_update.cpython-310-aarch64-linux-gnu.so +0 -0
  270. sqlspec/builder/_update.py +173 -0
  271. sqlspec/builder/_vector_expressions.py +267 -0
  272. sqlspec/cli.py +911 -0
  273. sqlspec/config.py +1755 -0
  274. sqlspec/core/__init__.py +374 -0
  275. sqlspec/core/_correlation.cpython-310-aarch64-linux-gnu.so +0 -0
  276. sqlspec/core/_correlation.py +176 -0
  277. sqlspec/core/cache.cpython-310-aarch64-linux-gnu.so +0 -0
  278. sqlspec/core/cache.py +1069 -0
  279. sqlspec/core/compiler.cpython-310-aarch64-linux-gnu.so +0 -0
  280. sqlspec/core/compiler.py +954 -0
  281. sqlspec/core/explain.cpython-310-aarch64-linux-gnu.so +0 -0
  282. sqlspec/core/explain.py +275 -0
  283. sqlspec/core/filters.cpython-310-aarch64-linux-gnu.so +0 -0
  284. sqlspec/core/filters.py +952 -0
  285. sqlspec/core/hashing.cpython-310-aarch64-linux-gnu.so +0 -0
  286. sqlspec/core/hashing.py +262 -0
  287. sqlspec/core/metrics.cpython-310-aarch64-linux-gnu.so +0 -0
  288. sqlspec/core/metrics.py +83 -0
  289. sqlspec/core/parameters/__init__.py +71 -0
  290. sqlspec/core/parameters/_alignment.cpython-310-aarch64-linux-gnu.so +0 -0
  291. sqlspec/core/parameters/_alignment.py +270 -0
  292. sqlspec/core/parameters/_converter.cpython-310-aarch64-linux-gnu.so +0 -0
  293. sqlspec/core/parameters/_converter.py +543 -0
  294. sqlspec/core/parameters/_processor.cpython-310-aarch64-linux-gnu.so +0 -0
  295. sqlspec/core/parameters/_processor.py +505 -0
  296. sqlspec/core/parameters/_registry.cpython-310-aarch64-linux-gnu.so +0 -0
  297. sqlspec/core/parameters/_registry.py +206 -0
  298. sqlspec/core/parameters/_transformers.cpython-310-aarch64-linux-gnu.so +0 -0
  299. sqlspec/core/parameters/_transformers.py +292 -0
  300. sqlspec/core/parameters/_types.cpython-310-aarch64-linux-gnu.so +0 -0
  301. sqlspec/core/parameters/_types.py +499 -0
  302. sqlspec/core/parameters/_validator.cpython-310-aarch64-linux-gnu.so +0 -0
  303. sqlspec/core/parameters/_validator.py +180 -0
  304. sqlspec/core/pipeline.cpython-310-aarch64-linux-gnu.so +0 -0
  305. sqlspec/core/pipeline.py +319 -0
  306. sqlspec/core/query_modifiers.cpython-310-aarch64-linux-gnu.so +0 -0
  307. sqlspec/core/query_modifiers.py +437 -0
  308. sqlspec/core/result/__init__.py +23 -0
  309. sqlspec/core/result/_base.cpython-310-aarch64-linux-gnu.so +0 -0
  310. sqlspec/core/result/_base.py +1121 -0
  311. sqlspec/core/result/_io.cpython-310-aarch64-linux-gnu.so +0 -0
  312. sqlspec/core/result/_io.py +28 -0
  313. sqlspec/core/splitter.cpython-310-aarch64-linux-gnu.so +0 -0
  314. sqlspec/core/splitter.py +966 -0
  315. sqlspec/core/stack.cpython-310-aarch64-linux-gnu.so +0 -0
  316. sqlspec/core/stack.py +163 -0
  317. sqlspec/core/statement.cpython-310-aarch64-linux-gnu.so +0 -0
  318. sqlspec/core/statement.py +1503 -0
  319. sqlspec/core/type_converter.cpython-310-aarch64-linux-gnu.so +0 -0
  320. sqlspec/core/type_converter.py +339 -0
  321. sqlspec/data_dictionary/__init__.py +22 -0
  322. sqlspec/data_dictionary/_loader.py +123 -0
  323. sqlspec/data_dictionary/_registry.cpython-310-aarch64-linux-gnu.so +0 -0
  324. sqlspec/data_dictionary/_registry.py +74 -0
  325. sqlspec/data_dictionary/_types.cpython-310-aarch64-linux-gnu.so +0 -0
  326. sqlspec/data_dictionary/_types.py +121 -0
  327. sqlspec/data_dictionary/dialects/__init__.py +21 -0
  328. sqlspec/data_dictionary/dialects/bigquery.cpython-310-aarch64-linux-gnu.so +0 -0
  329. sqlspec/data_dictionary/dialects/bigquery.py +49 -0
  330. sqlspec/data_dictionary/dialects/cockroachdb.cpython-310-aarch64-linux-gnu.so +0 -0
  331. sqlspec/data_dictionary/dialects/cockroachdb.py +43 -0
  332. sqlspec/data_dictionary/dialects/duckdb.cpython-310-aarch64-linux-gnu.so +0 -0
  333. sqlspec/data_dictionary/dialects/duckdb.py +47 -0
  334. sqlspec/data_dictionary/dialects/mysql.cpython-310-aarch64-linux-gnu.so +0 -0
  335. sqlspec/data_dictionary/dialects/mysql.py +42 -0
  336. sqlspec/data_dictionary/dialects/oracle.cpython-310-aarch64-linux-gnu.so +0 -0
  337. sqlspec/data_dictionary/dialects/oracle.py +34 -0
  338. sqlspec/data_dictionary/dialects/postgres.cpython-310-aarch64-linux-gnu.so +0 -0
  339. sqlspec/data_dictionary/dialects/postgres.py +46 -0
  340. sqlspec/data_dictionary/dialects/spanner.cpython-310-aarch64-linux-gnu.so +0 -0
  341. sqlspec/data_dictionary/dialects/spanner.py +37 -0
  342. sqlspec/data_dictionary/dialects/sqlite.cpython-310-aarch64-linux-gnu.so +0 -0
  343. sqlspec/data_dictionary/dialects/sqlite.py +42 -0
  344. sqlspec/data_dictionary/sql/.gitkeep +0 -0
  345. sqlspec/data_dictionary/sql/bigquery/columns.sql +23 -0
  346. sqlspec/data_dictionary/sql/bigquery/foreign_keys.sql +34 -0
  347. sqlspec/data_dictionary/sql/bigquery/indexes.sql +19 -0
  348. sqlspec/data_dictionary/sql/bigquery/tables.sql +33 -0
  349. sqlspec/data_dictionary/sql/bigquery/version.sql +3 -0
  350. sqlspec/data_dictionary/sql/cockroachdb/columns.sql +34 -0
  351. sqlspec/data_dictionary/sql/cockroachdb/foreign_keys.sql +40 -0
  352. sqlspec/data_dictionary/sql/cockroachdb/indexes.sql +32 -0
  353. sqlspec/data_dictionary/sql/cockroachdb/tables.sql +44 -0
  354. sqlspec/data_dictionary/sql/cockroachdb/version.sql +3 -0
  355. sqlspec/data_dictionary/sql/duckdb/columns.sql +23 -0
  356. sqlspec/data_dictionary/sql/duckdb/foreign_keys.sql +36 -0
  357. sqlspec/data_dictionary/sql/duckdb/indexes.sql +19 -0
  358. sqlspec/data_dictionary/sql/duckdb/tables.sql +38 -0
  359. sqlspec/data_dictionary/sql/duckdb/version.sql +3 -0
  360. sqlspec/data_dictionary/sql/mysql/columns.sql +23 -0
  361. sqlspec/data_dictionary/sql/mysql/foreign_keys.sql +28 -0
  362. sqlspec/data_dictionary/sql/mysql/indexes.sql +26 -0
  363. sqlspec/data_dictionary/sql/mysql/tables.sql +33 -0
  364. sqlspec/data_dictionary/sql/mysql/version.sql +3 -0
  365. sqlspec/data_dictionary/sql/oracle/columns.sql +23 -0
  366. sqlspec/data_dictionary/sql/oracle/foreign_keys.sql +48 -0
  367. sqlspec/data_dictionary/sql/oracle/indexes.sql +44 -0
  368. sqlspec/data_dictionary/sql/oracle/tables.sql +25 -0
  369. sqlspec/data_dictionary/sql/oracle/version.sql +20 -0
  370. sqlspec/data_dictionary/sql/postgres/columns.sql +34 -0
  371. sqlspec/data_dictionary/sql/postgres/foreign_keys.sql +40 -0
  372. sqlspec/data_dictionary/sql/postgres/indexes.sql +56 -0
  373. sqlspec/data_dictionary/sql/postgres/tables.sql +44 -0
  374. sqlspec/data_dictionary/sql/postgres/version.sql +3 -0
  375. sqlspec/data_dictionary/sql/spanner/columns.sql +23 -0
  376. sqlspec/data_dictionary/sql/spanner/foreign_keys.sql +70 -0
  377. sqlspec/data_dictionary/sql/spanner/indexes.sql +30 -0
  378. sqlspec/data_dictionary/sql/spanner/tables.sql +9 -0
  379. sqlspec/data_dictionary/sql/spanner/version.sql +3 -0
  380. sqlspec/data_dictionary/sql/sqlite/columns.sql +23 -0
  381. sqlspec/data_dictionary/sql/sqlite/foreign_keys.sql +22 -0
  382. sqlspec/data_dictionary/sql/sqlite/indexes.sql +7 -0
  383. sqlspec/data_dictionary/sql/sqlite/tables.sql +28 -0
  384. sqlspec/data_dictionary/sql/sqlite/version.sql +3 -0
  385. sqlspec/driver/__init__.py +32 -0
  386. sqlspec/driver/_async.cpython-310-aarch64-linux-gnu.so +0 -0
  387. sqlspec/driver/_async.py +1737 -0
  388. sqlspec/driver/_common.cpython-310-aarch64-linux-gnu.so +0 -0
  389. sqlspec/driver/_common.py +1478 -0
  390. sqlspec/driver/_sql_helpers.cpython-310-aarch64-linux-gnu.so +0 -0
  391. sqlspec/driver/_sql_helpers.py +148 -0
  392. sqlspec/driver/_storage_helpers.cpython-310-aarch64-linux-gnu.so +0 -0
  393. sqlspec/driver/_storage_helpers.py +144 -0
  394. sqlspec/driver/_sync.cpython-310-aarch64-linux-gnu.so +0 -0
  395. sqlspec/driver/_sync.py +1710 -0
  396. sqlspec/exceptions.py +338 -0
  397. sqlspec/extensions/__init__.py +0 -0
  398. sqlspec/extensions/adk/__init__.py +70 -0
  399. sqlspec/extensions/adk/_types.py +51 -0
  400. sqlspec/extensions/adk/converters.py +172 -0
  401. sqlspec/extensions/adk/memory/__init__.py +69 -0
  402. sqlspec/extensions/adk/memory/_types.py +30 -0
  403. sqlspec/extensions/adk/memory/converters.py +149 -0
  404. sqlspec/extensions/adk/memory/service.py +217 -0
  405. sqlspec/extensions/adk/memory/store.py +569 -0
  406. sqlspec/extensions/adk/migrations/0001_create_adk_tables.py +246 -0
  407. sqlspec/extensions/adk/migrations/__init__.py +0 -0
  408. sqlspec/extensions/adk/service.py +225 -0
  409. sqlspec/extensions/adk/store.py +567 -0
  410. sqlspec/extensions/events/__init__.py +51 -0
  411. sqlspec/extensions/events/_channel.py +703 -0
  412. sqlspec/extensions/events/_hints.py +45 -0
  413. sqlspec/extensions/events/_models.py +23 -0
  414. sqlspec/extensions/events/_payload.py +69 -0
  415. sqlspec/extensions/events/_protocols.py +134 -0
  416. sqlspec/extensions/events/_queue.py +461 -0
  417. sqlspec/extensions/events/_store.py +209 -0
  418. sqlspec/extensions/events/migrations/0001_create_event_queue.py +59 -0
  419. sqlspec/extensions/events/migrations/__init__.py +3 -0
  420. sqlspec/extensions/fastapi/__init__.py +19 -0
  421. sqlspec/extensions/fastapi/extension.py +351 -0
  422. sqlspec/extensions/fastapi/providers.py +607 -0
  423. sqlspec/extensions/flask/__init__.py +37 -0
  424. sqlspec/extensions/flask/_state.py +76 -0
  425. sqlspec/extensions/flask/_utils.py +71 -0
  426. sqlspec/extensions/flask/extension.py +519 -0
  427. sqlspec/extensions/litestar/__init__.py +28 -0
  428. sqlspec/extensions/litestar/_utils.py +52 -0
  429. sqlspec/extensions/litestar/channels.py +165 -0
  430. sqlspec/extensions/litestar/cli.py +102 -0
  431. sqlspec/extensions/litestar/config.py +90 -0
  432. sqlspec/extensions/litestar/handlers.py +316 -0
  433. sqlspec/extensions/litestar/migrations/0001_create_session_table.py +137 -0
  434. sqlspec/extensions/litestar/migrations/__init__.py +3 -0
  435. sqlspec/extensions/litestar/plugin.py +671 -0
  436. sqlspec/extensions/litestar/providers.py +526 -0
  437. sqlspec/extensions/litestar/store.py +296 -0
  438. sqlspec/extensions/otel/__init__.py +58 -0
  439. sqlspec/extensions/prometheus/__init__.py +113 -0
  440. sqlspec/extensions/starlette/__init__.py +19 -0
  441. sqlspec/extensions/starlette/_state.py +30 -0
  442. sqlspec/extensions/starlette/_utils.py +96 -0
  443. sqlspec/extensions/starlette/extension.py +346 -0
  444. sqlspec/extensions/starlette/middleware.py +235 -0
  445. sqlspec/loader.cpython-310-aarch64-linux-gnu.so +0 -0
  446. sqlspec/loader.py +702 -0
  447. sqlspec/migrations/__init__.py +36 -0
  448. sqlspec/migrations/base.py +731 -0
  449. sqlspec/migrations/commands.py +1232 -0
  450. sqlspec/migrations/context.py +157 -0
  451. sqlspec/migrations/fix.py +204 -0
  452. sqlspec/migrations/loaders.py +443 -0
  453. sqlspec/migrations/runner.py +1172 -0
  454. sqlspec/migrations/templates.py +234 -0
  455. sqlspec/migrations/tracker.py +611 -0
  456. sqlspec/migrations/utils.py +256 -0
  457. sqlspec/migrations/validation.py +207 -0
  458. sqlspec/migrations/version.py +446 -0
  459. sqlspec/observability/__init__.py +55 -0
  460. sqlspec/observability/_common.cpython-310-aarch64-linux-gnu.so +0 -0
  461. sqlspec/observability/_common.py +77 -0
  462. sqlspec/observability/_config.cpython-310-aarch64-linux-gnu.so +0 -0
  463. sqlspec/observability/_config.py +348 -0
  464. sqlspec/observability/_diagnostics.cpython-310-aarch64-linux-gnu.so +0 -0
  465. sqlspec/observability/_diagnostics.py +74 -0
  466. sqlspec/observability/_dispatcher.cpython-310-aarch64-linux-gnu.so +0 -0
  467. sqlspec/observability/_dispatcher.py +152 -0
  468. sqlspec/observability/_formatters/__init__.py +13 -0
  469. sqlspec/observability/_formatters/_aws.cpython-310-aarch64-linux-gnu.so +0 -0
  470. sqlspec/observability/_formatters/_aws.py +102 -0
  471. sqlspec/observability/_formatters/_azure.cpython-310-aarch64-linux-gnu.so +0 -0
  472. sqlspec/observability/_formatters/_azure.py +96 -0
  473. sqlspec/observability/_formatters/_base.cpython-310-aarch64-linux-gnu.so +0 -0
  474. sqlspec/observability/_formatters/_base.py +57 -0
  475. sqlspec/observability/_formatters/_gcp.cpython-310-aarch64-linux-gnu.so +0 -0
  476. sqlspec/observability/_formatters/_gcp.py +131 -0
  477. sqlspec/observability/_formatting.py +58 -0
  478. sqlspec/observability/_observer.cpython-310-aarch64-linux-gnu.so +0 -0
  479. sqlspec/observability/_observer.py +357 -0
  480. sqlspec/observability/_runtime.cpython-310-aarch64-linux-gnu.so +0 -0
  481. sqlspec/observability/_runtime.py +420 -0
  482. sqlspec/observability/_sampling.cpython-310-aarch64-linux-gnu.so +0 -0
  483. sqlspec/observability/_sampling.py +188 -0
  484. sqlspec/observability/_spans.cpython-310-aarch64-linux-gnu.so +0 -0
  485. sqlspec/observability/_spans.py +161 -0
  486. sqlspec/protocols.py +916 -0
  487. sqlspec/py.typed +0 -0
  488. sqlspec/storage/__init__.py +48 -0
  489. sqlspec/storage/_utils.py +104 -0
  490. sqlspec/storage/backends/__init__.py +1 -0
  491. sqlspec/storage/backends/base.py +253 -0
  492. sqlspec/storage/backends/fsspec.py +529 -0
  493. sqlspec/storage/backends/local.py +441 -0
  494. sqlspec/storage/backends/obstore.py +916 -0
  495. sqlspec/storage/errors.py +104 -0
  496. sqlspec/storage/pipeline.py +582 -0
  497. sqlspec/storage/registry.py +301 -0
  498. sqlspec/typing.py +395 -0
  499. sqlspec/utils/__init__.py +7 -0
  500. sqlspec/utils/arrow_helpers.py +318 -0
  501. sqlspec/utils/config_tools.py +332 -0
  502. sqlspec/utils/correlation.cpython-310-aarch64-linux-gnu.so +0 -0
  503. sqlspec/utils/correlation.py +134 -0
  504. sqlspec/utils/deprecation.py +190 -0
  505. sqlspec/utils/fixtures.cpython-310-aarch64-linux-gnu.so +0 -0
  506. sqlspec/utils/fixtures.py +258 -0
  507. sqlspec/utils/logging.py +222 -0
  508. sqlspec/utils/module_loader.py +306 -0
  509. sqlspec/utils/portal.cpython-310-aarch64-linux-gnu.so +0 -0
  510. sqlspec/utils/portal.py +375 -0
  511. sqlspec/utils/schema.cpython-310-aarch64-linux-gnu.so +0 -0
  512. sqlspec/utils/schema.py +485 -0
  513. sqlspec/utils/serializers.cpython-310-aarch64-linux-gnu.so +0 -0
  514. sqlspec/utils/serializers.py +408 -0
  515. sqlspec/utils/singleton.cpython-310-aarch64-linux-gnu.so +0 -0
  516. sqlspec/utils/singleton.py +41 -0
  517. sqlspec/utils/sync_tools.cpython-310-aarch64-linux-gnu.so +0 -0
  518. sqlspec/utils/sync_tools.py +311 -0
  519. sqlspec/utils/text.cpython-310-aarch64-linux-gnu.so +0 -0
  520. sqlspec/utils/text.py +108 -0
  521. sqlspec/utils/type_converters.cpython-310-aarch64-linux-gnu.so +0 -0
  522. sqlspec/utils/type_converters.py +128 -0
  523. sqlspec/utils/type_guards.cpython-310-aarch64-linux-gnu.so +0 -0
  524. sqlspec/utils/type_guards.py +1360 -0
  525. sqlspec/utils/uuids.cpython-310-aarch64-linux-gnu.so +0 -0
  526. sqlspec/utils/uuids.py +225 -0
  527. sqlspec-0.36.0.dist-info/METADATA +205 -0
  528. sqlspec-0.36.0.dist-info/RECORD +531 -0
  529. sqlspec-0.36.0.dist-info/WHEEL +7 -0
  530. sqlspec-0.36.0.dist-info/entry_points.txt +2 -0
  531. sqlspec-0.36.0.dist-info/licenses/LICENSE +21 -0
@@ -0,0 +1,259 @@
1
+ """PyMySQL MySQL driver implementation."""
2
+
3
+ from typing import TYPE_CHECKING, Any, Final, cast
4
+
5
+ import pymysql
6
+ from pymysql.constants import FIELD_TYPE
7
+
8
+ from sqlspec.adapters.pymysql.core import (
9
+ build_insert_statement,
10
+ collect_rows,
11
+ create_mapped_exception,
12
+ default_statement_config,
13
+ detect_json_columns,
14
+ driver_profile,
15
+ format_identifier,
16
+ normalize_execute_many_parameters,
17
+ normalize_execute_parameters,
18
+ normalize_lastrowid,
19
+ resolve_rowcount,
20
+ )
21
+ from sqlspec.adapters.pymysql.data_dictionary import PyMysqlDataDictionary
22
+ from sqlspec.core import ArrowResult, get_cache_config, register_driver_profile
23
+ from sqlspec.driver import SyncDriverAdapterBase
24
+ from sqlspec.exceptions import SQLSpecError
25
+ from sqlspec.utils.logging import get_logger
26
+ from sqlspec.utils.serializers import from_json
27
+ from sqlspec.utils.type_guards import supports_json_type
28
+
29
+ if TYPE_CHECKING:
30
+ from collections.abc import Callable
31
+
32
+ from sqlspec.adapters.pymysql._typing import PyMysqlConnection
33
+ from sqlspec.core import SQL, StatementConfig
34
+ from sqlspec.driver import ExecutionResult
35
+ from sqlspec.storage import StorageBridgeJob, StorageDestination, StorageFormat, StorageTelemetry
36
+
37
+ from sqlspec.adapters.pymysql._typing import PyMysqlSessionContext
38
+
39
+ __all__ = ("PyMysqlCursor", "PyMysqlDriver", "PyMysqlExceptionHandler", "PyMysqlSessionContext")
40
+
41
+ logger = get_logger("sqlspec.adapters.pymysql")
42
+
43
+ json_type_value = FIELD_TYPE.JSON if supports_json_type(FIELD_TYPE) else None
44
+ PYMYSQL_JSON_TYPE_CODES: Final[set[int]] = {json_type_value} if json_type_value is not None else set()
45
+
46
+
47
+ class PyMysqlCursor:
48
+ """Context manager for PyMySQL cursor operations."""
49
+
50
+ __slots__ = ("connection", "cursor")
51
+
52
+ def __init__(self, connection: "PyMysqlConnection") -> None:
53
+ self.connection = connection
54
+ self.cursor: Any | None = None
55
+
56
+ def __enter__(self) -> Any:
57
+ self.cursor = self.connection.cursor(pymysql.cursors.DictCursor)
58
+ return self.cursor
59
+
60
+ def __exit__(self, *_: Any) -> None:
61
+ if self.cursor is not None:
62
+ self.cursor.close()
63
+
64
+
65
+ class PyMysqlExceptionHandler:
66
+ """Context manager for handling PyMySQL exceptions."""
67
+
68
+ __slots__ = ("pending_exception",)
69
+
70
+ def __init__(self) -> None:
71
+ self.pending_exception: Exception | None = None
72
+
73
+ def __enter__(self) -> "PyMysqlExceptionHandler":
74
+ return self
75
+
76
+ def __exit__(self, exc_type: Any, exc_val: Any, exc_tb: Any) -> bool:
77
+ if exc_type is None:
78
+ return False
79
+ if issubclass(exc_type, pymysql.MySQLError):
80
+ result = create_mapped_exception(exc_val, logger=logger)
81
+ if result is True:
82
+ return True
83
+ self.pending_exception = cast("Exception", result)
84
+ return True
85
+ return False
86
+
87
+
88
+ class PyMysqlDriver(SyncDriverAdapterBase):
89
+ """MySQL/MariaDB database driver using PyMySQL."""
90
+
91
+ __slots__ = ("_data_dictionary",)
92
+ dialect = "mysql"
93
+
94
+ def __init__(
95
+ self,
96
+ connection: "PyMysqlConnection",
97
+ statement_config: "StatementConfig | None" = None,
98
+ driver_features: "dict[str, Any] | None" = None,
99
+ ) -> None:
100
+ if statement_config is None:
101
+ statement_config = default_statement_config.replace(
102
+ enable_caching=get_cache_config().compiled_cache_enabled
103
+ )
104
+
105
+ super().__init__(connection=connection, statement_config=statement_config, driver_features=driver_features)
106
+ self._data_dictionary: PyMysqlDataDictionary | None = None
107
+
108
+ def dispatch_execute(self, cursor: Any, statement: "SQL") -> "ExecutionResult":
109
+ sql, prepared_parameters = self._get_compiled_sql(statement, self.statement_config)
110
+ cursor.execute(sql, normalize_execute_parameters(prepared_parameters))
111
+
112
+ if statement.returns_rows():
113
+ fetched_data = cursor.fetchall()
114
+ fetched_rows = list(fetched_data) if fetched_data else None
115
+ description = list(cursor.description) if cursor.description else None
116
+ json_indexes = detect_json_columns(cursor, PYMYSQL_JSON_TYPE_CODES)
117
+ deserializer = cast("Callable[[Any], Any]", self.driver_features.get("json_deserializer", from_json))
118
+ rows, column_names = collect_rows(fetched_rows, description, json_indexes, deserializer, logger=logger)
119
+
120
+ return self.create_execution_result(
121
+ cursor, selected_data=rows, column_names=column_names, data_row_count=len(rows), is_select_result=True
122
+ )
123
+
124
+ affected_rows = resolve_rowcount(cursor)
125
+ last_id = normalize_lastrowid(cursor)
126
+ return self.create_execution_result(cursor, rowcount_override=affected_rows, last_inserted_id=last_id)
127
+
128
+ def dispatch_execute_many(self, cursor: Any, statement: "SQL") -> "ExecutionResult":
129
+ sql, prepared_parameters = self._get_compiled_sql(statement, self.statement_config)
130
+
131
+ prepared_parameters = normalize_execute_many_parameters(prepared_parameters)
132
+ cursor.executemany(sql, prepared_parameters)
133
+
134
+ affected_rows = len(prepared_parameters)
135
+ return self.create_execution_result(cursor, rowcount_override=affected_rows, is_many_result=True)
136
+
137
+ def dispatch_execute_script(self, cursor: Any, statement: "SQL") -> "ExecutionResult":
138
+ sql, prepared_parameters = self._get_compiled_sql(statement, self.statement_config)
139
+ statements = self.split_script_statements(sql, statement.statement_config, strip_trailing_semicolon=True)
140
+
141
+ successful_count = 0
142
+ last_cursor = cursor
143
+
144
+ for stmt in statements:
145
+ cursor.execute(stmt, normalize_execute_parameters(prepared_parameters))
146
+ successful_count += 1
147
+
148
+ return self.create_execution_result(
149
+ last_cursor, statement_count=len(statements), successful_statements=successful_count, is_script_result=True
150
+ )
151
+
152
+ def begin(self) -> None:
153
+ try:
154
+ with PyMysqlCursor(self.connection) as cursor:
155
+ cursor.execute("BEGIN")
156
+ except pymysql.MySQLError as exc:
157
+ msg = f"Failed to begin MySQL transaction: {exc}"
158
+ raise SQLSpecError(msg) from exc
159
+
160
+ def commit(self) -> None:
161
+ try:
162
+ self.connection.commit()
163
+ except pymysql.MySQLError as exc:
164
+ msg = f"Failed to commit MySQL transaction: {exc}"
165
+ raise SQLSpecError(msg) from exc
166
+
167
+ def rollback(self) -> None:
168
+ try:
169
+ self.connection.rollback()
170
+ except pymysql.MySQLError as exc:
171
+ msg = f"Failed to rollback MySQL transaction: {exc}"
172
+ raise SQLSpecError(msg) from exc
173
+
174
+ def with_cursor(self, connection: "PyMysqlConnection") -> "PyMysqlCursor":
175
+ return PyMysqlCursor(connection)
176
+
177
+ def handle_database_exceptions(self) -> "PyMysqlExceptionHandler":
178
+ return PyMysqlExceptionHandler()
179
+
180
+ def select_to_storage(
181
+ self,
182
+ statement: "SQL | str",
183
+ destination: "StorageDestination",
184
+ /,
185
+ *parameters: Any,
186
+ statement_config: "StatementConfig | None" = None,
187
+ partitioner: "dict[str, object] | None" = None,
188
+ format_hint: "StorageFormat | None" = None,
189
+ telemetry: "StorageTelemetry | None" = None,
190
+ **kwargs: Any,
191
+ ) -> "StorageBridgeJob":
192
+ self._require_capability("arrow_export_enabled")
193
+ arrow_result = self.select_to_arrow(statement, *parameters, statement_config=statement_config, **kwargs)
194
+ pipeline = self._storage_pipeline()
195
+ telemetry_payload = self._write_result_to_storage_sync(
196
+ arrow_result, destination, format_hint=format_hint, pipeline=pipeline
197
+ )
198
+ self._attach_partition_telemetry(telemetry_payload, partitioner)
199
+ return self._create_storage_job(telemetry_payload, telemetry)
200
+
201
+ def load_from_arrow(
202
+ self,
203
+ table: str,
204
+ source: "ArrowResult | Any",
205
+ *,
206
+ partitioner: "dict[str, object] | None" = None,
207
+ overwrite: bool = False,
208
+ telemetry: "StorageTelemetry | None" = None,
209
+ ) -> "StorageBridgeJob":
210
+ self._require_capability("arrow_import_enabled")
211
+ arrow_table = self._coerce_arrow_table(source)
212
+ if overwrite:
213
+ statement = f"TRUNCATE TABLE {format_identifier(table)}"
214
+ with self.handle_database_exceptions(), self.with_cursor(self.connection) as cursor:
215
+ cursor.execute(statement)
216
+
217
+ columns, records = self._arrow_table_to_rows(arrow_table)
218
+ if records:
219
+ insert_sql = build_insert_statement(table, columns)
220
+ with self.handle_database_exceptions(), self.with_cursor(self.connection) as cursor:
221
+ cursor.executemany(insert_sql, records)
222
+
223
+ telemetry_payload = self._build_ingest_telemetry(arrow_table)
224
+ telemetry_payload["destination"] = table
225
+ self._attach_partition_telemetry(telemetry_payload, partitioner)
226
+ return self._create_storage_job(telemetry_payload, telemetry)
227
+
228
+ def load_from_storage(
229
+ self,
230
+ table: str,
231
+ source: "StorageDestination",
232
+ *,
233
+ file_format: "StorageFormat",
234
+ partitioner: "dict[str, object] | None" = None,
235
+ overwrite: bool = False,
236
+ ) -> "StorageBridgeJob":
237
+ arrow_table, inbound = self._read_arrow_from_storage_sync(source, file_format=file_format)
238
+ return self.load_from_arrow(table, arrow_table, partitioner=partitioner, overwrite=overwrite, telemetry=inbound)
239
+
240
+ @property
241
+ def data_dictionary(self) -> "PyMysqlDataDictionary":
242
+ if self._data_dictionary is None:
243
+ self._data_dictionary = PyMysqlDataDictionary()
244
+ return self._data_dictionary
245
+
246
+ def _connection_in_transaction(self) -> bool:
247
+ get_autocommit = getattr(self.connection, "get_autocommit", None)
248
+ if callable(get_autocommit):
249
+ return not bool(get_autocommit())
250
+ autocommit = getattr(self.connection, "autocommit", None)
251
+ if autocommit is not None:
252
+ try:
253
+ return not bool(autocommit)
254
+ except Exception:
255
+ return False
256
+ return False
257
+
258
+
259
+ register_driver_profile("pymysql", driver_profile)
@@ -0,0 +1,5 @@
1
+ """Events helpers for the PyMySQL adapter."""
2
+
3
+ from sqlspec.adapters.pymysql.events.store import PyMysqlEventQueueStore
4
+
5
+ __all__ = ("PyMysqlEventQueueStore",)
@@ -0,0 +1,50 @@
1
+ """PyMySQL event queue store with MySQL-specific DDL."""
2
+
3
+ from typing import Final
4
+
5
+ from sqlspec.adapters.pymysql.config import PyMysqlConfig
6
+ from sqlspec.extensions.events import BaseEventQueueStore
7
+
8
+ __all__ = ("PyMysqlEventQueueStore",)
9
+
10
+ SCHEMA_QUALIFIED_SEGMENTS: Final[int] = 2
11
+
12
+
13
+ class PyMysqlEventQueueStore(BaseEventQueueStore[PyMysqlConfig]):
14
+ """Queue DDL for PyMySQL configs."""
15
+
16
+ __slots__ = ()
17
+
18
+ def _column_types(self) -> "tuple[str, str, str]":
19
+ return "JSON", "JSON", "DATETIME(6)"
20
+
21
+ def _timestamp_default(self) -> str:
22
+ return "CURRENT_TIMESTAMP(6)"
23
+
24
+ def _build_index_sql(self) -> str | None:
25
+ table_name = self.table_name
26
+ segments = table_name.split(".", 1)
27
+
28
+ if len(segments) == SCHEMA_QUALIFIED_SEGMENTS:
29
+ schema = segments[0]
30
+ table = segments[1]
31
+ schema_selector = f"'{schema}'"
32
+ else:
33
+ table = segments[0]
34
+ schema_selector = "DATABASE()"
35
+
36
+ index_name = self._index_name()
37
+
38
+ return (
39
+ "SET @sqlspec_events_idx_exists := ("
40
+ "SELECT COUNT(1) FROM information_schema.statistics "
41
+ f"WHERE table_schema = {schema_selector} "
42
+ f"AND table_name = '{table}' "
43
+ f"AND index_name = '{index_name}');"
44
+ "SET @sqlspec_events_idx_stmt := IF(@sqlspec_events_idx_exists = 0, "
45
+ f"'ALTER TABLE {table_name} ADD INDEX {index_name} (channel, status, available_at)', "
46
+ "'SELECT 1');"
47
+ "PREPARE sqlspec_events_stmt FROM @sqlspec_events_idx_stmt;"
48
+ "EXECUTE sqlspec_events_stmt;"
49
+ "DEALLOCATE PREPARE sqlspec_events_stmt;"
50
+ )
@@ -0,0 +1,5 @@
1
+ """Litestar helpers for the PyMySQL adapter."""
2
+
3
+ from sqlspec.adapters.pymysql.litestar.store import PyMysqlStore
4
+
5
+ __all__ = ("PyMysqlStore",)
@@ -0,0 +1,232 @@
1
+ """PyMySQL session store for Litestar integration."""
2
+
3
+ from datetime import datetime, timedelta, timezone
4
+ from typing import TYPE_CHECKING, Final
5
+
6
+ import pymysql
7
+
8
+ from sqlspec.extensions.litestar.store import BaseSQLSpecStore
9
+ from sqlspec.utils.logging import get_logger
10
+ from sqlspec.utils.sync_tools import async_
11
+
12
+ if TYPE_CHECKING:
13
+ from sqlspec.adapters.pymysql.config import PyMysqlConfig
14
+
15
+ logger = get_logger("sqlspec.adapters.pymysql.litestar.store")
16
+
17
+ __all__ = ("PyMysqlStore",)
18
+
19
+ MYSQL_TABLE_NOT_FOUND_ERROR: Final = 1146
20
+
21
+
22
+ class PyMysqlStore(BaseSQLSpecStore["PyMysqlConfig"]):
23
+ """MySQL/MariaDB session store using PyMySQL sync driver."""
24
+
25
+ __slots__ = ()
26
+
27
+ def __init__(self, config: "PyMysqlConfig") -> None:
28
+ super().__init__(config)
29
+
30
+ def _get_create_table_sql(self) -> str:
31
+ return f"""
32
+ CREATE TABLE IF NOT EXISTS {self._table_name} (
33
+ session_id VARCHAR(255) PRIMARY KEY,
34
+ data LONGBLOB NOT NULL,
35
+ expires_at DATETIME(6),
36
+ created_at DATETIME(6) DEFAULT CURRENT_TIMESTAMP(6),
37
+ updated_at DATETIME(6) DEFAULT CURRENT_TIMESTAMP(6) ON UPDATE CURRENT_TIMESTAMP(6),
38
+ INDEX idx_{self._table_name}_expires_at (expires_at)
39
+ ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci
40
+ """
41
+
42
+ def _get_drop_table_sql(self) -> "list[str]":
43
+ return [
44
+ f"DROP INDEX idx_{self._table_name}_expires_at ON {self._table_name}",
45
+ f"DROP TABLE IF EXISTS {self._table_name}",
46
+ ]
47
+
48
+ def _create_table(self) -> None:
49
+ sql = self._get_create_table_sql()
50
+ with self._config.provide_session() as driver:
51
+ driver.execute_script(sql)
52
+ driver.commit()
53
+ self._log_table_created()
54
+
55
+ async def create_table(self) -> None:
56
+ await async_(self._create_table)()
57
+
58
+ def _get(self, key: str, renew_for: "int | timedelta | None" = None) -> "bytes | None":
59
+ sql = f"""
60
+ SELECT data, expires_at FROM {self._table_name}
61
+ WHERE session_id = %s
62
+ AND (expires_at IS NULL OR expires_at > UTC_TIMESTAMP(6))
63
+ """
64
+
65
+ try:
66
+ with self._config.provide_connection() as conn:
67
+ cursor = conn.cursor(pymysql.cursors.DictCursor)
68
+ try:
69
+ cursor.execute(sql, (key,))
70
+ row = cursor.fetchone()
71
+ finally:
72
+ cursor.close()
73
+
74
+ if row is None:
75
+ return None
76
+
77
+ if renew_for is not None and row["expires_at"] is not None:
78
+ new_expires_at = self._calculate_expires_at(renew_for)
79
+ if new_expires_at is not None:
80
+ naive_expires_at = new_expires_at.replace(tzinfo=None)
81
+ update_sql = f"""
82
+ UPDATE {self._table_name}
83
+ SET expires_at = %s, updated_at = UTC_TIMESTAMP(6)
84
+ WHERE session_id = %s
85
+ """
86
+ update_cursor = conn.cursor()
87
+ try:
88
+ update_cursor.execute(update_sql, (naive_expires_at, key))
89
+ finally:
90
+ update_cursor.close()
91
+ conn.commit()
92
+
93
+ return bytes(row["data"])
94
+ except pymysql.MySQLError as exc:
95
+ if "doesn't exist" in str(exc) or getattr(exc, "args", [None])[0] == MYSQL_TABLE_NOT_FOUND_ERROR:
96
+ return None
97
+ raise
98
+
99
+ async def get(self, key: str, renew_for: "int | timedelta | None" = None) -> "bytes | None":
100
+ return await async_(self._get)(key, renew_for)
101
+
102
+ def _set(self, key: str, value: "str | bytes", expires_in: "int | timedelta | None" = None) -> None:
103
+ data = self._value_to_bytes(value)
104
+ expires_at = self._calculate_expires_at(expires_in)
105
+ naive_expires_at = expires_at.replace(tzinfo=None) if expires_at else None
106
+
107
+ sql = f"""
108
+ INSERT INTO {self._table_name} (session_id, data, expires_at)
109
+ VALUES (%s, %s, %s) AS new
110
+ ON DUPLICATE KEY UPDATE
111
+ data = new.data,
112
+ expires_at = new.expires_at,
113
+ updated_at = UTC_TIMESTAMP(6)
114
+ """
115
+
116
+ with self._config.provide_connection() as conn:
117
+ cursor = conn.cursor()
118
+ try:
119
+ cursor.execute(sql, (key, data, naive_expires_at))
120
+ finally:
121
+ cursor.close()
122
+ conn.commit()
123
+
124
+ async def set(self, key: str, value: "str | bytes", expires_in: "int | timedelta | None" = None) -> None:
125
+ await async_(self._set)(key, value, expires_in)
126
+
127
+ def _delete(self, key: str) -> None:
128
+ sql = f"DELETE FROM {self._table_name} WHERE session_id = %s"
129
+
130
+ with self._config.provide_connection() as conn:
131
+ cursor = conn.cursor()
132
+ try:
133
+ cursor.execute(sql, (key,))
134
+ finally:
135
+ cursor.close()
136
+ conn.commit()
137
+
138
+ async def delete(self, key: str) -> None:
139
+ await async_(self._delete)(key)
140
+
141
+ def _delete_all(self) -> None:
142
+ sql = f"DELETE FROM {self._table_name}"
143
+
144
+ try:
145
+ with self._config.provide_connection() as conn:
146
+ cursor = conn.cursor()
147
+ try:
148
+ cursor.execute(sql)
149
+ finally:
150
+ cursor.close()
151
+ conn.commit()
152
+ self._log_delete_all()
153
+ except pymysql.MySQLError as exc:
154
+ if "doesn't exist" in str(exc) or getattr(exc, "args", [None])[0] == MYSQL_TABLE_NOT_FOUND_ERROR:
155
+ logger.debug("Table %s does not exist, skipping delete_all", self._table_name)
156
+ return
157
+ raise
158
+
159
+ async def delete_all(self) -> None:
160
+ await async_(self._delete_all)()
161
+
162
+ def _exists(self, key: str) -> bool:
163
+ sql = f"""
164
+ SELECT 1 FROM {self._table_name}
165
+ WHERE session_id = %s
166
+ AND (expires_at IS NULL OR expires_at > UTC_TIMESTAMP(6))
167
+ """
168
+
169
+ try:
170
+ with self._config.provide_connection() as conn:
171
+ cursor = conn.cursor()
172
+ try:
173
+ cursor.execute(sql, (key,))
174
+ result = cursor.fetchone()
175
+ finally:
176
+ cursor.close()
177
+ return result is not None
178
+ except pymysql.MySQLError as exc:
179
+ if "doesn't exist" in str(exc) or getattr(exc, "args", [None])[0] == MYSQL_TABLE_NOT_FOUND_ERROR:
180
+ return False
181
+ raise
182
+
183
+ async def exists(self, key: str) -> bool:
184
+ return await async_(self._exists)(key)
185
+
186
+ def _expires_in(self, key: str) -> "int | None":
187
+ sql = f"""
188
+ SELECT expires_at FROM {self._table_name}
189
+ WHERE session_id = %s
190
+ """
191
+
192
+ with self._config.provide_connection() as conn:
193
+ cursor = conn.cursor()
194
+ try:
195
+ cursor.execute(sql, (key,))
196
+ row = cursor.fetchone()
197
+ finally:
198
+ cursor.close()
199
+
200
+ if row is None or row[0] is None:
201
+ return None
202
+
203
+ expires_at_naive = row[0]
204
+ expires_at_utc = expires_at_naive.replace(tzinfo=timezone.utc)
205
+ now = datetime.now(timezone.utc)
206
+
207
+ if expires_at_utc <= now:
208
+ return 0
209
+
210
+ delta = expires_at_utc - now
211
+ return int(delta.total_seconds())
212
+
213
+ async def expires_in(self, key: str) -> "int | None":
214
+ return await async_(self._expires_in)(key)
215
+
216
+ def _delete_expired(self) -> int:
217
+ sql = f"DELETE FROM {self._table_name} WHERE expires_at <= UTC_TIMESTAMP(6)"
218
+
219
+ with self._config.provide_connection() as conn:
220
+ cursor = conn.cursor()
221
+ try:
222
+ cursor.execute(sql)
223
+ conn.commit()
224
+ count: int = cursor.rowcount
225
+ finally:
226
+ cursor.close()
227
+ if count > 0:
228
+ self._log_delete_expired(count)
229
+ return count
230
+
231
+ async def delete_expired(self) -> int:
232
+ return await async_(self._delete_expired)()
@@ -0,0 +1,137 @@
1
+ """PyMySQL database configuration with thread-local connections."""
2
+
3
+ import contextlib
4
+ import threading
5
+ import time
6
+ from contextlib import contextmanager
7
+ from typing import TYPE_CHECKING, Any, TypedDict, cast
8
+
9
+ import pymysql
10
+ from typing_extensions import NotRequired
11
+
12
+ from sqlspec.adapters.pymysql._typing import PyMysqlConnection
13
+ from sqlspec.utils.logging import get_logger
14
+
15
+ if TYPE_CHECKING:
16
+ from collections.abc import Generator
17
+
18
+
19
+ class PyMysqlConnectionParams(TypedDict):
20
+ """PyMySQL connection parameters."""
21
+
22
+ host: NotRequired[str]
23
+ user: NotRequired[str]
24
+ password: NotRequired[str]
25
+ database: NotRequired[str]
26
+ port: NotRequired[int]
27
+ unix_socket: NotRequired[str]
28
+ charset: NotRequired[str]
29
+ connect_timeout: NotRequired[int]
30
+ read_timeout: NotRequired[int]
31
+ write_timeout: NotRequired[int]
32
+ autocommit: NotRequired[bool]
33
+ ssl: NotRequired["dict[str, Any]"]
34
+ client_flag: NotRequired[int]
35
+ cursorclass: NotRequired[type]
36
+ init_command: NotRequired[str]
37
+ sql_mode: NotRequired[str]
38
+ extra: NotRequired["dict[str, Any]"]
39
+
40
+
41
+ __all__ = ("PyMysqlConnectionPool",)
42
+
43
+ logger = get_logger(__name__)
44
+
45
+
46
+ class PyMysqlConnectionPool:
47
+ """Thread-local connection manager for PyMySQL."""
48
+
49
+ __slots__ = ("_connection_parameters", "_health_check_interval", "_recycle_seconds", "_thread_local")
50
+
51
+ def __init__(
52
+ self, connection_parameters: "dict[str, Any]", recycle_seconds: int = 86400, health_check_interval: float = 30.0
53
+ ) -> None:
54
+ self._connection_parameters = connection_parameters
55
+ self._thread_local = threading.local()
56
+ self._recycle_seconds = recycle_seconds
57
+ self._health_check_interval = health_check_interval
58
+
59
+ def _create_connection(self) -> PyMysqlConnection:
60
+ connection = pymysql.connect(**self._connection_parameters)
61
+ return cast("PyMysqlConnection", connection)
62
+
63
+ def _is_connection_alive(self, connection: PyMysqlConnection) -> bool:
64
+ try:
65
+ connection.ping(reconnect=False)
66
+ except Exception:
67
+ return False
68
+ return True
69
+
70
+ def _get_thread_connection(self) -> PyMysqlConnection:
71
+ thread_state = self._thread_local.__dict__
72
+ if "connection" not in thread_state:
73
+ self._thread_local.connection = self._create_connection()
74
+ self._thread_local.created_at = time.time()
75
+ self._thread_local.last_used = time.time()
76
+ return cast("PyMysqlConnection", self._thread_local.connection)
77
+
78
+ if self._recycle_seconds > 0 and time.time() - self._thread_local.created_at > self._recycle_seconds:
79
+ logger.debug("PyMySQL connection exceeded recycle time, recreating")
80
+ with contextlib.suppress(Exception):
81
+ self._thread_local.connection.close()
82
+ self._thread_local.connection = self._create_connection()
83
+ self._thread_local.created_at = time.time()
84
+ self._thread_local.last_used = time.time()
85
+ return cast("PyMysqlConnection", self._thread_local.connection)
86
+
87
+ idle_time = time.time() - thread_state.get("last_used", 0)
88
+ if idle_time > self._health_check_interval and not self._is_connection_alive(self._thread_local.connection):
89
+ logger.debug("PyMySQL connection failed health check after %.1fs idle, recreating", idle_time)
90
+ with contextlib.suppress(Exception):
91
+ self._thread_local.connection.close()
92
+ self._thread_local.connection = self._create_connection()
93
+ self._thread_local.created_at = time.time()
94
+
95
+ self._thread_local.last_used = time.time()
96
+ return cast("PyMysqlConnection", self._thread_local.connection)
97
+
98
+ def _close_thread_connection(self) -> None:
99
+ thread_state = self._thread_local.__dict__
100
+ if "connection" in thread_state:
101
+ with contextlib.suppress(Exception):
102
+ self._thread_local.connection.close()
103
+ del self._thread_local.connection
104
+ if "created_at" in thread_state:
105
+ del self._thread_local.created_at
106
+ if "last_used" in thread_state:
107
+ del self._thread_local.last_used
108
+
109
+ @contextmanager
110
+ def get_connection(self) -> "Generator[PyMysqlConnection, None, None]":
111
+ connection = self._get_thread_connection()
112
+ try:
113
+ yield connection
114
+ finally:
115
+ with contextlib.suppress(Exception):
116
+ if connection.open and connection.get_autocommit() is False:
117
+ connection.commit()
118
+
119
+ def close(self) -> None:
120
+ self._close_thread_connection()
121
+
122
+ def acquire(self) -> PyMysqlConnection:
123
+ return self._get_thread_connection()
124
+
125
+ def release(self, connection: PyMysqlConnection) -> None:
126
+ _ = connection
127
+
128
+ def size(self) -> int:
129
+ try:
130
+ _ = self._thread_local.connection
131
+ except AttributeError:
132
+ return 0
133
+ else:
134
+ return 1
135
+
136
+ def checked_out(self) -> int:
137
+ return 0