[1.0.0] - 2025-01-18
Breaking Changes
- Dropped support for Python 3.7 and 3.8
- Minimum required Python version is now 3.9
Added
Pydantic v2 Support
- New
pydantic_v2models type with native Pydantic v2 syntax - Uses
X | Noneinstead ofOptional[X] - Uses
dict | listfor JSON/JSONB types instead ofJson - Adds
from __future__ import annotationsfor Python 3.9 compatibility - Nullable fields automatically get
= Nonedefault
OpenAPI 3 (Swagger) Support
- Generate OpenAPI 3 schemas from DDL:
create_models(ddl, models_type="openapi3") - Convert OpenAPI 3 schemas to Python models:
create_models_from_openapi3(schema) - Supports JSON and YAML input (with pyyaml)
Plugin System for Custom Generators
register_generator()- register custom generatorunregister_generator()- remove custom generatorlist_generators()- list all available generators- Base classes:
BaseGenerator,ORMGenerator,DataModelGenerator TypeConverterclass for type mappings- Entry points support for auto-discovery
- See examples:
example/custom_generator.py,example/extend_builtin_generator.py
Pydantic Improvements
- Field alias support for invalid Python identifiers
- Handle Pydantic reserved names (copy, parse_obj, schema, etc.)
- Support for generated columns (
GENERATED ALWAYS AS) withexclude=True table_prefixandtable_suffixparameters for class name customization- Boolean defaults 0/1 converted to False/True
- Expanded
datetime_now_checkwith more SQL datetime keywords - VARCHAR(n) and CHAR(n) now generate
Field(max_length=n)for Pydantic validation (issue #48)
SQLAlchemy 2.0 Support (issue #49)
- New
sqlalchemy_v2models type with modern SQLAlchemy 2.0 syntax - Uses
DeclarativeBaseinstead of deprecateddeclarative_base() - Uses
Mapped[T]type annotations for columns - Uses
mapped_column()instead ofColumn() - Uses
X | Noneunion syntax for nullable columns - Supports all column types, foreign keys, indexes, and constraints
SQLAlchemy Relationships (issue #47)
- New
relationshipsparameter forcreate_models()to generaterelationship()withback_populates - Automatically generates bidirectional relationships for foreign keys:
- Parent side (one-to-many): collection attribute pointing to children
- Child side (many-to-one): attribute pointing to parent
- Works with both
sqlalchemyandsqlalchemy_v2model types - For
sqlalchemy_v2: usesMapped[List[T]]for one-to-many andMapped[T]for many-to-one
Schema-Separated Model Files (issue #40)
- New
split_by_schemaparameter forcreate_models()to generate separate files per database schema - Each schema gets its own file with a schema-specific Base class (e.g.,
Schema1Base) - Tables without explicit schema go to a file with the default
Baseclass - Works with both
sqlalchemyandsqlalchemy_v2model types - File naming:
{schema_name}_{base_filename}.py(e.g.,schema1_models.py)
Pydal Model Conversion (issue #30)
- Convert Pydal table definitions to any supported model type using
convert_models() - Supports all output formats: SQLAlchemy, SQLAlchemy v2, Gino, Pydantic, Pydantic v2, Dataclass, SQLModel
- Handles Pydal types:
id,string,text,integer,boolean,datetime,date,float,decimal - Pydal's
idtype maps to primary key - Pydal's
reference table_nametype maps to foreign key
SQLModel Improvements
- Fixed array type generation (issue #66)
- Arrays now properly generate
List[T]with correct SQLAlchemy ARRAY type - Added
typing_importssupport for List import - Added
pydantic_to_sa_fallbackmapping for array element types
MySQL Support
- Added blob types support:
tinyblob,blob,mediumblob,longblobmap tobytes(issue #62)
Other
- Added support for Python 3.12 and 3.13
- Added tox configuration for local multi-version testing (py39-py313)
- Added pytest-cov for code coverage reporting
Changed
- Simplified datetime imports (
from datetime import datetimeinstead ofimport datetime) - Use
Anytype instead ofJsonfor json/jsonb columns in Pydantic - Enum generation now uses functional syntax:
Enum(value='Name', names=[...]) - Updated GitHub Actions workflow with latest action versions (checkout@v4, setup-python@v5)
- Updated py-models-parser to version 1.0.0
- Reorganized types module with TypeConverter class
Fixed
- Fixed dependency conflict with simple-ddl-generator: relaxed
table-metaconstraint to>=0.1.5(issue #46) - Fixed
iterate_over_the_list()modifying list during iteration - Fixed meaningless condition in dataclass generator
- Fixed incorrect column type crash (PR #63)
- Fixed enums including whitespace in values (issue #69)
- Fixed boolean values capitalization - now generates
True/Falseinstead oftrue/false(PR #67) - Fixed SQLModel array type generation TypeError (issue #66)
- Fixed MySQL blob types not mapping to
bytes(issue #62) - Fixed
sqlalchemy_coregenerator missing column names in output - Fixed
sqlalchemy_coregenerator not including type name with size (e.g.,String(255)) - Fixed
sqlalchemy_coregenerator ForeignKey positional argument order
Documentation
- Added ARCHITECTURE.md with project documentation
- Updated documentation with Pydantic v2 examples