Skip to main content

哦!My Models (omymodels) 是一个库,用于从 SQL DDL 为 SQLAlchemy(ORM 和核心)、GinoORM、Pydantic、Pydal 表和 Python 数据类生成 Python 模型。并将一种模型转换为另一种模型。

项目描述

哦!我的模特

徽章1 徽章2 徽章3 工作流程

您可以在 github 上的 example/ 文件夹中找到大示例:https ://github.com/xnuinside/omymodels/tree/main/example

哦!My Models (omymodels) 是一个库,允许您从 SQL DDL生成不同的 ORM 和纯 Python 模型,或一种模型类型转换为另一种(不包括 SQLAlchemy 表,py-models-parser 尚不支持它)。

支持的型号:

如何安装

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')

模式定义

有两种方法可以在模型中定义模式:

  1. 全局在 Gino() 类中,它将是这样的:

from gino import Gino
db = Gino(schema="schema_name")

这是在生成过程中放置​​模式的默认方式 - 它采用表中的第一个模式并使用它。

  1. 但是如果您使用不同模式中的表,则需要在 table_args 中的每个模型中定义模式。O!MyModels 也可以做到这一点。如果您使用 cli,只需使用标志--no-global-schema;如果您使用代码中的库,则将参数 'schema_g​​lobal=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

  1. 在模型中添加序列生成(Gino,SQLAlchemy)

  2. 添加对纯 Python 类的支持(https://docs.python.org/3/tutorial/classes.html#class-objects

  3. 添加对 Tortoise ORM 的支持(https://tortoise-orm.readthedocs.io/en/latest/),

  4. 添加对 DjangoORM 模型的支持

  5. 添加对 Pydal 模型的支持

  6. 添加对 Encode/orm 模型的支持

如何贡献

请描述您要解决的问题并打开 PR,我会尽快审核。

任何问题?在 Telegram 中联系我:https ://t.me/xnuinside或邮件xnuinside @ gmail com

如果您发现任何错误或有任何建议 - 请随时打开问题。任何帮助都会得到回报。

变更日志

v0.11.1

改进:

  1. 向 pydantic 添加字节类型 - https://github.com/xnuinside/omymodels/pull/31

  2. 解析器版本更新到最新

v0.11.0

修复:

  1. [] 中的 MSSQL 列和表名称现在被有效解析 - https://github.com/xnuinside/omymodels/issues/28

  2. 像“users_WorkSchedule”这样的名称现在可以正确转换为像 UsersWorkSchedule 这样的 PascalCase

v0.10.1

  1. 将 simple-ddl-parser 版本更新为 0.21.2

v0.10.0

改进:

  1. 元模型移动到单独的包 - https://github.com/xnuinside/table-meta

  2. 通用模块重命名为from_ddl,但无论如何请使用公共 API 作为主模块的导入:

从 omymodels 导入 create_models从 omymodels 导入 convert_models

修复:

  1. 修复了转换器中的一堆错误,但仍处于“测试版”中。

  2. 以前,如果 ddl 中有任何表,您可以生成模型。现在,如果在 ddl 中您只有 CREATE TYPE 语句,您还可以生成 Enum 模型。

  3. 现在任何模型类型中的字符串枚举都将继承自 (str, Enum)

特征:

  1. 添加了转换器功能以将一种模型类型转换为另一种(不包括 SQLAlchemy Core(表))。现在对受支持的模型进行了更多测试,但仍处于 Beta 版中,存在大量问题。

v0.9.0 特点:

  1. 添加了从一种模型到另一种模型的 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 - 您想要获得的模型类型

  1. 现在,如果 O!MyModels 不知道如何转换类型 - 他就让它保持原样。

修复:

  1. 在 Dataclass 和 Pydantic 生成器中,现在 Decimals 和 Floats 转换为 float(以前是 int)。

v0.8.4

  1. 现在,如果在输入 DDL 中找不到表 - 模型生成器会引发 NoTable 错误。如果你想在没有表的情况下仍然静默退出,请使用标志:exit_silent

v0.8.3

  1. 添加了 TableMetaModel 的基本概念 - 类将从不同的类/ORM 模型类型/DDL 解析的元数据统一到一个标准,以便在下一个版本中轻松地将一个模型转换为另一个模型,它将用于从一种模型到另一种模型的转换器。

  2. 已修复问题:https ://github.com/xnuinside/omymodels/issues/18 “NOW() 无法识别为 now()”

  3. 修复问题:https ://github.com/xnuinside/omymodels/issues/19 “now() 的默认值总是同时返回,使用数据类的字段”

v0.8.1

  1. 解析器版本已更新(修复了生成的几个问题)

  2. 修复了 SQLAlchemy Core 中架构后唯一约束的问题

v0.8.0

  1. 修复 cli 中的 –defaults-off 标志

  2. 添加了对生成 SQLAlchemy 核心表的支持

  3. 在 github omymodels/example中添加了示例文件夹

  4. 修复 SQLAlchemy 中 ForeignKey 的问题

v0.7.0

  1. 为 SQLAlchemy 模型添加了生成(来自 DDL 的默认设置为“server_default”)

  2. 为 Pydantic 模型添加了默认值

  3. 添加了生成 Pydantic 和 Dataclass 模型的标志,没有默认值defaults_off=True(默认为 False)。和 cli 标志 --defaults-off

  4. 修复了 DDL 中具有小写名称的枚举类型的问题

  5. 修复了数据类生成的几个问题(默认使用日期时间和枚举)

  6. '”' 现在不要从默认值中删除

v0.6.0

  1. O!MyModels 现在也可以从 DDL 生成 python 数据类。使用参数 models_type='dataclass' 或者如果您使用 cli 标志 –models_type dataclass 或 -m dataclass

  2. 为 GinoORM 模型添加了 ForeignKey 生成,添加了对 ondelete 和 onupdate 的支持

v0.5.0

  1. 为 Gino 和 Pydantic 添加了 Enums/IntEnums 类型

  2. 添加了 UUID 类型

  3. 在 create_models 方法中添加了 key schema_g​​lobal(默认 schema_g​​lobal = True)。如果设置 schema_g​​lobal=False 模式,如果它存在于 ddl 中,将为表 args 中的每个表(模型)定义。这样,您可以为每个模型(表)提供不同的模式。默认情况下 schema_g​​lobal=True - 这意味着所有表只有一个模式,它在db = Gino(schema="prefix--schema-name")中定义。

  4. 如果列是主键 (primary_key=True),则不显示可为空的参数,因为主键始终不为空。

  5. 在 cli 中添加了标志 '–no-global-schema' 以在 table_args 中设置模式。

v0.4.1

  1. 添加了正确使用表名的工作包含多个“-”

v0.4.0

  1. 从 ddl 为 Pydantic 模型添加了生成

  2. 主方法 create_gino_models 重命名为 create_models

v0.3.0

  1. 为table_args中的“索引”语句生成索引(不是以前的唯一约束)

  2. 修复列大小为元组 (4,2) 的问题

v0.2.0

  1. 模型中的有效生成列:自动增量、默认值、类型、数组、唯一性、主键等。

  2. 添加了为索引创建table_args

下载文件

下载适用于您平台的文件。如果您不确定要选择哪个,请了解有关安装包的更多信息。

源分布

omymodels-0.11.1.tar.gz (26.6 kB 查看哈希

已上传 source

内置分布

omymodels-0.11.1-py3-none-any.whl (32.7 kB 查看哈希

已上传 py3