Files
SQLmem/CHANGELOG.md
T

5.3 KiB

Changelog

All notable changes to this project will be documented in this file.

[Unreleased]


[1.2.0] - 2026-06-04

Added

  • Parametrized queries (R1)execute(sql, params) accepts positional (? tuple/list) and named (:name dict) parameters; passed straight to SQLite during in-memory filtering. Cache loads still fetch the full table (parameters are not applied to source fetches).
  • JOIN support (R2) — multi-table SELECTs are parsed into per-table column sets; each table is cached independently and the JOIN runs in the in-memory SQLite. Columns in a multi-table query must be qualified by table or alias.
  • SELECT * support (R3) — wildcard (and alias.*) queries discover all columns from the source DB, cache the whole table, and mark it is_full so later column queries are guaranteed cache hits without re-fetch.
  • Three-part table names (R4)[catalog].[schema].[table] is parsed to its base name for caching; the in-memory query is rewritten to strip catalog/schema prefixes so it runs under SQLite.
  • SQLMEM_SQL_DIALECT env var (default tsql) — sqlglot dialect used to parse incoming SQL; T-SQL also accepts ANSI SQL and MSSQL bracket quoting.
  • CacheManager.discover_columns() and CacheManager.is_table_full(); load_table() gained a full flag.

Changed

  • pyproject.toml — bumped version to 1.2.0
  • parser.pyParsedQuery.table: str replaced by tables: list[str] plus columns_by_table, sqlite_sql, params, and wildcard_tables; SQL is parsed with the configured dialect and rendered to SQLite for execution.
  • executor.py — loads each referenced table independently and applies query parameters during in-memory execution.
  • cache.py — schema version bumped to 2; _sqlmem_tables gained an is_full column (existing on-disk caches are discarded and rebuilt on load).

[1.1.0] - 2026-06-03

Added

  • Stats and TableStats frozen dataclasses — snapshot of runtime cache statistics (hit/miss/refetch counts, per-table row count, columns, last refresh timestamp)
  • StatsCollector — internal thread-safe counter; increments on every cache hit, miss, and re-fetch
  • engine.stats property — returns a Stats snapshot at any point in time
  • Stats and TableStats exported from the public API

Changed

  • pyproject.toml — bumped version to 1.1.0

[1.0.0] - 2026-06-03

Changed

  • pyproject.toml — bumped version to 1.0.0

[0.4.0] - 2026-06-03

Added

  • add_sink(sink, *, level, **kwargs) — public API for routing sqlmem log records to any loguru-compatible sink (stream, file, callable); supports all loguru logger.add() kwargs including rotation, retention, etc.

Changed

  • pyproject.toml — bumped version to 0.4.0
  • config.py — replaced destructive logger.remove() + forced default sink with logger.disable("sqlmem"); sqlmem is now silent by default and does not interfere with the host application's logging setup

[0.3.0] - 2026-06-03

Added

  • README.md — full project documentation: architecture overview, quick start, cache behaviour, persistence, configuration, exceptions, logging, and limitations

Changed

  • pyproject.toml — bumped version to 0.3.0
  • parser.py_extract_columns now deduplicates column names while preserving order
  • .gitignore — added .env and .env.* to prevent accidental commit of environment files

Security

  • Removed .env from git tracking (git rm --cached)

[0.2.0] - 2026-06-01

Added

  • Project specification in project.md — architecture, API design, cache backend, metadata schema, logging strategy, and TODO for future features (JOIN, SELECT * support)
  • .gitignore for Python/Poetry project
  • pyproject.toml dependencies: sqlglot, sqlalchemy, loguru, python-dotenv; dev dependencies: pytest, ruff, mypy
  • src/sqlmem/ package structure with src layout
  • src/sqlmem/exceptions.pyReadOnlyError (blocks INSERT/UPDATE/DELETE), UnsupportedQueryError (blocks JOIN and SELECT *)
  • src/sqlmem/config.py — loads .env, configures loguru with DEBUG/INFO level based on SQLMEM_DEBUG
  • src/sqlmem/_meta.py — package version constant
  • src/sqlmem/parser.py — SQL Parser using sqlglot; extracts table and columns from SELECT, raises on writes/JOIN/wildcard
  • src/sqlmem/registry.py — Column Registry; accumulates requested columns per table, detects missing columns requiring re-fetch
  • src/sqlmem/cache.py — Cache Manager; SQLite in-memory storage, load from cache.db on startup (with schema version check), hourly backup thread, atexit/SIGTERM flush, metadata tables (_sqlmem_meta, _sqlmem_tables, _sqlmem_columns)
  • src/sqlmem/executor.py — Query Executor; cache hit/miss logic, re-fetch on new columns with WARNING log
  • src/sqlmem/engine.pyCachingEngine wrapper; public API compatible with SQLAlchemy, invalidate(table) for manual cache clearing
  • src/sqlmem/__init__.py — public exports: CachingEngine, ReadOnlyError, UnsupportedQueryError
  • tests/test_parser.py — parser tests: SELECT parsing, ReadOnlyError, UnsupportedQueryError
  • tests/test_cache.py — cache tests: load, data correctness, metadata, disk backup/reload
  • tests/test_registry.py — registry tests: accumulation, needs_refetch, table isolation