Simple DDL Generator generate SQL DDL from 3 different inputs. Idea of the generator same as for parser to support as much as possible DDLs in future.
Simple DDL Generator generate SQL DDL from 3 input formats - 1st from output Simple DDL Parser (https://github.com/xnuinside/simple-ddl-parser), 2nd from py-models-parser - https://github.com/xnuinside/py-models-parser. Or you can directly pass TableMeta classes (https://github.com/xnuinside/table-meta) to generator
Now DDL support pure SQL DDL diclaect and bunch of HQL statements.
Generator can generate DDL from all models that supported & parsed by https://github.com/xnuinside/py-models-parser.
If you need DDL generation from another Python Model types - open issue request to add support for this models in parser.
As usually - more samples in tests/
pip install simple-ddl-generator Sample how you can modify your DDL using Simple DDL Parser & Simple DDL Parser
from simple_ddl_generator import DDLGenerator from simple_ddl_parser import DDLParser # take initial DDL ddl = """CREATE EXTERNAL TABLE IF NOT EXISTS database.table_name ( day_long_nm string, calendar_dt date, source_batch_id string, field_qty decimal(10, 0), field_bool boolean, field_float float, create_tmst timestamp, field_double double, field_long bigint ) PARTITIONED BY (batch_id int);""" # get result from parser data = DDLParser(ddl).run(group_by_type=True, output_mode="bigquery") # rename, for example, table name data["tables"][0]["table_name"] = "new_table_name" g = DDLGenerator(data) g.generate() print(g.result) # and result will be: """ CREATE EXTERNAL TABLE "database.new_table_name" ( day_long_nm string, calendar_dt date, source_batch_id string, field_qty decimal(10, 0), field_bool boolean, field_float float, create_tmst timestamp, field_double double, field_long bigint) PARTITIONED BY (batch_id int); """ from simple_ddl_generator import DDLGenerator from py_models_parser import parse # you can also read them from file model_from = """ class Material(BaseModel): id: int title: str description: Optional[str] link: str = 'http://' type: Optional[MaterialType] additional_properties: Optional[Json] created_at: Optional[datetime.datetime] = datetime.datetime.now() updated_at: Optional[datetime.datetime] """ # get data with parser result = parse(model_from) # if you want lower case table name before DDL generation you can just change in the result metadata, like this: # result[0].table_name = "material" # pass data to DDL Generator g = DDLGenerator(result) g.generate() print(g.result) # resul will be """CREATE TABLE "Material" ( id INTEGER, title VARCHAR, description VARCHAR, link VARCHAR DEFAULT 'http://', type MaterialType, additional_properties JSON, created_at DATETIME DEFAULT now(), updated_at DATETIME); """Now parser also generate CREATE TYPE statements.
For example (sample for generation DDL from Dataclasses):
from simple_ddl_generator import DDLGenerator from py_models_parser import parse model_from = """ class MaterialType(str, Enum): article = 'article' video = 'video' @dataclass class Material: id: int description: str = None additional_properties: Union[dict, list, tuple, anything] = None created_at: datetime.datetime = datetime.datetime.now() updated_at: datetime.datetime = None @dataclass class Material2: id: int description: str = None additional_properties: Union[dict, list] = None created_at: datetime.datetime = datetime.datetime.now() updated_at: datetime.datetime = None """ result = parse(model_from) g = DDLGenerator(result) g.generate() print(g.result) # result will be: """CREATE TYPE MaterialType AS ENUM ('article','video'); CREATE TABLE Material ( id INTEGER, description VARCHAR DEFAULT NULL, additional_properties JSON DEFAULT NULL, created_at DATETIME DEFAULT now(), updated_at DATETIME DEFAULT NULL); CREATE TABLE Material2 ( id INTEGER, description VARCHAR DEFAULT NULL, additional_properties JSON DEFAULT NULL, created_at DATETIME DEFAULT now(), updated_at DATETIME DEFAULT NULL); """v0.4.1 New Features:
- Added COMMENT statement to table generation
Improvements:
- Added test to catch debug output (reminder: stop release at the middle night)
Fixes:
- Fixed issue with
v0.4.0 New Features:
- Added base support for REFERENCE statement generation
- Added UNIQUE to column
- Added PRIMARY KEY to column
- To DDLGenerator added param lowercase to lowercase tables name.
v0.3.0 New Features:
- Added CREATE TYPE generation from Python Enum & simple-ddl-parser types metadata
Improvements:
- Added more test cases with models into tests
- Now output generated with empty line at the end
Fixes:
- Fixed issue with "" in names if quotes already exists in table-name in metadata
v0.2.0
- Updated parser version in tests.
- Added support for EXTERNAL & IF NOT EXISTS statetements.
- Added support for using py-models-parser output as input and added sample in README.md:
DDL Generation from Pydantic, SQLAlchemy and other python models.
v0.1.0
Base Generator Functionality with several test cases.