- Expanded MySQL compiler, runner, and real-server integration coverage across set queries, scalar/fetch-one paths, debug logging, and transaction behavior.
- Added narrative
0.4.0release notes inLATEST-RELEASE.mdanddocs/latest-release.mdwith example-heavy walkthroughs.
See LATEST-RELEASE.md for a non-normative prose walkthrough of this release with extended examples.
- Added portable predicate support for:
IN/NOT INBETWEEN/NOT BETWEENEXISTS/NOT EXISTS
- Added set operations:
UNIONUNION ALLINTERSECTEXCEPT
- Added explicit ordering wrapper functions:
ASC(expr)DESC(expr)
- Added SQL profile documentation page (
docs/sql-profile.md). - Added dialect capability contract tests (
tests/test_dialect_capabilities_contract.py). - Added opt-in real MySQL integration tests for sync/async runners (
tests/test_mysql_integration_real.py). - Added GitHub Actions CI workflow to run tests, docs build, package build, and
twine check.
- Added
RIGHT_JOINandFULL_JOINDSL APIs with dialect capability guardrails. - Updated docs to make
ORDER_BY(DESC(...), ASC(...))the primary ordering style. - Enforced MySQL
OFFSET-without-LIMITguardrail consistently for set queries. - Fixed MySQL set-query
ORDER BYrendering to use output columns in global order clauses. - Documented cross-dialect capability contract in README and SQL profile docs.
- Added
cryptographyto MySQL optional dependency groups so MySQL 8 auth works with the documented extras. - Improved MySQL sync/async runner connection errors to point directly at the required install when auth fails.
- Cleaned release artifacts before
poe releasebuilds/checks so upload targets only the current version. - Updated package license metadata to use SPDX-style configuration compatible with current setuptools guidance.
- Added explicit dialect wrappers:
using_sqlite(...)insqlstratum.sqliteusing_mysql(...)insqlstratum.mysql
- Added dialect binding utilities to preserve wrapper intent through compile and runner boundaries.
- Added SQLite extension helpers in explicit namespace:
TOTAL(...)GROUP_CONCAT(...)
- Added a dedicated docs page for wrapper behavior and guardrails (
docs/dialect-wrappers.md).
- Made wrapped queries chain-friendly (query methods continue to work after wrapping).
- Added clear errors for conflicting nested wrapper bindings.
- Hardened MySQL compiler guardrails for SQLite-only aggregates.
- Expanded interaction test coverage across wrappers, compile, runners, and hydration.
- Added connection URL parsing helpers for SQLite and MySQL.
- Added connection URL support for:
SQLiteRunner.connect(path=...|url=...)MySQLRunner.connect(...)AsyncMySQLRunner.connect(...)
- Added validation matrix documentation for accepted/rejected URL forms.
- Added
SQLiteRunneras the canonical SQLite runner name and keptRunneras a compatibility alias. - Enforced connection configuration exclusivity: callers must provide either URL or individual parameters, not both.
- Improved URL validation and error messaging (missing auth/database, invalid scheme/port, unsupported query/fragment).
- Added a dialect registry (
sqlstratum/dialects/) and compiler dispatch incompile(...). - Added built-in MySQL compiler adapter with deterministic named parameters.
- Added structured dialect errors via
UnsupportedDialectFeatureError. - Added optional MySQL runners:
MySQLRunner(sync,PyMySQL)AsyncMySQLRunner(async,asyncmy)
- Added optional dependency groups:
pymysql,asyncmy, andmysql.
- Moved SQLite compiler implementation under
sqlstratum/dialects/sqlite/. - Exposed
list_dialects()in the top-level API.
- Added compile determinism stress tests covering repeated compilation of complex queries.
- Aligned project metadata/docs to
0.2.2.
- Updated release automation to run tests before build/upload.
- Added a dry-run release workflow (
poe release-dry-run) for non-publishing validation. - Switched package discovery to
setuptoolsauto-find (sqlstratum*) to prevent missed subpackages.
- Aligned project metadata/docs to
0.2.1.
- Release target prepared.
0.1.1is yanked on PyPI due to incorrect semantic versioning for feature-level changes.- Users should migrate to
0.2.0.
This release is yanked on PyPI.
- Naming discipline: hydration helpers are now lowercase to reflect application-layer concerns.
SelectQuery.HYDRATE(...)is nowSelectQuery.hydrate(...).- ALL CAPS identifiers are reserved strictly for SQL DSL constructs.
- Added optional Pydantic v2 hydration adapter (
sqlstratum.hydrate.pydantic).