sqlspec 0.10.0__tar.gz → 0.16.2__tar.gz

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.

Potentially problematic release.


This version of sqlspec might be problematic. Click here for more details.

Files changed (412) hide show
  1. {sqlspec-0.10.0 → sqlspec-0.16.2}/.gitignore +30 -0
  2. {sqlspec-0.10.0 → sqlspec-0.16.2}/.pre-commit-config.yaml +4 -4
  3. {sqlspec-0.10.0 → sqlspec-0.16.2}/CONTRIBUTING.rst +1 -1
  4. {sqlspec-0.10.0 → sqlspec-0.16.2}/Makefile +73 -0
  5. {sqlspec-0.10.0 → sqlspec-0.16.2}/PKG-INFO +109 -26
  6. {sqlspec-0.10.0 → sqlspec-0.16.2}/README.md +79 -23
  7. {sqlspec-0.10.0 → sqlspec-0.16.2}/pyproject.toml +157 -16
  8. sqlspec-0.16.2/sqlspec/__init__.py +92 -0
  9. sqlspec-0.16.2/sqlspec/__main__.py +12 -0
  10. {sqlspec-0.10.0 → sqlspec-0.16.2}/sqlspec/__metadata__.py +1 -3
  11. {sqlspec-0.10.0 → sqlspec-0.16.2}/sqlspec/_serialization.py +4 -12
  12. sqlspec-0.16.2/sqlspec/_sql.py +1782 -0
  13. sqlspec-0.16.2/sqlspec/_typing.py +680 -0
  14. sqlspec-0.16.2/sqlspec/adapters/adbc/__init__.py +5 -0
  15. sqlspec-0.16.2/sqlspec/adapters/adbc/_types.py +12 -0
  16. sqlspec-0.16.2/sqlspec/adapters/adbc/config.py +361 -0
  17. sqlspec-0.16.2/sqlspec/adapters/adbc/driver.py +512 -0
  18. sqlspec-0.16.2/sqlspec/adapters/aiosqlite/__init__.py +19 -0
  19. sqlspec-0.16.2/sqlspec/adapters/aiosqlite/_types.py +13 -0
  20. sqlspec-0.16.2/sqlspec/adapters/aiosqlite/config.py +253 -0
  21. sqlspec-0.16.2/sqlspec/adapters/aiosqlite/driver.py +248 -0
  22. sqlspec-0.16.2/sqlspec/adapters/asyncmy/__init__.py +19 -0
  23. sqlspec-0.16.2/sqlspec/adapters/asyncmy/_types.py +12 -0
  24. sqlspec-0.16.2/sqlspec/adapters/asyncmy/config.py +180 -0
  25. sqlspec-0.16.2/sqlspec/adapters/asyncmy/driver.py +274 -0
  26. sqlspec-0.16.2/sqlspec/adapters/asyncpg/__init__.py +21 -0
  27. sqlspec-0.16.2/sqlspec/adapters/asyncpg/_types.py +17 -0
  28. sqlspec-0.16.2/sqlspec/adapters/asyncpg/config.py +229 -0
  29. sqlspec-0.16.2/sqlspec/adapters/asyncpg/driver.py +344 -0
  30. sqlspec-0.16.2/sqlspec/adapters/bigquery/__init__.py +18 -0
  31. sqlspec-0.16.2/sqlspec/adapters/bigquery/_types.py +12 -0
  32. sqlspec-0.16.2/sqlspec/adapters/bigquery/config.py +298 -0
  33. sqlspec-0.16.2/sqlspec/adapters/bigquery/driver.py +558 -0
  34. sqlspec-0.16.2/sqlspec/adapters/duckdb/__init__.py +22 -0
  35. sqlspec-0.16.2/sqlspec/adapters/duckdb/_types.py +12 -0
  36. sqlspec-0.16.2/sqlspec/adapters/duckdb/config.py +504 -0
  37. sqlspec-0.16.2/sqlspec/adapters/duckdb/driver.py +368 -0
  38. sqlspec-0.16.2/sqlspec/adapters/oracledb/__init__.py +32 -0
  39. sqlspec-0.16.2/sqlspec/adapters/oracledb/_types.py +14 -0
  40. sqlspec-0.16.2/sqlspec/adapters/oracledb/config.py +317 -0
  41. sqlspec-0.16.2/sqlspec/adapters/oracledb/driver.py +538 -0
  42. sqlspec-0.16.2/sqlspec/adapters/psqlpy/__init__.py +16 -0
  43. sqlspec-0.16.2/sqlspec/adapters/psqlpy/_types.py +11 -0
  44. sqlspec-0.16.2/sqlspec/adapters/psqlpy/config.py +214 -0
  45. sqlspec-0.16.2/sqlspec/adapters/psqlpy/driver.py +530 -0
  46. sqlspec-0.16.2/sqlspec/adapters/psycopg/__init__.py +32 -0
  47. sqlspec-0.16.2/sqlspec/adapters/psycopg/_types.py +17 -0
  48. sqlspec-0.16.2/sqlspec/adapters/psycopg/config.py +426 -0
  49. sqlspec-0.16.2/sqlspec/adapters/psycopg/driver.py +796 -0
  50. sqlspec-0.16.2/sqlspec/adapters/sqlite/__init__.py +15 -0
  51. sqlspec-0.16.2/sqlspec/adapters/sqlite/_types.py +11 -0
  52. sqlspec-0.16.2/sqlspec/adapters/sqlite/config.py +240 -0
  53. sqlspec-0.16.2/sqlspec/adapters/sqlite/driver.py +294 -0
  54. sqlspec-0.16.2/sqlspec/base.py +571 -0
  55. sqlspec-0.16.2/sqlspec/builder/__init__.py +62 -0
  56. sqlspec-0.16.2/sqlspec/builder/_base.py +473 -0
  57. sqlspec-0.16.2/sqlspec/builder/_column.py +320 -0
  58. sqlspec-0.16.2/sqlspec/builder/_ddl.py +1346 -0
  59. sqlspec-0.16.2/sqlspec/builder/_ddl_utils.py +103 -0
  60. sqlspec-0.16.2/sqlspec/builder/_delete.py +76 -0
  61. sqlspec-0.16.2/sqlspec/builder/_insert.py +421 -0
  62. sqlspec-0.16.2/sqlspec/builder/_merge.py +71 -0
  63. sqlspec-0.16.2/sqlspec/builder/_parsing_utils.py +164 -0
  64. sqlspec-0.16.2/sqlspec/builder/_select.py +170 -0
  65. sqlspec-0.16.2/sqlspec/builder/_update.py +188 -0
  66. sqlspec-0.16.2/sqlspec/builder/mixins/__init__.py +55 -0
  67. sqlspec-0.16.2/sqlspec/builder/mixins/_cte_and_set_ops.py +222 -0
  68. sqlspec-0.16.2/sqlspec/builder/mixins/_delete_operations.py +41 -0
  69. sqlspec-0.16.2/sqlspec/builder/mixins/_insert_operations.py +244 -0
  70. sqlspec-0.16.2/sqlspec/builder/mixins/_join_operations.py +149 -0
  71. sqlspec-0.16.2/sqlspec/builder/mixins/_merge_operations.py +562 -0
  72. sqlspec-0.16.2/sqlspec/builder/mixins/_order_limit_operations.py +135 -0
  73. sqlspec-0.16.2/sqlspec/builder/mixins/_pivot_operations.py +153 -0
  74. sqlspec-0.16.2/sqlspec/builder/mixins/_select_operations.py +604 -0
  75. sqlspec-0.16.2/sqlspec/builder/mixins/_update_operations.py +202 -0
  76. sqlspec-0.16.2/sqlspec/builder/mixins/_where_clause.py +644 -0
  77. sqlspec-0.16.2/sqlspec/cli.py +247 -0
  78. sqlspec-0.16.2/sqlspec/config.py +395 -0
  79. sqlspec-0.16.2/sqlspec/core/__init__.py +63 -0
  80. sqlspec-0.16.2/sqlspec/core/cache.py +871 -0
  81. sqlspec-0.16.2/sqlspec/core/compiler.py +417 -0
  82. sqlspec-0.16.2/sqlspec/core/filters.py +830 -0
  83. sqlspec-0.16.2/sqlspec/core/hashing.py +310 -0
  84. sqlspec-0.16.2/sqlspec/core/parameters.py +1237 -0
  85. sqlspec-0.16.2/sqlspec/core/result.py +677 -0
  86. sqlspec-0.16.2/sqlspec/core/splitter.py +819 -0
  87. sqlspec-0.16.2/sqlspec/core/statement.py +676 -0
  88. sqlspec-0.16.2/sqlspec/driver/__init__.py +19 -0
  89. sqlspec-0.16.2/sqlspec/driver/_async.py +502 -0
  90. sqlspec-0.16.2/sqlspec/driver/_common.py +631 -0
  91. sqlspec-0.16.2/sqlspec/driver/_sync.py +503 -0
  92. sqlspec-0.16.2/sqlspec/driver/mixins/__init__.py +6 -0
  93. sqlspec-0.16.2/sqlspec/driver/mixins/_result_tools.py +193 -0
  94. sqlspec-0.16.2/sqlspec/driver/mixins/_sql_translator.py +86 -0
  95. sqlspec-0.16.2/sqlspec/exceptions.py +193 -0
  96. sqlspec-0.16.2/sqlspec/extensions/aiosql/__init__.py +10 -0
  97. sqlspec-0.16.2/sqlspec/extensions/aiosql/adapter.py +461 -0
  98. sqlspec-0.16.2/sqlspec/extensions/litestar/__init__.py +6 -0
  99. {sqlspec-0.10.0 → sqlspec-0.16.2}/sqlspec/extensions/litestar/_utils.py +1 -5
  100. sqlspec-0.16.2/sqlspec/extensions/litestar/cli.py +48 -0
  101. {sqlspec-0.10.0 → sqlspec-0.16.2}/sqlspec/extensions/litestar/config.py +27 -14
  102. sqlspec-0.16.2/sqlspec/extensions/litestar/handlers.py +260 -0
  103. {sqlspec-0.10.0 → sqlspec-0.16.2}/sqlspec/extensions/litestar/plugin.py +45 -44
  104. sqlspec-0.16.2/sqlspec/extensions/litestar/providers.py +454 -0
  105. sqlspec-0.16.2/sqlspec/loader.py +760 -0
  106. sqlspec-0.16.2/sqlspec/migrations/__init__.py +35 -0
  107. sqlspec-0.16.2/sqlspec/migrations/base.py +414 -0
  108. sqlspec-0.16.2/sqlspec/migrations/commands.py +443 -0
  109. sqlspec-0.16.2/sqlspec/migrations/loaders.py +402 -0
  110. sqlspec-0.16.2/sqlspec/migrations/runner.py +213 -0
  111. sqlspec-0.16.2/sqlspec/migrations/tracker.py +140 -0
  112. sqlspec-0.16.2/sqlspec/migrations/utils.py +129 -0
  113. sqlspec-0.16.2/sqlspec/protocols.py +407 -0
  114. sqlspec-0.16.2/sqlspec/storage/__init__.py +23 -0
  115. sqlspec-0.16.2/sqlspec/storage/backends/base.py +163 -0
  116. sqlspec-0.16.2/sqlspec/storage/backends/fsspec.py +386 -0
  117. sqlspec-0.16.2/sqlspec/storage/backends/obstore.py +459 -0
  118. sqlspec-0.16.2/sqlspec/storage/capabilities.py +102 -0
  119. sqlspec-0.16.2/sqlspec/storage/registry.py +239 -0
  120. sqlspec-0.16.2/sqlspec/typing.py +299 -0
  121. sqlspec-0.16.2/sqlspec/utils/__init__.py +3 -0
  122. sqlspec-0.16.2/sqlspec/utils/correlation.py +150 -0
  123. {sqlspec-0.10.0 → sqlspec-0.16.2}/sqlspec/utils/deprecation.py +9 -12
  124. {sqlspec-0.10.0 → sqlspec-0.16.2}/sqlspec/utils/fixtures.py +12 -17
  125. sqlspec-0.16.2/sqlspec/utils/logging.py +127 -0
  126. sqlspec-0.16.2/sqlspec/utils/module_loader.py +89 -0
  127. sqlspec-0.16.2/sqlspec/utils/serializers.py +4 -0
  128. sqlspec-0.16.2/sqlspec/utils/singleton.py +32 -0
  129. sqlspec-0.16.2/sqlspec/utils/sync_tools.py +237 -0
  130. sqlspec-0.16.2/sqlspec/utils/text.py +96 -0
  131. sqlspec-0.16.2/sqlspec/utils/type_guards.py +1139 -0
  132. {sqlspec-0.10.0 → sqlspec-0.16.2}/tests/conftest.py +11 -0
  133. sqlspec-0.16.2/tests/fixtures/ddls-mysql-collection.sql +257 -0
  134. sqlspec-0.16.2/tests/fixtures/ddls-postgres-collection.sql +913 -0
  135. {sqlspec-0.10.0 → sqlspec-0.16.2}/tests/fixtures/example_usage.py +16 -16
  136. sqlspec-0.16.2/tests/fixtures/init.sql +25 -0
  137. sqlspec-0.16.2/tests/fixtures/mysql/collection-config.sql +570 -0
  138. sqlspec-0.16.2/tests/fixtures/mysql/collection-data_types.sql +42 -0
  139. sqlspec-0.16.2/tests/fixtures/mysql/collection-database_details.sql +182 -0
  140. sqlspec-0.16.2/tests/fixtures/mysql/collection-engines.sql +34 -0
  141. sqlspec-0.16.2/tests/fixtures/mysql/collection-hostname.sql +17 -0
  142. sqlspec-0.16.2/tests/fixtures/mysql/collection-plugins.sql +44 -0
  143. sqlspec-0.16.2/tests/fixtures/mysql/collection-process_list.sql +38 -0
  144. sqlspec-0.16.2/tests/fixtures/mysql/collection-resource-groups.sql +50 -0
  145. sqlspec-0.16.2/tests/fixtures/mysql/collection-schema_objects.sql +197 -0
  146. sqlspec-0.16.2/tests/fixtures/mysql/collection-table_details.sql +134 -0
  147. sqlspec-0.16.2/tests/fixtures/mysql/collection-users.sql +52 -0
  148. sqlspec-0.16.2/tests/fixtures/mysql/init.sql +39 -0
  149. sqlspec-0.16.2/tests/fixtures/oracle.ddl.sql +206 -0
  150. sqlspec-0.16.2/tests/fixtures/postgres/collection-applications.sql +26 -0
  151. sqlspec-0.16.2/tests/fixtures/postgres/collection-aws_extension_dependency.sql +406 -0
  152. sqlspec-0.16.2/tests/fixtures/postgres/collection-aws_oracle_exists.sql +25 -0
  153. sqlspec-0.16.2/tests/fixtures/postgres/collection-bg_writer_stats.sql +63 -0
  154. sqlspec-0.16.2/tests/fixtures/postgres/collection-calculated_metrics.sql +245 -0
  155. sqlspec-0.16.2/tests/fixtures/postgres/collection-data_types.sql +72 -0
  156. sqlspec-0.16.2/tests/fixtures/postgres/collection-database_details.sql +386 -0
  157. sqlspec-0.16.2/tests/fixtures/postgres/collection-extensions.sql +41 -0
  158. sqlspec-0.16.2/tests/fixtures/postgres/collection-index_details.sql +75 -0
  159. sqlspec-0.16.2/tests/fixtures/postgres/collection-pglogical-details.sql +28 -0
  160. sqlspec-0.16.2/tests/fixtures/postgres/collection-privileges.sql +152 -0
  161. sqlspec-0.16.2/tests/fixtures/postgres/collection-replication_slots.sql +131 -0
  162. sqlspec-0.16.2/tests/fixtures/postgres/collection-replication_stats.sql +63 -0
  163. sqlspec-0.16.2/tests/fixtures/postgres/collection-schema_details.sql +77 -0
  164. sqlspec-0.16.2/tests/fixtures/postgres/collection-schema_objects.sql +205 -0
  165. sqlspec-0.16.2/tests/fixtures/postgres/collection-settings.sql +56 -0
  166. sqlspec-0.16.2/tests/fixtures/postgres/collection-source_details.sql +63 -0
  167. sqlspec-0.16.2/tests/fixtures/postgres/collection-table_details.sql +496 -0
  168. sqlspec-0.16.2/tests/fixtures/postgres/extended-collection-all-databases.sql +36 -0
  169. sqlspec-0.16.2/tests/fixtures/postgres/init.sql +24 -0
  170. sqlspec-0.16.2/tests/fixtures/readiness-check.sql +35 -0
  171. {sqlspec-0.10.0 → sqlspec-0.16.2}/tests/fixtures/sql_utils.py +5 -5
  172. sqlspec-0.16.2/tests/integration/__init__.py +1 -0
  173. sqlspec-0.16.2/tests/integration/conftest.py +39 -0
  174. sqlspec-0.16.2/tests/integration/test_adapters/__init__.py +1 -0
  175. sqlspec-0.16.2/tests/integration/test_adapters/test_adbc/__init__.py +1 -0
  176. {sqlspec-0.10.0 → sqlspec-0.16.2}/tests/integration/test_adapters/test_adbc/conftest.py +7 -6
  177. sqlspec-0.16.2/tests/integration/test_adapters/test_adbc/test_adbc_arrow_features.py +404 -0
  178. sqlspec-0.16.2/tests/integration/test_adapters/test_adbc/test_adbc_backends.py +254 -0
  179. sqlspec-0.16.2/tests/integration/test_adapters/test_adbc/test_adbc_connection.py +190 -0
  180. sqlspec-0.16.2/tests/integration/test_adapters/test_adbc/test_adbc_driver.py +424 -0
  181. sqlspec-0.16.2/tests/integration/test_adapters/test_adbc/test_adbc_edge_cases.py +537 -0
  182. sqlspec-0.16.2/tests/integration/test_adapters/test_adbc/test_adbc_results.py +398 -0
  183. sqlspec-0.16.2/tests/integration/test_adapters/test_aiosqlite/__init__.py +1 -0
  184. sqlspec-0.16.2/tests/integration/test_adapters/test_aiosqlite/conftest.py +61 -0
  185. sqlspec-0.16.2/tests/integration/test_adapters/test_aiosqlite/test_connection.py +301 -0
  186. sqlspec-0.16.2/tests/integration/test_adapters/test_aiosqlite/test_driver.py +487 -0
  187. sqlspec-0.16.2/tests/integration/test_adapters/test_aiosqlite/test_pooling.py +212 -0
  188. sqlspec-0.16.2/tests/integration/test_adapters/test_asyncmy/conftest.py +65 -0
  189. sqlspec-0.16.2/tests/integration/test_adapters/test_asyncmy/test_asyncmy_features.py +335 -0
  190. sqlspec-0.16.2/tests/integration/test_adapters/test_asyncmy/test_config.py +144 -0
  191. sqlspec-0.16.2/tests/integration/test_adapters/test_asyncmy/test_driver.py +429 -0
  192. sqlspec-0.16.2/tests/integration/test_adapters/test_asyncmy/test_parameter_styles.py +372 -0
  193. sqlspec-0.16.2/tests/integration/test_adapters/test_asyncpg/__init__.py +1 -0
  194. sqlspec-0.16.2/tests/integration/test_adapters/test_asyncpg/conftest.py +55 -0
  195. {sqlspec-0.10.0 → sqlspec-0.16.2}/tests/integration/test_adapters/test_asyncpg/test_connection.py +12 -9
  196. sqlspec-0.16.2/tests/integration/test_adapters/test_asyncpg/test_driver.py +711 -0
  197. sqlspec-0.16.2/tests/integration/test_adapters/test_asyncpg/test_execute_many.py +329 -0
  198. sqlspec-0.16.2/tests/integration/test_adapters/test_asyncpg/test_parameter_styles.py +419 -0
  199. sqlspec-0.16.2/tests/integration/test_adapters/test_bigquery/__init__.py +1 -0
  200. sqlspec-0.16.2/tests/integration/test_adapters/test_bigquery/conftest.py +75 -0
  201. sqlspec-0.16.2/tests/integration/test_adapters/test_bigquery/test_bigquery_features.py +363 -0
  202. sqlspec-0.16.2/tests/integration/test_adapters/test_bigquery/test_config.py +151 -0
  203. sqlspec-0.16.2/tests/integration/test_adapters/test_bigquery/test_connection.py +17 -0
  204. sqlspec-0.16.2/tests/integration/test_adapters/test_bigquery/test_driver.py +506 -0
  205. sqlspec-0.16.2/tests/integration/test_adapters/test_bigquery/test_parameter_styles.py +193 -0
  206. sqlspec-0.16.2/tests/integration/test_adapters/test_duckdb/test_connection.py +377 -0
  207. sqlspec-0.16.2/tests/integration/test_adapters/test_duckdb/test_driver.py +561 -0
  208. sqlspec-0.16.2/tests/integration/test_adapters/test_duckdb/test_execute_many.py +314 -0
  209. sqlspec-0.16.2/tests/integration/test_adapters/test_duckdb/test_mixed_parameter_styles.py +164 -0
  210. sqlspec-0.16.2/tests/integration/test_adapters/test_duckdb/test_parameter_styles.py +520 -0
  211. sqlspec-0.16.2/tests/integration/test_adapters/test_duckdb/test_pooling.py +156 -0
  212. sqlspec-0.16.2/tests/integration/test_adapters/test_duckdb/utils.py +40 -0
  213. sqlspec-0.16.2/tests/integration/test_adapters/test_oracledb/conftest.py +52 -0
  214. sqlspec-0.16.2/tests/integration/test_adapters/test_oracledb/test_connection.py +108 -0
  215. sqlspec-0.16.2/tests/integration/test_adapters/test_oracledb/test_driver_async.py +319 -0
  216. sqlspec-0.16.2/tests/integration/test_adapters/test_oracledb/test_driver_sync.py +314 -0
  217. sqlspec-0.16.2/tests/integration/test_adapters/test_oracledb/test_execute_many.py +365 -0
  218. sqlspec-0.16.2/tests/integration/test_adapters/test_oracledb/test_oracle_features.py +404 -0
  219. sqlspec-0.16.2/tests/integration/test_adapters/test_oracledb/test_parameter_styles.py +347 -0
  220. sqlspec-0.16.2/tests/integration/test_adapters/test_psqlpy/__init__.py +1 -0
  221. sqlspec-0.16.2/tests/integration/test_adapters/test_psqlpy/conftest.py +47 -0
  222. sqlspec-0.16.2/tests/integration/test_adapters/test_psqlpy/test_connection.py +137 -0
  223. sqlspec-0.16.2/tests/integration/test_adapters/test_psqlpy/test_driver.py +468 -0
  224. sqlspec-0.16.2/tests/integration/test_adapters/test_psqlpy/test_parameter_styles.py +242 -0
  225. sqlspec-0.16.2/tests/integration/test_adapters/test_psqlpy/test_psqlpy_features.py +250 -0
  226. sqlspec-0.16.2/tests/integration/test_adapters/test_psycopg/__init__.py +3 -0
  227. sqlspec-0.16.2/tests/integration/test_adapters/test_psycopg/conftest.py +53 -0
  228. sqlspec-0.16.2/tests/integration/test_adapters/test_psycopg/test_async_copy.py +173 -0
  229. sqlspec-0.16.2/tests/integration/test_adapters/test_psycopg/test_connection.py +90 -0
  230. sqlspec-0.16.2/tests/integration/test_adapters/test_psycopg/test_driver.py +624 -0
  231. sqlspec-0.16.2/tests/integration/test_adapters/test_psycopg/test_execute_many.py +364 -0
  232. sqlspec-0.16.2/tests/integration/test_adapters/test_psycopg/test_parameter_styles.py +538 -0
  233. sqlspec-0.16.2/tests/integration/test_adapters/test_sqlite/__init__.py +1 -0
  234. sqlspec-0.16.2/tests/integration/test_adapters/test_sqlite/conftest.py +121 -0
  235. sqlspec-0.16.2/tests/integration/test_adapters/test_sqlite/test_driver.py +527 -0
  236. sqlspec-0.16.2/tests/integration/test_adapters/test_sqlite/test_parameter_styles.py +229 -0
  237. sqlspec-0.16.2/tests/integration/test_adapters/test_sqlite/test_pooling.py +323 -0
  238. sqlspec-0.16.2/tests/integration/test_adapters/test_sqlite/test_query_mixin.py +221 -0
  239. sqlspec-0.16.2/tests/integration/test_loader/__init__.py +5 -0
  240. sqlspec-0.16.2/tests/integration/test_loader/test_file_system_loading.py +752 -0
  241. sqlspec-0.16.2/tests/integration/test_migrations/__init__.py +5 -0
  242. sqlspec-0.16.2/tests/integration/test_migrations/test_migration_execution.py +660 -0
  243. sqlspec-0.16.2/tests/unit/conftest.py +1017 -0
  244. sqlspec-0.16.2/tests/unit/test_adapters/__init__.py +3 -0
  245. sqlspec-0.16.2/tests/unit/test_adapters/conftest.py +446 -0
  246. sqlspec-0.16.2/tests/unit/test_adapters/test_adapter_implementations.py +477 -0
  247. sqlspec-0.16.2/tests/unit/test_adapters/test_async_adapters.py +615 -0
  248. sqlspec-0.16.2/tests/unit/test_adapters/test_sync_adapters.py +490 -0
  249. sqlspec-0.16.2/tests/unit/test_base/__init__.py +1 -0
  250. sqlspec-0.16.2/tests/unit/test_base/test_sqlspec_class.py +669 -0
  251. sqlspec-0.16.2/tests/unit/test_builder/__init__.py +1 -0
  252. sqlspec-0.16.2/tests/unit/test_builder/test_insert_builder.py +321 -0
  253. sqlspec-0.16.2/tests/unit/test_builder/test_parameter_naming.py +392 -0
  254. sqlspec-0.16.2/tests/unit/test_builder_parameter_naming.py +213 -0
  255. sqlspec-0.16.2/tests/unit/test_core/test_cache.py +1031 -0
  256. sqlspec-0.16.2/tests/unit/test_core/test_compiler.py +861 -0
  257. sqlspec-0.16.2/tests/unit/test_core/test_filters.py +354 -0
  258. sqlspec-0.16.2/tests/unit/test_core/test_hashing.py +577 -0
  259. sqlspec-0.16.2/tests/unit/test_core/test_parameters.py +1181 -0
  260. sqlspec-0.16.2/tests/unit/test_core/test_result.py +151 -0
  261. sqlspec-0.16.2/tests/unit/test_core/test_statement.py +1146 -0
  262. sqlspec-0.16.2/tests/unit/test_loader/__init__.py +5 -0
  263. sqlspec-0.16.2/tests/unit/test_loader/test_cache_integration.py +682 -0
  264. sqlspec-0.16.2/tests/unit/test_loader/test_loading_patterns.py +888 -0
  265. sqlspec-0.16.2/tests/unit/test_loader/test_sql_file_loader.py +962 -0
  266. sqlspec-0.16.2/tests/unit/test_migrations/__init__.py +10 -0
  267. sqlspec-0.16.2/tests/unit/test_migrations/test_migration.py +763 -0
  268. sqlspec-0.16.2/tests/unit/test_migrations/test_migration_execution.py +671 -0
  269. sqlspec-0.16.2/tests/unit/test_migrations/test_migration_runner.py +587 -0
  270. sqlspec-0.16.2/tests/unit/test_sql_factory.py +1523 -0
  271. sqlspec-0.16.2/tests/unit/test_utils/__init__.py +1 -0
  272. sqlspec-0.16.2/tests/unit/test_utils/test_correlation.py +508 -0
  273. sqlspec-0.16.2/tests/unit/test_utils/test_deprecation.py +151 -0
  274. sqlspec-0.16.2/tests/unit/test_utils/test_fixtures.py +74 -0
  275. sqlspec-0.16.2/tests/unit/test_utils/test_logging.py +702 -0
  276. sqlspec-0.16.2/tests/unit/test_utils/test_module_loader.py +100 -0
  277. sqlspec-0.16.2/tests/unit/test_utils/test_serializers.py +487 -0
  278. sqlspec-0.16.2/tests/unit/test_utils/test_singleton.py +98 -0
  279. sqlspec-0.16.2/tests/unit/test_utils/test_sync_tools.py +400 -0
  280. sqlspec-0.16.2/tests/unit/test_utils/test_text.py +316 -0
  281. sqlspec-0.16.2/tests/unit/test_utils/test_type_guards.py +933 -0
  282. sqlspec-0.16.2/tools/local-infra.sh +686 -0
  283. {sqlspec-0.10.0 → sqlspec-0.16.2}/tools/sphinx_ext/changelog.py +2 -7
  284. sqlspec-0.16.2/tools/sphinx_ext/missing_references.py +382 -0
  285. sqlspec-0.16.2/uv.lock +6084 -0
  286. sqlspec-0.10.0/sqlspec/__init__.py +0 -16
  287. sqlspec-0.10.0/sqlspec/_typing.py +0 -250
  288. sqlspec-0.10.0/sqlspec/adapters/adbc/__init__.py +0 -8
  289. sqlspec-0.10.0/sqlspec/adapters/adbc/config.py +0 -207
  290. sqlspec-0.10.0/sqlspec/adapters/adbc/driver.py +0 -531
  291. sqlspec-0.10.0/sqlspec/adapters/aiosqlite/__init__.py +0 -8
  292. sqlspec-0.10.0/sqlspec/adapters/aiosqlite/config.py +0 -102
  293. sqlspec-0.10.0/sqlspec/adapters/aiosqlite/driver.py +0 -402
  294. sqlspec-0.10.0/sqlspec/adapters/asyncmy/__init__.py +0 -9
  295. sqlspec-0.10.0/sqlspec/adapters/asyncmy/config.py +0 -241
  296. sqlspec-0.10.0/sqlspec/adapters/asyncmy/driver.py +0 -382
  297. sqlspec-0.10.0/sqlspec/adapters/asyncpg/__init__.py +0 -9
  298. sqlspec-0.10.0/sqlspec/adapters/asyncpg/config.py +0 -219
  299. sqlspec-0.10.0/sqlspec/adapters/asyncpg/driver.py +0 -582
  300. sqlspec-0.10.0/sqlspec/adapters/bigquery/__init__.py +0 -4
  301. sqlspec-0.10.0/sqlspec/adapters/bigquery/config/__init__.py +0 -3
  302. sqlspec-0.10.0/sqlspec/adapters/bigquery/config/_common.py +0 -40
  303. sqlspec-0.10.0/sqlspec/adapters/bigquery/config/_sync.py +0 -87
  304. sqlspec-0.10.0/sqlspec/adapters/bigquery/driver.py +0 -701
  305. sqlspec-0.10.0/sqlspec/adapters/duckdb/__init__.py +0 -8
  306. sqlspec-0.10.0/sqlspec/adapters/duckdb/config.py +0 -379
  307. sqlspec-0.10.0/sqlspec/adapters/duckdb/driver.py +0 -363
  308. sqlspec-0.10.0/sqlspec/adapters/oracledb/__init__.py +0 -23
  309. sqlspec-0.10.0/sqlspec/adapters/oracledb/config/__init__.py +0 -9
  310. sqlspec-0.10.0/sqlspec/adapters/oracledb/config/_asyncio.py +0 -186
  311. sqlspec-0.10.0/sqlspec/adapters/oracledb/config/_common.py +0 -131
  312. sqlspec-0.10.0/sqlspec/adapters/oracledb/config/_sync.py +0 -186
  313. sqlspec-0.10.0/sqlspec/adapters/oracledb/driver.py +0 -840
  314. sqlspec-0.10.0/sqlspec/adapters/psqlpy/__init__.py +0 -9
  315. sqlspec-0.10.0/sqlspec/adapters/psqlpy/config.py +0 -250
  316. sqlspec-0.10.0/sqlspec/adapters/psqlpy/driver.py +0 -487
  317. sqlspec-0.10.0/sqlspec/adapters/psycopg/__init__.py +0 -23
  318. sqlspec-0.10.0/sqlspec/adapters/psycopg/config/__init__.py +0 -19
  319. sqlspec-0.10.0/sqlspec/adapters/psycopg/config/_async.py +0 -169
  320. sqlspec-0.10.0/sqlspec/adapters/psycopg/config/_common.py +0 -56
  321. sqlspec-0.10.0/sqlspec/adapters/psycopg/config/_sync.py +0 -168
  322. sqlspec-0.10.0/sqlspec/adapters/psycopg/driver.py +0 -836
  323. sqlspec-0.10.0/sqlspec/adapters/sqlite/__init__.py +0 -8
  324. sqlspec-0.10.0/sqlspec/adapters/sqlite/config.py +0 -109
  325. sqlspec-0.10.0/sqlspec/adapters/sqlite/driver.py +0 -414
  326. sqlspec-0.10.0/sqlspec/base.py +0 -1068
  327. sqlspec-0.10.0/sqlspec/exceptions.py +0 -140
  328. sqlspec-0.10.0/sqlspec/extensions/litestar/__init__.py +0 -19
  329. sqlspec-0.10.0/sqlspec/extensions/litestar/handlers.py +0 -214
  330. sqlspec-0.10.0/sqlspec/filters.py +0 -127
  331. sqlspec-0.10.0/sqlspec/mixins.py +0 -156
  332. sqlspec-0.10.0/sqlspec/statement.py +0 -373
  333. sqlspec-0.10.0/sqlspec/typing.py +0 -568
  334. sqlspec-0.10.0/sqlspec/utils/__init__.py +0 -3
  335. sqlspec-0.10.0/sqlspec/utils/module_loader.py +0 -92
  336. sqlspec-0.10.0/sqlspec/utils/sync_tools.py +0 -335
  337. sqlspec-0.10.0/sqlspec/utils/text.py +0 -45
  338. sqlspec-0.10.0/tests/integration/__init__.py +0 -3
  339. sqlspec-0.10.0/tests/integration/test_adapters/__init__.py +0 -1
  340. sqlspec-0.10.0/tests/integration/test_adapters/test_adbc/__init__.py +0 -5
  341. sqlspec-0.10.0/tests/integration/test_adapters/test_adbc/test_connection.py +0 -31
  342. sqlspec-0.10.0/tests/integration/test_adapters/test_adbc/test_driver_bigquery.py +0 -227
  343. sqlspec-0.10.0/tests/integration/test_adapters/test_adbc/test_driver_duckdb.py +0 -444
  344. sqlspec-0.10.0/tests/integration/test_adapters/test_adbc/test_driver_postgres.py +0 -201
  345. sqlspec-0.10.0/tests/integration/test_adapters/test_adbc/test_driver_sqlite.py +0 -310
  346. sqlspec-0.10.0/tests/integration/test_adapters/test_aiosqlite/__init__.py +0 -5
  347. sqlspec-0.10.0/tests/integration/test_adapters/test_aiosqlite/test_connection.py +0 -28
  348. sqlspec-0.10.0/tests/integration/test_adapters/test_aiosqlite/test_driver.py +0 -168
  349. sqlspec-0.10.0/tests/integration/test_adapters/test_asyncmy/test_connection.py +0 -54
  350. sqlspec-0.10.0/tests/integration/test_adapters/test_asyncmy/test_driver.py +0 -218
  351. sqlspec-0.10.0/tests/integration/test_adapters/test_asyncpg/test_driver.py +0 -275
  352. sqlspec-0.10.0/tests/integration/test_adapters/test_bigquery/conftest.py +0 -31
  353. sqlspec-0.10.0/tests/integration/test_adapters/test_bigquery/test_connection.py +0 -14
  354. sqlspec-0.10.0/tests/integration/test_adapters/test_bigquery/test_driver.py +0 -288
  355. sqlspec-0.10.0/tests/integration/test_adapters/test_duckdb/test_connection.py +0 -28
  356. sqlspec-0.10.0/tests/integration/test_adapters/test_duckdb/test_driver.py +0 -169
  357. sqlspec-0.10.0/tests/integration/test_adapters/test_oracledb/test_connection.py +0 -106
  358. sqlspec-0.10.0/tests/integration/test_adapters/test_oracledb/test_driver_async.py +0 -201
  359. sqlspec-0.10.0/tests/integration/test_adapters/test_oracledb/test_driver_sync.py +0 -185
  360. sqlspec-0.10.0/tests/integration/test_adapters/test_psqlpy/__init__.py +0 -0
  361. sqlspec-0.10.0/tests/integration/test_adapters/test_psqlpy/test_connection.py +0 -66
  362. sqlspec-0.10.0/tests/integration/test_adapters/test_psqlpy/test_driver.py +0 -191
  363. sqlspec-0.10.0/tests/integration/test_adapters/test_psycopg/__init__.py +0 -5
  364. sqlspec-0.10.0/tests/integration/test_adapters/test_psycopg/test_connection.py +0 -81
  365. sqlspec-0.10.0/tests/integration/test_adapters/test_psycopg/test_driver.py +0 -408
  366. sqlspec-0.10.0/tests/integration/test_adapters/test_sqlite/__init__.py +0 -5
  367. sqlspec-0.10.0/tests/integration/test_adapters/test_sqlite/test_connection.py +0 -27
  368. sqlspec-0.10.0/tests/integration/test_adapters/test_sqlite/test_driver.py +0 -178
  369. sqlspec-0.10.0/tests/unit/__init__.py +0 -0
  370. sqlspec-0.10.0/tests/unit/test_adapters/__init__.py +0 -0
  371. sqlspec-0.10.0/tests/unit/test_adapters/test_adbc/__init__.py +0 -1
  372. sqlspec-0.10.0/tests/unit/test_adapters/test_adbc/test_config.py +0 -91
  373. sqlspec-0.10.0/tests/unit/test_adapters/test_aiosqlite/__init__.py +0 -1
  374. sqlspec-0.10.0/tests/unit/test_adapters/test_aiosqlite/test_config.py +0 -107
  375. sqlspec-0.10.0/tests/unit/test_adapters/test_asyncmy/__init__.py +0 -1
  376. sqlspec-0.10.0/tests/unit/test_adapters/test_asyncmy/test_config.py +0 -152
  377. sqlspec-0.10.0/tests/unit/test_adapters/test_asyncpg/__init__.py +0 -1
  378. sqlspec-0.10.0/tests/unit/test_adapters/test_asyncpg/test_config.py +0 -153
  379. sqlspec-0.10.0/tests/unit/test_adapters/test_duckdb/__init__.py +0 -0
  380. sqlspec-0.10.0/tests/unit/test_adapters/test_duckdb/test_config.py +0 -137
  381. sqlspec-0.10.0/tests/unit/test_adapters/test_oracledb/__init__.py +0 -1
  382. sqlspec-0.10.0/tests/unit/test_adapters/test_oracledb/test_async_config.py +0 -135
  383. sqlspec-0.10.0/tests/unit/test_adapters/test_oracledb/test_sync_config.py +0 -129
  384. sqlspec-0.10.0/tests/unit/test_adapters/test_psycopg/__init__.py +0 -1
  385. sqlspec-0.10.0/tests/unit/test_adapters/test_psycopg/test_async_config.py +0 -179
  386. sqlspec-0.10.0/tests/unit/test_adapters/test_psycopg/test_sync_config.py +0 -160
  387. sqlspec-0.10.0/tests/unit/test_adapters/test_sqlite/__init__.py +0 -1
  388. sqlspec-0.10.0/tests/unit/test_adapters/test_sqlite/test_config.py +0 -89
  389. sqlspec-0.10.0/tests/unit/test_base.py +0 -300
  390. sqlspec-0.10.0/tests/unit/test_typing.py +0 -280
  391. sqlspec-0.10.0/tests/unit/test_utils/__init__.py +0 -0
  392. sqlspec-0.10.0/tests/unit/test_utils/test_module_loader.py +0 -46
  393. sqlspec-0.10.0/tests/unit/test_utils/test_sync_tools.py +0 -109
  394. sqlspec-0.10.0/tests/unit/test_utils/test_text.py +0 -16
  395. sqlspec-0.10.0/tools/__init__.py +0 -0
  396. sqlspec-0.10.0/tools/sphinx_ext/missing_references.py +0 -130
  397. sqlspec-0.10.0/uv.lock +0 -4379
  398. {sqlspec-0.10.0 → sqlspec-0.16.2}/LICENSE +0 -0
  399. {sqlspec-0.10.0 → sqlspec-0.16.2}/NOTICE +0 -0
  400. {sqlspec-0.10.0 → sqlspec-0.16.2}/sqlspec/adapters/__init__.py +0 -0
  401. {sqlspec-0.10.0 → sqlspec-0.16.2}/sqlspec/extensions/__init__.py +0 -0
  402. {sqlspec-0.10.0 → sqlspec-0.16.2}/sqlspec/py.typed +0 -0
  403. {sqlspec-0.10.0/tests → sqlspec-0.16.2/sqlspec/storage/backends}/__init__.py +0 -0
  404. {sqlspec-0.10.0/tests/integration/test_adapters/test_asyncpg → sqlspec-0.16.2/tests}/__init__.py +0 -0
  405. {sqlspec-0.10.0 → sqlspec-0.16.2}/tests/fixtures/__init__.py +0 -0
  406. {sqlspec-0.10.0 → sqlspec-0.16.2}/tests/integration/test_adapters/test_asyncmy/__init__.py +0 -0
  407. {sqlspec-0.10.0 → sqlspec-0.16.2}/tests/integration/test_adapters/test_duckdb/__init__.py +0 -0
  408. {sqlspec-0.10.0 → sqlspec-0.16.2}/tests/integration/test_adapters/test_oracledb/__init__.py +0 -0
  409. {sqlspec-0.10.0/tests/integration/test_adapters/test_bigquery → sqlspec-0.16.2/tools}/__init__.py +0 -0
  410. {sqlspec-0.10.0 → sqlspec-0.16.2}/tools/build_docs.py +0 -0
  411. {sqlspec-0.10.0 → sqlspec-0.16.2}/tools/pypi_readme.py +0 -0
  412. {sqlspec-0.10.0 → sqlspec-0.16.2}/tools/sphinx_ext/__init__.py +0 -0
