Skip to main content

A Python tool for generating Python classes from SQL files

Project description

splurge-sql-generator

PyPI version Python versions License: MIT

CI Coverage Ruff mypy

A compact summary of splurge-sql-generator — a tool to generate Python (SQLAlchemy-friendly) classes from SQL template files with schema-aware type inference.

See the full documentation and details in the repository:

  • Detailed docs: docs/README-DETAILS.md
  • API reference: docs/api/API-REFERENCE.md
  • CLI reference: docs/cli/CLI-REFERENCE.md
  • Full changelog: CHANGELOG.md

Key features

  • SQL template parsing and method extraction from commented templates
  • Schema-based type inference for accurate Python type annotations
  • Configurable SQL-to-Python type mapping via YAML files (types.yaml / --types)
  • CLI for batch generation with automatic schema discovery and --generate-types
  • Strong SQL parsing with sqlparse and explicit error reporting

Getting started

  1. Install: pip install splurge-sql-generator or pip install -e . for development
  2. Read the full docs in docs/README-DETAILS.md

For examples and advanced usage see examples/ in the repository. Parse column definitions from table body using sqlparse tokens. Raises SqlValidationError if parsing fails or no valid columns are found.

What's new (2025.5.0)

  • Centralized Safe I/O adapter (SafeTextFileIoAdapter) for consistent file error handling and simplified I/O usage across the library.
  • Stabilized cross-version error messages and improved validation for schema file arguments.
  • Documentation: comprehensive API and CLI reference files added to docs/.

extract_table_names(sql_query: str) -> list[str]

Extract table names from SQL query using sqlparse. Raises SqlValidationError if parsing fails or no table names are found.

generate_types_file(*, output_path: str | None = None) -> str

Generate the default SQL type mapping YAML file.

Supported SQL Features

  • Basic DML: SELECT, INSERT, UPDATE, DELETE
  • CTEs: Common Table Expressions (WITH clauses)
  • Complex Queries: Subqueries, JOINs, aggregations
  • Database-Specific: SHOW, EXPLAIN, DESCRIBE, VALUES
  • Parameters: Named parameters with :param_name syntax
  • Comments: Single-line (--) and multi-line (/* */) comments

Generated Code Features

  • Accurate Type Hints: Schema-based type inference for precise parameter and return value annotations
  • Custom Type Support: Configurable SQL-to-Python type mappings for project-specific needs
  • Parameter Validation: Optional validation of SQL parameters against schema definitions
  • Multi-Database Types: Built-in support for SQLite, PostgreSQL, MySQL, MSSQL, and Oracle types
  • Docstrings: Comprehensive documentation for each method
  • Error Handling: Proper SQLAlchemy result handling with fail-fast validation
  • Parameter Mapping: Automatic mapping of SQL parameters to Python arguments with inferred types
  • Statement Type Detection: Correct return types based on SQL statement type
  • Auto-Generated Headers: Clear identification of generated files

Error Handling and Validation

The library provides robust error handling with a fail-fast approach to ensure data integrity and clear error reporting:

SQL Parsing Validation

  • Strict SQL Parsing: Functions like parse_table_columns() and extract_table_names() use sqlparse for reliable parsing
  • No Fallback Mechanisms: Eliminates unreliable regex-based fallback parsing in favor of clear error reporting
  • Clear Error Messages: Functions raise SqlValidationError with descriptive messages when parsing fails
  • Validation Checks: Ensures valid column definitions and table names are found before processing

Error Types

  • SqlValidationError: Raised when SQL parsing fails or validation checks fail
  • SqlFileError: Raised for file operation errors (file not found, permission denied, etc.)
  • Clear Context: Error messages include file paths, referenced tables, and available columns for debugging

Example Error Handling

from splurge_sql_generator.exceptions import SqlValidationError, SqlFileError

try:
    # This will raise SqlValidationError if no valid columns are found
    columns = parse_table_columns("CONSTRAINT pk_id PRIMARY KEY (id)")
except SqlValidationError as e:
    print(f"SQL validation failed: {e}")

try:
    # This will raise SqlValidationError if no table names are found
    tables = extract_table_names("SELECT 1 as value")
except SqlValidationError as e:
    print(f"SQL validation failed: {e}")

try:
    # This will raise SqlValidationError for empty input
    columns = parse_table_columns("")
except SqlValidationError as e:
    print(f"SQL validation failed: {e}")

Development

Running Tests

python -m unittest discover -s tests -v

Project Structure

splurge-sql-generator/
├── splurge_sql_generator/
│   ├── __init__.py          # Main package exports
│   ├── sql_helper.py        # SQL parsing utilities
│   ├── sql_parser.py        # SQL template parser
│   ├── schema_parser.py     # SQL schema parser for type inference
│   ├── code_generator.py    # Python code generator
│   ├── cli.py               # Command-line interface
│   └── templates/           # Jinja2 templates (python_class.j2)
├── tests/                   # Test suite
├── examples/                # Example SQL templates and schemas
│   ├── *.sql                # SQL template files
│   ├── *.schema             # SQL schema files for type inference
│   └── custom_types.yaml    # Example custom type mapping
├── output/                  # Generated code examples
└── types.yaml               # Default SQL type mappings

License

MIT License - see LICENSE file for details.

Contributing

  1. Fork the repository
  2. Create a feature branch
  3. Make your changes
  4. Add tests for new functionality
  5. Run the test suite
  6. Submit a pull request

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

splurge_sql_generator-2025.5.1.tar.gz (38.0 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

splurge_sql_generator-2025.5.1-py3-none-any.whl (40.9 kB view details)

Uploaded Python 3

File details

Details for the file splurge_sql_generator-2025.5.1.tar.gz.

File metadata

  • Download URL: splurge_sql_generator-2025.5.1.tar.gz
  • Upload date:
  • Size: 38.0 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.12.10

File hashes

Hashes for splurge_sql_generator-2025.5.1.tar.gz
Algorithm Hash digest
SHA256 64f5594e842dbc586514febb455c7ad810537f43396334b42b376957a883149f
MD5 4594f86d7f51f7e3bbf1706cd196a5ea
BLAKE2b-256 a02eb46fb01e5f179aaa1b819d761c67b59ac888a181307575a0f004225ef395

See more details on using hashes here.

File details

Details for the file splurge_sql_generator-2025.5.1-py3-none-any.whl.

File metadata

File hashes

Hashes for splurge_sql_generator-2025.5.1-py3-none-any.whl
Algorithm Hash digest
SHA256 787d7de62e41be5c7d2b2b962d742280d19cbf89e7710e392472d4d2b161f385
MD5 80e45694621a70473793e2353ca98417
BLAKE2b-256 0f61e5e13cb5cf6784c27f56fa7531278ffc76c4c9d327a865f53195e4921db6

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page