哦!My Models (omymodels) 是一个库,用于从 SQL DDL 为 SQLAlchemy(ORM 和核心)、GinoORM、Pydantic、Pydal 表和 Python 数据类生成 Python 模型。并将一种模型转换为另一种模型。
项目描述
哦!我的模特
您可以在 github 上的 example/ 文件夹中找到大示例:https ://github.com/xnuinside/omymodels/tree/main/example
哦!My Models (omymodels) 是一个库,允许您从 SQL DDL生成不同的 ORM 和纯 Python 模型,或将一种模型类型转换为另一种(不包括 SQLAlchemy 表,py-models-parser 尚不支持它)。
支持的型号:
SQLAlchemy ( https://docs.sqlalchemy.org/en/14/orm/ ),
SQLAlchemy 核心(表)(https://docs.sqlalchemy.org/en/14/core/metadata.html#accessing-tables-and-columns),
GinoORM ( https://python-gino.org/ ),
Pydantic ( https://pydantic-docs.helpmanual.io/ ),
Python 枚举 ( https://docs.python.org/3/library/enum.html ) - 仅从 DDL SQL 类型生成,
Python 数据类(数据类模块)(https://docs.python.org/3/library/dataclasses.html),
如何安装
pip install omymodels
如何使用
来自 Python 代码
从 DDL 创建模型
默认方法create_models生成 GinoORM 模型,要获取 Pydantic 模型输出,请使用参数models_type='pydantic'('sqlalchemy' 用于 SQLAlchemy 模型;'dataclass' 用于 Dataclasses;'sqlalchemy_core' 用于 Sqlalchemy 核心表)。
测试中的很多示例/ - https://github.com/xnuinside/omymodels/tree/main/tests。
例如,
from omymodels import create_models
ddl = """
CREATE table user_history (
runid decimal(21) null
,job_id decimal(21) null
,id varchar(100) not null
,user varchar(100) not null
,status varchar(10) not null
,event_time timestamp not null default now()
,comment varchar(1000) not null default 'none'
) ;
"""
result = create_models(ddl, models_type='pydantic')['code']
# and output will be:
import datetime
from typing import Optional
from pydantic import BaseModel
class UserHistory(BaseModel):
runid: Optional[int]
job_id: Optional[int]
id: str
user: str
status: str
event_time: datetime.datetime
comment: str
要从 DDL 生成数据类,请使用参数models_type='dataclass'
例如:
# (same DDL as in Pydantic sample)
result = create_models(ddl, schema_global=False, models_type='dataclass')['code']
# and result will be:
import datetime
from dataclasses import dataclass
@dataclass
class UserHistory:
id: str
user: str
status: str
runid: int = None
job_id: int = None
event_time: datetime.datetime = datetime.datetime.now()
comment: str = 'none'
GinoORM 示例。如果您提供如下输入:
CREATE TABLE "users" (
"id" SERIAL PRIMARY KEY,
"name" varchar,
"created_at" timestamp,
"updated_at" timestamp,
"country_code" int,
"default_language" int
);
CREATE TABLE "languages" (
"id" int PRIMARY KEY,
"code" varchar(2) NOT NULL,
"name" varchar NOT NULL
);
你会得到输出:
from gino import Gino
db = Gino()
class Users(db.Model):
__tablename__ = 'users'
id = db.Column(db.Integer(), autoincrement=True, primary_key=True)
name = db.Column(db.String())
created_at = db.Column(db.TIMESTAMP())
updated_at = db.Column(db.TIMESTAMP())
country_code = db.Column(db.Integer())
default_language = db.Column(db.Integer())
class Languages(db.Model):
__tablename__ = 'languages'
id = db.Column(db.Integer(), primary_key=True)
code = db.Column(db.String(2))
name = db.Column(db.String())
从 cli
omm path/to/your.ddl
# for example
omm tests/test_two_tables.sql
您可以使用-t, -- target标志定义保存模型的目标路径:
# for example
omm tests/test_two_tables.sql -t test_path/test_models.py
如果您想生成 Pydantic 或 Dataclasses 模型 - 只需使用标志-m或–models_type='pydantic' / –models_type='dataclass'
omm /path/to/your.ddl -m dataclass
# or
omm /path/to/your.ddl --models_type pydantic
小型库用于解析 DDL- https://github.com/xnuinside/simple-ddl-parser。
如果 O!MyModels 不支持类型并且您不能等到 PR 获得批准该怎么办
首先,要将类型正确地从 DDL 解析为模型 - 它们必须在类型 mypping 中,对于 Gino,它在此文件中存在:
omymodels/gino/types.py types_mapping
如果您需要使用映射中不存在的快速类型 - 只需在使用 types_mapping.update() 调用代码之前做一个路径
例如:
from omymodels.models.gino import types
from omymodels import create_models
types.types_mapping.update({'your_type_from_ddl': 'db.TypeInGino'})
ddl = "YOUR DDL with your custom your_type_from_ddl"
models = create_models(ddl)
#### And similar for Pydantic types
from omymodels.models.pydantic import types types_mapping
from omymodels import create_models
types.types_mapping.update({'your_type_from_ddl': 'db.TypeInGino'})
ddl = "YOUR DDL with your custom your_type_from_ddl"
models = create_models(ddl, models_type='pydantic')
模式定义
有两种方法可以在模型中定义模式:
全局在 Gino() 类中,它将是这样的:
from gino import Gino
db = Gino(schema="schema_name")
这是在生成过程中放置模式的默认方式 - 它采用表中的第一个模式并使用它。
但是如果您使用不同模式中的表,则需要在 table_args 中的每个模型中定义模式。O!MyModels 也可以做到这一点。如果您使用 cli,只需使用标志--no-global-schema;如果您使用代码中的库,则将参数 'schema_global=False' 放入 create_models() 函数。像这样:
ddl = """
CREATE TABLE "prefix--schema-name"."table" (
_id uuid PRIMARY KEY,
one_more_id int
);
create unique index table_pk on "prefix--schema-name"."table" (one_more_id) ;
create index table_ix2 on "prefix--schema-name"."table" (_id) ;
"""
result = create_models(ddl, schema_global=False)
结果将是这样的:
from sqlalchemy.dialects.postgresql import UUID
from sqlalchemy.schema import UniqueConstraint
from sqlalchemy import Index
from gino import Gino
db = Gino()
class Table(db.Model):
__tablename__ = 'table'
_id = db.Column(UUID, primary_key=True)
one_more_id = db.Column(db.Integer())
__table_args__ = (
UniqueConstraint(one_more_id, name='table_pk'),
Index('table_ix2', _id),
dict(schema="prefix--schema-name")
)
下一个版本中的 TODO
在模型中添加序列生成(Gino,SQLAlchemy)
添加对纯 Python 类的支持(https://docs.python.org/3/tutorial/classes.html#class-objects)
添加对 Tortoise ORM 的支持(https://tortoise-orm.readthedocs.io/en/latest/),
添加对 DjangoORM 模型的支持
添加对 Pydal 模型的支持
添加对 Encode/orm 模型的支持
如何贡献
请描述您要解决的问题并打开 PR,我会尽快审核。
任何问题?在 Telegram 中联系我:https ://t.me/xnuinside或邮件xnuinside @ gmail 。com
如果您发现任何错误或有任何建议 - 请随时打开问题。任何帮助都会得到回报。
变更日志
v0.11.1
改进:
向 pydantic 添加字节类型 - https://github.com/xnuinside/omymodels/pull/31
解析器版本更新到最新
v0.11.0
修复:
[] 中的 MSSQL 列和表名称现在被有效解析 - https://github.com/xnuinside/omymodels/issues/28
像“users_WorkSchedule”这样的名称现在可以正确转换为像 UsersWorkSchedule 这样的 PascalCase
v0.10.1
将 simple-ddl-parser 版本更新为 0.21.2
v0.10.0
改进:
元模型移动到单独的包 - https://github.com/xnuinside/table-meta
通用模块重命名为from_ddl,但无论如何请使用公共 API 作为主模块的导入:
从 omymodels 导入 create_models或从 omymodels 导入 convert_models
修复:
修复了转换器中的一堆错误,但仍处于“测试版”中。
以前,如果 ddl 中有任何表,您可以生成模型。现在,如果在 ddl 中您只有 CREATE TYPE 语句,您还可以生成 Enum 模型。
现在任何模型类型中的字符串枚举都将继承自 (str, Enum)
特征:
添加了转换器功能以将一种模型类型转换为另一种(不包括 SQLAlchemy Core(表))。现在对受支持的模型进行了更多测试,但仍处于 Beta 版中,存在大量问题。
v0.9.0 特点:
添加了从一种模型到另一种模型的 beta 模型转换器。要使用模型转换器:
from omymodels import convert_models
models_from = """
class MaterialType(str, Enum):
article = "article"
video = "video"
@dataclass
class Material:
id: int
title: str
description: str
link: str
type: MaterialType
additional_properties: Union[dict, list]
created_at: datetime.datetime
updated_at: datetime.datetime
"""
result = convert_models(models_from, models_type="gino")
print(result)
其中models_type - 您想要获得的模型类型
现在,如果 O!MyModels 不知道如何转换类型 - 他就让它保持原样。
修复:
在 Dataclass 和 Pydantic 生成器中,现在 Decimals 和 Floats 转换为 float(以前是 int)。
v0.8.4
现在,如果在输入 DDL 中找不到表 - 模型生成器会引发 NoTable 错误。如果你想在没有表的情况下仍然静默退出,请使用标志:exit_silent
v0.8.3
添加了 TableMetaModel 的基本概念 - 类将从不同的类/ORM 模型类型/DDL 解析的元数据统一到一个标准,以便在下一个版本中轻松地将一个模型转换为另一个模型,它将用于从一种模型到另一种模型的转换器。
已修复问题:https ://github.com/xnuinside/omymodels/issues/18 “NOW() 无法识别为 now()”
修复问题:https ://github.com/xnuinside/omymodels/issues/19 “now() 的默认值总是同时返回,使用数据类的字段”
v0.8.1
解析器版本已更新(修复了生成的几个问题)
修复了 SQLAlchemy Core 中架构后唯一约束的问题
v0.8.0
修复 cli 中的 –defaults-off 标志
添加了对生成 SQLAlchemy 核心表的支持
在 github omymodels/example中添加了示例文件夹
修复 SQLAlchemy 中 ForeignKey 的问题
v0.7.0
为 SQLAlchemy 模型添加了生成(来自 DDL 的默认设置为“server_default”)
为 Pydantic 模型添加了默认值
添加了生成 Pydantic 和 Dataclass 模型的标志,没有默认值defaults_off=True(默认为 False)。和 cli 标志 --defaults-off
修复了 DDL 中具有小写名称的枚举类型的问题
修复了数据类生成的几个问题(默认使用日期时间和枚举)
'”' 现在不要从默认值中删除
v0.6.0
O!MyModels 现在也可以从 DDL 生成 python 数据类。使用参数 models_type='dataclass' 或者如果您使用 cli 标志 –models_type dataclass 或 -m dataclass
为 GinoORM 模型添加了 ForeignKey 生成,添加了对 ondelete 和 onupdate 的支持
v0.5.0
为 Gino 和 Pydantic 添加了 Enums/IntEnums 类型
添加了 UUID 类型
在 create_models 方法中添加了 key schema_global(默认 schema_global = True)。如果设置 schema_global=False 模式,如果它存在于 ddl 中,将为表 args 中的每个表(模型)定义。这样,您可以为每个模型(表)提供不同的模式。默认情况下 schema_global=True - 这意味着所有表只有一个模式,它在db = Gino(schema="prefix--schema-name")中定义。
如果列是主键 (primary_key=True),则不显示可为空的参数,因为主键始终不为空。
在 cli 中添加了标志 '–no-global-schema' 以在 table_args 中设置模式。
v0.4.1
添加了正确使用表名的工作包含多个“-”
v0.4.0
从 ddl 为 Pydantic 模型添加了生成
主方法 create_gino_models 重命名为 create_models
v0.3.0
为table_args中的“索引”语句生成索引(不是以前的唯一约束)
修复列大小为元组 (4,2) 的问题
v0.2.0
模型中的有效生成列:自动增量、默认值、类型、数组、唯一性、主键等。
添加了为索引创建table_args
项目详情
下载文件
下载适用于您平台的文件。如果您不确定要选择哪个,请了解有关安装包的更多信息。