@@ -17,7 +17,9 @@ site/
17
17
  target/
18
18
  .idea/
19
19
  .vscode/
20
+ .claude/
20
21
  .cursor/
22
+ .zed/
21
23
 
22
24
  # files
23
25
  **/*.so
@@ -31,3 +33,31 @@ target/
31
33
  /docs/_build/
32
34
  coverage.*
33
35
  setup.py
36
+ tmp/
37
+ *.log
38
+ .bugs
39
+ .tmp
40
+ .todos
41
+ todo/
42
+ CLAUDE.md
43
+ CLAUDE.*.md
44
+ TODO*
45
+ .claudedocs
46
+ .env
47
+ GEMINI.md
48
+ GEMINI.*.md
49
+ .cursor/
50
+ .cursorrules
51
+ CLAUDE*.md
52
+ *CLAUDE*.md
53
+ requirements/*
54
+ tools/*.json
55
+ benchmarks/
56
+ .benchmark
57
+ *.db
58
+ *.db-journal
59
+ *.db-wal
60
+ *.db-shm
61
+ *.duckdb
62
+ .crush
63
+ CRUSH.md
@@ -2,12 +2,12 @@ default_language_version:
2
2
  python: "3"
3
3
  repos:
4
4
  - repo: https://github.com/compilerla/conventional-pre-commit
5
- rev: v4.0.0
5
+ rev: v4.2.0
6
6
  hooks:
7
7
  - id: conventional-pre-commit
8
8
  stages: [commit-msg]
9
9
  - repo: https://github.com/pre-commit/pre-commit-hooks
10
- rev: v5.0.0
10
+ rev: v6.0.0
11
11
  hooks:
12
12
  - id: check-ast
13
13
  - id: check-case-conflict
@@ -17,7 +17,7 @@ repos:
17
17
  - id: mixed-line-ending
18
18
  - id: trailing-whitespace
19
19
  - repo: https://github.com/charliermarsh/ruff-pre-commit
20
- rev: "v0.11.6"
20
+ rev: "v0.12.8"
21
21
  hooks:
22
22
  - id: ruff
23
23
  args: ["--fix"]
@@ -29,7 +29,7 @@ repos:
29
29
  additional_dependencies:
30
30
  - tomli
31
31
  - repo: https://github.com/python-formate/flake8-dunder-all
32
- rev: v0.4.1
32
+ rev: v0.5.0
33
33
  hooks:
34
34
  - id: ensure-dunder-all
35
35
  exclude: "test*|tools"
@@ -18,7 +18,7 @@ Workflow
18
18
  2. Clone your fork locally with git
19
19
  3. `Set up the environment <#setting-up-the-environment>`_
20
20
  4. Make your changes
21
- 5. Run ``male lint`` to run linters and formatters. This step is optional and will be executed
21
+ 5. Run ``make lint`` to run linters and formatters. This step is optional and will be executed
22
22
  automatically by git before you make a commit, but you may want to run it manually in order to apply fixes
23
23
  6. Commit your changes to git
24
24
  7. Push the changes to your fork
@@ -48,6 +48,18 @@ install: destroy clean ## Install the project, depe
48
48
  @uv sync --all-extras --dev
49
49
  @echo "${OK} Installation complete! 🎉"
50
50
 
51
+ .PHONY: install-compiled
52
+ install-compiled: destroy clean ## Install with mypyc compilation for performance
53
+ @echo "${INFO} Starting fresh installation with mypyc compilation..."
54
+ @uv python pin 3.12 >/dev/null 2>&1
55
+ @uv venv >/dev/null 2>&1
56
+ @echo "${INFO} Installing in editable mode with mypyc compilation..."
57
+ @HATCH_BUILD_HOOKS_ENABLE=1 uv pip install -e .
58
+ @uv sync --all-extras --dev
59
+ @echo "${OK} Performance installation complete! 🚀"
60
+ @echo "${INFO} Verifying compilation..."
61
+ @find sqlspec -name "*.so" | wc -l | xargs -I {} echo "${OK} Compiled {} modules"
62
+
51
63
  .PHONY: destroy
52
64
  destroy: ## Destroy the virtual environment
53
65
  @echo "${INFO} Destroying virtual environment... 🗑️"
@@ -83,6 +95,22 @@ build: ## Build the package
83
95
  @uv build >/dev/null 2>&1
84
96
  @echo "${OK} Package build complete"
85
97
 
98
+ .PHONY: build-performance
99
+ build-performance: ## Build package with mypyc compilation
100
+ @echo "${INFO} Building package with mypyc compilation... 📦"
101
+ @HATCH_BUILD_HOOKS_ENABLE=1 uv build >/dev/null 2>&1
102
+ @echo "${OK} Performance package build complete 🚀"
103
+
104
+ .PHONY: test-mypyc
105
+ test-mypyc: ## Test mypyc compilation on individual modules
106
+ @echo "${INFO} Testing mypyc compilation... 🔧"
107
+ @uv run mypyc --check-untyped-defs sqlspec/utils/statement_hashing.py
108
+ @uv run mypyc --check-untyped-defs sqlspec/utils/text.py
109
+ @uv run mypyc --check-untyped-defs sqlspec/utils/sync_tools.py
110
+ @uv run mypyc --check-untyped-defs sqlspec/statement/cache.py
111
+ @echo "${OK} Mypyc compilation tests passed ✨"
112
+
113
+
86
114
  .PHONY: release
87
115
  release: ## Bump version and create release tag
88
116
  @echo "${INFO} Preparing for release... 📦"
@@ -108,6 +136,8 @@ clean: ## Cleanup temporary build a
108
136
  @find . -name '*~' -exec rm -f {} + >/dev/null 2>&1
109
137
  @find . -name '__pycache__' -exec rm -rf {} + >/dev/null 2>&1
110
138
  @find . -name '.ipynb_checkpoints' -exec rm -rf {} + >/dev/null 2>&1
139
+ @find . -name '*.so' -exec rm -f {} + >/dev/null 2>&1
140
+ @find . -name '*.c' -exec rm -f {} + >/dev/null 2>&1
111
141
  @echo "${OK} Working directory cleaned"
112
142
  $(MAKE) docs-clean
113
143
 
@@ -215,6 +245,49 @@ docs-linkcheck-full: ## Run full documentation lin
215
245
  @uv run sphinx-build -b linkcheck ./docs ./docs/_build -D linkcheck_anchors=0
216
246
  @echo "${OK} Full link check complete"
217
247
 
248
+ # =============================================================================
249
+ # Development Infrastructure
250
+ # =============================================================================
251
+
252
+ .PHONY: infra-up
253
+ infra-up: ## Start development infrastructure (databases, storage)
254
+ @echo "${INFO} Starting development infrastructure..."
255
+ @./tools/local-infra.sh up
256
+ @echo "${OK} Development infrastructure ready ✨"
257
+
258
+ .PHONY: infra-down
259
+ infra-down: ## Stop development infrastructure
260
+ @echo "${INFO} Stopping development infrastructure..."
261
+ @./tools/local-infra.sh down --quiet
262
+ @echo "${OK} Development infrastructure stopped"
263
+
264
+ .PHONY: infra-status
265
+ infra-status: ## Show development infrastructure status
266
+ @./tools/local-infra.sh status
267
+
268
+ .PHONY: infra-cleanup
269
+ infra-cleanup: ## Clean up development infrastructure
270
+ @echo "${WARN} This will remove all development containers and volumes"
271
+ @./tools/local-infra.sh cleanup
272
+
273
+ .PHONY: infra-postgres
274
+ infra-postgres: ## Start only PostgreSQL
275
+ @echo "${INFO} Starting PostgreSQL..."
276
+ @./tools/local-infra.sh up postgres --quiet
277
+ @echo "${OK} PostgreSQL ready on port 5433"
278
+
279
+ .PHONY: infra-oracle
280
+ infra-oracle: ## Start only Oracle
281
+ @echo "${INFO} Starting Oracle..."
282
+ @./tools/local-infra.sh up oracle --quiet
283
+ @echo "${OK} Oracle ready on port 1522"
284
+
285
+ .PHONY: infra-mysql
286
+ infra-mysql: ## Start only MySQL
287
+ @echo "${INFO} Starting MySQL..."
288
+ @./tools/local-infra.sh up mysql --quiet
289
+ @echo "${OK} MySQL ready on port 3307"
290
+
218
291
  # =============================================================================
219
292
  # End of Makefile
220
293
  # =============================================================================
@@ -1,7 +1,10 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: sqlspec
3
- Version: 0.10.0
3
+ Version: 0.16.2
4
4
  Summary: SQL Experiments in Python
5
+ Project-URL: Discord, https://discord.gg/litestar
6
+ Project-URL: Issue, https://github.com/litestar-org/sqlspec/issues/
7
+ Project-URL: Source, https://github.com/litestar-org/sqlspec
5
8
  Author-email: Cody Fincher <cody@litestar.dev>
6
9
  Maintainer-email: Litestar Developers <hello@litestar.dev>
7
10
  License-Expression: MIT
@@ -9,40 +12,64 @@ License-File: LICENSE
9
12
  License-File: NOTICE
10
13
  Requires-Python: <4.0,>=3.9
11
14
  Requires-Dist: eval-type-backport; python_version < '3.10'
12
- Requires-Dist: sqlglot
15
+ Requires-Dist: mypy-extensions
16
+ Requires-Dist: rich-click
17
+ Requires-Dist: sqlglot>=19.9.0
13
18
  Requires-Dist: typing-extensions
14
19
  Provides-Extra: adbc
15
20
  Requires-Dist: adbc-driver-manager; extra == 'adbc'
16
21
  Requires-Dist: pyarrow; extra == 'adbc'
17
22
  Provides-Extra: aioodbc
18
23
  Requires-Dist: aioodbc; extra == 'aioodbc'
24
+ Provides-Extra: aiosql
25
+ Requires-Dist: aiosql; extra == 'aiosql'
19
26
  Provides-Extra: aiosqlite
20
27
  Requires-Dist: aiosqlite; extra == 'aiosqlite'
21
28
  Provides-Extra: asyncmy
22
29
  Requires-Dist: asyncmy; extra == 'asyncmy'
23
30
  Provides-Extra: asyncpg
24
31
  Requires-Dist: asyncpg; extra == 'asyncpg'
32
+ Provides-Extra: attrs
33
+ Requires-Dist: attrs; extra == 'attrs'
34
+ Requires-Dist: cattrs; extra == 'attrs'
25
35
  Provides-Extra: bigquery
26
36
  Requires-Dist: google-cloud-bigquery; extra == 'bigquery'
37
+ Provides-Extra: cli
38
+ Requires-Dist: rich-click; extra == 'cli'
27
39
  Provides-Extra: duckdb
28
40
  Requires-Dist: duckdb; extra == 'duckdb'
29
41
  Provides-Extra: fastapi
30
42
  Requires-Dist: fastapi; extra == 'fastapi'
31
43
  Provides-Extra: flask
32
44
  Requires-Dist: flask; extra == 'flask'
45
+ Provides-Extra: fsspec
46
+ Requires-Dist: fsspec; extra == 'fsspec'
33
47
  Provides-Extra: litestar
34
48
  Requires-Dist: litestar; extra == 'litestar'
35
49
  Provides-Extra: msgspec
36
50
  Requires-Dist: msgspec; extra == 'msgspec'
51
+ Provides-Extra: mypyc
37
52
  Provides-Extra: nanoid
38
53
  Requires-Dist: fastnanoid>=0.4.1; extra == 'nanoid'
54
+ Provides-Extra: obstore
55
+ Requires-Dist: obstore; extra == 'obstore'
56
+ Provides-Extra: opentelemetry
57
+ Requires-Dist: opentelemetry-instrumentation; extra == 'opentelemetry'
39
58
  Provides-Extra: oracledb
40
59
  Requires-Dist: oracledb; extra == 'oracledb'
41
60
  Provides-Extra: orjson
42
61
  Requires-Dist: orjson; extra == 'orjson'
62
+ Provides-Extra: pandas
63
+ Requires-Dist: pandas; extra == 'pandas'
64
+ Requires-Dist: pyarrow; extra == 'pandas'
43
65
  Provides-Extra: performance
44
66
  Requires-Dist: msgspec; extra == 'performance'
45
67
  Requires-Dist: sqlglot[rs]; extra == 'performance'
68
+ Provides-Extra: polars
69
+ Requires-Dist: polars; extra == 'polars'
70
+ Requires-Dist: pyarrow; extra == 'polars'
71
+ Provides-Extra: prometheus
72
+ Requires-Dist: prometheus-client; extra == 'prometheus'
46
73
  Provides-Extra: psqlpy
47
74
  Requires-Dist: psqlpy; extra == 'psqlpy'
48
75
  Provides-Extra: psycopg
@@ -57,7 +84,7 @@ Requires-Dist: pymysql; extra == 'pymysql'
57
84
  Provides-Extra: spanner
58
85
  Requires-Dist: google-cloud-spanner; extra == 'spanner'
59
86
  Provides-Extra: uuid
60
- Requires-Dist: uuid-utils>=0.6.1; extra == 'uuid'
87
+ Requires-Dist: uuid-utils; extra == 'uuid'
61
88
  Description-Content-Type: text/markdown
62
89
 
63
90
  # SQLSpec
@@ -66,18 +93,26 @@ Description-Content-Type: text/markdown
66
93
 
67
94
  SQLSpec is an experimental Python library designed to streamline and modernize your SQL interactions across a variety of database systems. While still in its early stages, SQLSpec aims to provide a flexible, typed, and extensible interface for working with SQL in Python.
68
95
 
69
- **Note**: SQLSpec is currently under active development and the API is subject to change. It is not yet ready for production use. Contributions are welcome!
96
+ **Note**: SQLSpec is currently under active development and the API is subject to change. It is not yet ready for production use. Contributions are welcome!
70
97
 
71
- ## Core Features (Planned but subject to change, removal or redesign)
98
+ ## Core Features (Current and Planned)
99
+
100
+ ### Currently Implemented
72
101
 
73
102
  - **Consistent Database Session Interface**: Provides a consistent connectivity interface for interacting with one or more database systems, including SQLite, Postgres, DuckDB, MySQL, Oracle, SQL Server, Spanner, BigQuery, and more.
74
- - **Emphasis on RAW SQL and Minimal Abstractions and Performance**: SQLSpec is a library for working with SQL in Python. It's goals are to offer minimal abstractions between the user and the database. It does not aim to be an ORM library.
103
+ - **Emphasis on RAW SQL and Minimal Abstractions**: SQLSpec is a library for working with SQL in Python. Its goals are to offer minimal abstractions between the user and the database. It does not aim to be an ORM library.
75
104
  - **Type-Safe Queries**: Quickly map SQL queries to typed objects using libraries such as Pydantic, Msgspec, Attrs, etc.
76
- - **Extensible Design**: Easily add support for new database dialects or extend existing functionality to meet your specific needs. Easily add support for async and sync database drivers.
77
- - **Minimal Dependencies**: SQLSpec is designed to be lightweight and can run on it's own or with other libraries such as `litestar`, `fastapi`, `flask` and more. (Contributions welcome!)
78
- - **Dynamic Query Manipulation**: Easily apply filters to pre-defined queries with a fluent, Pythonic API. Safely manipulate queries without the risk of SQL injection.
79
- - **Dialect Validation and Conversion**: Use `sqlglot` to validate your SQL against specific dialects and seamlessly convert between them.
105
+ - **Extensible Design**: Easily add support for new database dialects or extend existing functionality to meet your specific needs. Easily add support for async and sync database drivers.
106
+ - **Minimal Dependencies**: SQLSpec is designed to be lightweight and can run on its own or with other libraries such as `litestar`, `fastapi`, `flask` and more. (Contributions welcome!)
80
107
  - **Support for Async and Sync Database Drivers**: SQLSpec supports both async and sync database drivers, allowing you to choose the style that best fits your application.
108
+
109
+ ### Experimental Features (API will change rapidly)
110
+
111
+ - **SQL Builder API**: Type-safe query builder with method chaining (experimental and subject to significant changes)
112
+ - **Dynamic Query Manipulation**: Apply filters to pre-defined queries with a fluent API. Safely manipulate queries without SQL injection risk.
113
+ - **Dialect Validation and Conversion**: Use `sqlglot` to validate your SQL against specific dialects and seamlessly convert between them.
114
+ - **Storage Operations**: Direct export to Parquet, CSV, JSON with Arrow integration
115
+ - **Instrumentation**: OpenTelemetry and Prometheus metrics support
81
116
  - **Basic Migration Management**: A mechanism to generate empty migration files where you can add your own SQL and intelligently track which migrations have been applied.
82
117
 
83
118
  ## What SQLSpec Is Not (Yet)
@@ -88,16 +123,60 @@ SQLSpec is a work in progress. While it offers a solid foundation for modern SQL
88
123
 
89
124
  We've talked about what SQLSpec is not, so let's look at what it can do.
90
125
 
91
- These are just a few of the examples that demonstrate SQLSpec's flexibility and each of the bundled adapters offer the same config and driver interfaces.
126
+ These are just a few examples that demonstrate SQLSpec's flexibility. Each of the bundled adapters offers the same config and driver interfaces.
127
+
128
+ ### Basic Usage
129
+
130
+ ```python
131
+ from sqlspec import SQLSpec
132
+ from sqlspec.adapters.sqlite import SqliteConfig
133
+ from pydantic import BaseModel
134
+ # Create SQLSpec instance and configure database
135
+ sql = SQLSpec()
136
+ config = sql.add_config(SqliteConfig(database=":memory:"))
137
+
138
+ # Execute queries with automatic result mapping
139
+ with sql.provide_session(config) as session:
140
+ # Simple query
141
+ result = session.execute("SELECT 'Hello, SQLSpec!' as message")
142
+ print(result.get_first()) # {'message': 'Hello, SQLSpec!'}
143
+ ```
144
+
145
+ ### SQL Builder Example (Experimental)
146
+
147
+ **Warning**: The SQL Builder API is highly experimental and will change significantly.
148
+
149
+ ```python
150
+ from sqlspec import sql
151
+
152
+ # Build a simple query
153
+ query = sql.select("id", "name", "email").from_("users").where("active = ?", True)
154
+ print(query.build().sql) # SELECT id, name, email FROM users WHERE active = ?
155
+
156
+ # More complex example with joins
157
+ query = (
158
+ sql.select("u.name", "COUNT(o.id) as order_count")
159
+ .from_("users u")
160
+ .left_join("orders o", "u.id = o.user_id")
161
+ .where("u.created_at > ?", "2024-01-01")
162
+ .group_by("u.name")
163
+ .having("COUNT(o.id) > ?", 5)
164
+ .order_by("order_count", desc=True)
165
+ )
166
+
167
+ # Execute the built query
168
+ with sql.provide_session(config) as session:
169
+ results = session.execute(query.build())
170
+ ```
92
171
 
93
172
  ### DuckDB LLM
94
173
 
95
- This is a quick implementation using some of the built in Secret and Extension management features of SQLSpec's DuckDB integration.
174
+ This is a quick implementation using some of the built-in Secret and Extension management features of SQLSpec's DuckDB integration.
96
175
 
97
- It allows you to communicate with any compatible OpenAPI conversations endpoint (such as Ollama). This examples:
176
+ It allows you to communicate with any compatible OpenAPI conversations endpoint (such as Ollama). This example:
98
177
 
99
178
  - auto installs the `open_prompt` DuckDB extensions
100
- - automatically creates the correct `open_prompt` comptaible secret required to use the extension
179
+ - automatically creates the correct `open_prompt` compatible secret required to use the extension
101
180
 
102
181
  ```py
103
182
  # /// script
@@ -142,12 +221,12 @@ with sql.provide_session(etl_config) as session:
142
221
 
143
222
  ### DuckDB Gemini Embeddings
144
223
 
145
- In this example, we are again using DuckDB. However, we are going to use the built in to call the Google Gemini embeddings service directly from the database.
224
+ In this example, we are again using DuckDB. However, we are going to use the built-in to call the Google Gemini embeddings service directly from the database.
146
225
 
147
- This example will
226
+ This example will:
148
227
 
149
228
  - auto installs the `http_client` and `vss` (vector similarity search) DuckDB extensions
150
- - when a connection is created, it ensures that the `generate_embeddings` macro exists in the DuckDB database.
229
+ - when a connection is created, it ensures that the `generate_embeddings` macro exists in the DuckDB database
151
230
  - Execute a simple query to call the Google API
152
231
 
153
232
  ```py
@@ -193,8 +272,8 @@ etl_config = sql.add_config(
193
272
  )
194
273
  )
195
274
  with sql.provide_session(etl_config) as session:
196
- result = session.select_one("SELECT generate_embedding('example text')")
197
- print(result) # result is a dictionary when `schema_type` is omitted.
275
+ result = session.execute("SELECT generate_embedding('example text')")
276
+ print(result.get_first()) # result is a dictionary when `schema_type` is omitted.
198
277
  ```
199
278
 
200
279
  ### Basic Litestar Integration
@@ -209,11 +288,10 @@ In this example we are going to demonstrate how to create a basic configuration
209
288
  # ]
210
289
  # ///
211
290
 
212
- from aiosqlite import Connection
213
291
  from litestar import Litestar, get
214
292
 
215
293
  from sqlspec.adapters.aiosqlite import AiosqliteConfig, AiosqliteDriver
216
- from sqlspec.extensions.litestar import SQLSpec
294
+ from sqlspec.extensions.litestar import DatabaseConfig, SQLSpec
217
295
 
218
296
 
219
297
  @get("/")
@@ -221,15 +299,18 @@ async def simple_sqlite(db_session: AiosqliteDriver) -> dict[str, str]:
221
299
  return await db_session.select_one("SELECT 'Hello, world!' AS greeting")
222
300
 
223
301
 
224
- sqlspec = SQLSpec(config=DatabaseConfig(
225
- config=[AiosqliteConfig(), commit_mode="autocommit")],
302
+ sqlspec = SQLSpec(
303
+ config=DatabaseConfig(
304
+ config=AiosqliteConfig(),
305
+ commit_mode="autocommit"
306
+ )
226
307
  )
227
308
  app = Litestar(route_handlers=[simple_sqlite], plugins=[sqlspec])
228
309
  ```
229
310
 
230
311
  ## Inspiration and Future Direction
231
312
 
232
- SQLSpec originally drew inspiration from features found in the `aiosql` library. This is a great library for working with and executed SQL stored in files. It's unclear how much of an overlap there will be between the two libraries, but it's possible that some features will be contributed back to `aiosql` where appropriate.
313
+ SQLSpec originally drew inspiration from features found in the `aiosql` library. This is a great library for working with and executing SQL stored in files. It's unclear how much of an overlap there will be between the two libraries, but it's possible that some features will be contributed back to `aiosql` where appropriate.
233
314
 
234
315
  ## Current Focus: Universal Connectivity
235
316
 
@@ -258,6 +339,7 @@ This list is not final. If you have a driver you'd like to see added, please ope
258
339
  | [`spanner`](https://googleapis.dev/python/spanner/latest/index.html) | Spanner | Sync | 🗓️ |
259
340
  | [`sqlserver`](https://docs.microsoft.com/en-us/sql/connect/python/pyodbc/python-sql-driver-for-pyodbc?view=sql-server-ver16) | SQL Server | Sync | 🗓️ |
260
341
  | [`mysql`](https://dev.mysql.com/doc/connector-python/en/connector-python-api-mysql-connector-python.html) | MySQL | Sync | 🗓️ |
342
+ | [`asyncmy`](https://github.com/long2ice/asyncmy) | MySQL | Async | ✅ |
261
343
  | [`snowflake`](https://docs.snowflake.com) | Snowflake | Sync | 🗓️ |
262
344
 
263
345
  ## Proposed Project Structure
@@ -268,9 +350,10 @@ This list is not final. If you have a driver you'd like to see added, please ope
268
350
  - `litestar/`: Litestar framework integration ✅
269
351
  - `fastapi/`: Future home of `fastapi` integration.
270
352
  - `flask/`: Future home of `flask` integration.
271
- - `*/`: Future home of your favorite framework integration 🔌 ✨
353
+ - `*/`: Future home of your favorite framework integration
272
354
  - `base.py`: Contains base protocols for database configurations.
273
- - `filters.py`: Contains the `Filter` class which is used to apply filters to pre-defined SQL queries.
355
+ - `statement/`: Contains the SQL statement system with builders, validation, and transformation.
356
+ - `storage/`: Contains unified storage operations for data import/export.
274
357
  - `utils/`: Contains utility functions used throughout the project.
275
358
  - `exceptions.py`: Contains custom exceptions for SQLSpec.
276
359
  - `typing.py`: Contains type hints, type guards and several facades for optional libraries that are not required for the core functionality of SQLSpec.
@@ -4,18 +4,26 @@
4
4
 
5
5
  SQLSpec is an experimental Python library designed to streamline and modernize your SQL interactions across a variety of database systems. While still in its early stages, SQLSpec aims to provide a flexible, typed, and extensible interface for working with SQL in Python.
6
6
 
7
- **Note**: SQLSpec is currently under active development and the API is subject to change. It is not yet ready for production use. Contributions are welcome!
7
+ **Note**: SQLSpec is currently under active development and the API is subject to change. It is not yet ready for production use. Contributions are welcome!
8
8
 
9
- ## Core Features (Planned but subject to change, removal or redesign)
9
+ ## Core Features (Current and Planned)
10
+
11
+ ### Currently Implemented
10
12
 
11
13
  - **Consistent Database Session Interface**: Provides a consistent connectivity interface for interacting with one or more database systems, including SQLite, Postgres, DuckDB, MySQL, Oracle, SQL Server, Spanner, BigQuery, and more.
12
- - **Emphasis on RAW SQL and Minimal Abstractions and Performance**: SQLSpec is a library for working with SQL in Python. It's goals are to offer minimal abstractions between the user and the database. It does not aim to be an ORM library.
14
+ - **Emphasis on RAW SQL and Minimal Abstractions**: SQLSpec is a library for working with SQL in Python. Its goals are to offer minimal abstractions between the user and the database. It does not aim to be an ORM library.
13
15
  - **Type-Safe Queries**: Quickly map SQL queries to typed objects using libraries such as Pydantic, Msgspec, Attrs, etc.
14
- - **Extensible Design**: Easily add support for new database dialects or extend existing functionality to meet your specific needs. Easily add support for async and sync database drivers.
15
- - **Minimal Dependencies**: SQLSpec is designed to be lightweight and can run on it's own or with other libraries such as `litestar`, `fastapi`, `flask` and more. (Contributions welcome!)
16
- - **Dynamic Query Manipulation**: Easily apply filters to pre-defined queries with a fluent, Pythonic API. Safely manipulate queries without the risk of SQL injection.
17
- - **Dialect Validation and Conversion**: Use `sqlglot` to validate your SQL against specific dialects and seamlessly convert between them.
16
+ - **Extensible Design**: Easily add support for new database dialects or extend existing functionality to meet your specific needs. Easily add support for async and sync database drivers.
17
+ - **Minimal Dependencies**: SQLSpec is designed to be lightweight and can run on its own or with other libraries such as `litestar`, `fastapi`, `flask` and more. (Contributions welcome!)
18
18
  - **Support for Async and Sync Database Drivers**: SQLSpec supports both async and sync database drivers, allowing you to choose the style that best fits your application.
19
+
20
+ ### Experimental Features (API will change rapidly)
21
+
22
+ - **SQL Builder API**: Type-safe query builder with method chaining (experimental and subject to significant changes)
23
+ - **Dynamic Query Manipulation**: Apply filters to pre-defined queries with a fluent API. Safely manipulate queries without SQL injection risk.
24
+ - **Dialect Validation and Conversion**: Use `sqlglot` to validate your SQL against specific dialects and seamlessly convert between them.
25
+ - **Storage Operations**: Direct export to Parquet, CSV, JSON with Arrow integration
26
+ - **Instrumentation**: OpenTelemetry and Prometheus metrics support
19
27
  - **Basic Migration Management**: A mechanism to generate empty migration files where you can add your own SQL and intelligently track which migrations have been applied.
20
28
 
21
29
  ## What SQLSpec Is Not (Yet)
@@ -26,16 +34,60 @@ SQLSpec is a work in progress. While it offers a solid foundation for modern SQL
26
34
 
27
35
  We've talked about what SQLSpec is not, so let's look at what it can do.
28
36
 
29
- These are just a few of the examples that demonstrate SQLSpec's flexibility and each of the bundled adapters offer the same config and driver interfaces.
37
+ These are just a few examples that demonstrate SQLSpec's flexibility. Each of the bundled adapters offers the same config and driver interfaces.
38
+
39
+ ### Basic Usage
40
+
41
+ ```python
42
+ from sqlspec import SQLSpec
43
+ from sqlspec.adapters.sqlite import SqliteConfig
44
+ from pydantic import BaseModel
45
+ # Create SQLSpec instance and configure database
46
+ sql = SQLSpec()
47
+ config = sql.add_config(SqliteConfig(database=":memory:"))
48
+
49
+ # Execute queries with automatic result mapping
50
+ with sql.provide_session(config) as session:
51
+ # Simple query
52
+ result = session.execute("SELECT 'Hello, SQLSpec!' as message")
53
+ print(result.get_first()) # {'message': 'Hello, SQLSpec!'}
54
+ ```
55
+
56
+ ### SQL Builder Example (Experimental)
57
+
58
+ **Warning**: The SQL Builder API is highly experimental and will change significantly.
59
+
60
+ ```python
61
+ from sqlspec import sql
62
+
63
+ # Build a simple query
64
+ query = sql.select("id", "name", "email").from_("users").where("active = ?", True)
65
+ print(query.build().sql) # SELECT id, name, email FROM users WHERE active = ?
66
+
67
+ # More complex example with joins
68
+ query = (
69
+ sql.select("u.name", "COUNT(o.id) as order_count")
70
+ .from_("users u")
71
+ .left_join("orders o", "u.id = o.user_id")
72
+ .where("u.created_at > ?", "2024-01-01")
73
+ .group_by("u.name")
74
+ .having("COUNT(o.id) > ?", 5)
75
+ .order_by("order_count", desc=True)
76
+ )
77
+
78
+ # Execute the built query
79
+ with sql.provide_session(config) as session:
80
+ results = session.execute(query.build())
81
+ ```
30
82
 
31
83
  ### DuckDB LLM
32
84
 
33
- This is a quick implementation using some of the built in Secret and Extension management features of SQLSpec's DuckDB integration.
85
+ This is a quick implementation using some of the built-in Secret and Extension management features of SQLSpec's DuckDB integration.
34
86
 
35
- It allows you to communicate with any compatible OpenAPI conversations endpoint (such as Ollama). This examples:
87
+ It allows you to communicate with any compatible OpenAPI conversations endpoint (such as Ollama). This example:
36
88
 
37
89
  - auto installs the `open_prompt` DuckDB extensions
38
- - automatically creates the correct `open_prompt` comptaible secret required to use the extension
90
+ - automatically creates the correct `open_prompt` compatible secret required to use the extension
39
91
 
40
92
  ```py
41
93
  # /// script
@@ -80,12 +132,12 @@ with sql.provide_session(etl_config) as session:
80
132
 
81
133
  ### DuckDB Gemini Embeddings
82
134
 
83
- In this example, we are again using DuckDB. However, we are going to use the built in to call the Google Gemini embeddings service directly from the database.
135
+ In this example, we are again using DuckDB. However, we are going to use the built-in to call the Google Gemini embeddings service directly from the database.
84
136
 
85
- This example will
137
+ This example will:
86
138
 
87
139
  - auto installs the `http_client` and `vss` (vector similarity search) DuckDB extensions
88
- - when a connection is created, it ensures that the `generate_embeddings` macro exists in the DuckDB database.
140
+ - when a connection is created, it ensures that the `generate_embeddings` macro exists in the DuckDB database
89
141
  - Execute a simple query to call the Google API
90
142
 
91
143
  ```py
@@ -131,8 +183,8 @@ etl_config = sql.add_config(
131
183
  )
132
184
  )
133
185
  with sql.provide_session(etl_config) as session:
134
- result = session.select_one("SELECT generate_embedding('example text')")
135
- print(result) # result is a dictionary when `schema_type` is omitted.
186
+ result = session.execute("SELECT generate_embedding('example text')")
187
+ print(result.get_first()) # result is a dictionary when `schema_type` is omitted.
136
188
  ```
137
189
 
138
190
  ### Basic Litestar Integration
@@ -147,11 +199,10 @@ In this example we are going to demonstrate how to create a basic configuration
147
199
  # ]
148
200
  # ///
149
201
 
150
- from aiosqlite import Connection
151
202
  from litestar import Litestar, get
152
203
 
153
204
  from sqlspec.adapters.aiosqlite import AiosqliteConfig, AiosqliteDriver
154
- from sqlspec.extensions.litestar import SQLSpec
205
+ from sqlspec.extensions.litestar import DatabaseConfig, SQLSpec
155
206
 
156
207
 
157
208
  @get("/")
@@ -159,15 +210,18 @@ async def simple_sqlite(db_session: AiosqliteDriver) -> dict[str, str]:
159
210
  return await db_session.select_one("SELECT 'Hello, world!' AS greeting")
160
211
 
161
212
 
162
- sqlspec = SQLSpec(config=DatabaseConfig(
163
- config=[AiosqliteConfig(), commit_mode="autocommit")],
213
+ sqlspec = SQLSpec(
214
+ config=DatabaseConfig(
215
+ config=AiosqliteConfig(),
216
+ commit_mode="autocommit"
217
+ )
164
218
  )
165
219
  app = Litestar(route_handlers=[simple_sqlite], plugins=[sqlspec])
166
220
  ```
167
221
 
168
222
  ## Inspiration and Future Direction
169
223
 
170
- SQLSpec originally drew inspiration from features found in the `aiosql` library. This is a great library for working with and executed SQL stored in files. It's unclear how much of an overlap there will be between the two libraries, but it's possible that some features will be contributed back to `aiosql` where appropriate.
224
+ SQLSpec originally drew inspiration from features found in the `aiosql` library. This is a great library for working with and executing SQL stored in files. It's unclear how much of an overlap there will be between the two libraries, but it's possible that some features will be contributed back to `aiosql` where appropriate.
171
225
 
172
226
  ## Current Focus: Universal Connectivity
173
227
 
@@ -196,6 +250,7 @@ This list is not final. If you have a driver you'd like to see added, please ope
196
250
  | [`spanner`](https://googleapis.dev/python/spanner/latest/index.html) | Spanner | Sync | 🗓️ |
197
251
  | [`sqlserver`](https://docs.microsoft.com/en-us/sql/connect/python/pyodbc/python-sql-driver-for-pyodbc?view=sql-server-ver16) | SQL Server | Sync | 🗓️ |
198
252
  | [`mysql`](https://dev.mysql.com/doc/connector-python/en/connector-python-api-mysql-connector-python.html) | MySQL | Sync | 🗓️ |
253
+ | [`asyncmy`](https://github.com/long2ice/asyncmy) | MySQL | Async | ✅ |
199
254
  | [`snowflake`](https://docs.snowflake.com) | Snowflake | Sync | 🗓️ |
200
255
 
201
256
  ## Proposed Project Structure
@@ -206,9 +261,10 @@ This list is not final. If you have a driver you'd like to see added, please ope
206
261
  - `litestar/`: Litestar framework integration ✅
207
262
  - `fastapi/`: Future home of `fastapi` integration.
208
263
  - `flask/`: Future home of `flask` integration.
209
- - `*/`: Future home of your favorite framework integration 🔌 ✨
264
+ - `*/`: Future home of your favorite framework integration
210
265
  - `base.py`: Contains base protocols for database configurations.
211
- - `filters.py`: Contains the `Filter` class which is used to apply filters to pre-defined SQL queries.
266
+ - `statement/`: Contains the SQL statement system with builders, validation, and transformation.
267
+ - `storage/`: Contains unified storage operations for data import/export.
212
268
  - `utils/`: Contains utility functions used throughout the project.
213
269
  - `exceptions.py`: Contains custom exceptions for SQLSpec.
214
270
  - `typing.py`: Contains type hints, type guards and several facades for optional libraries that are not required for the core functionality of SQLSpec.