首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何将Pydantic模型导入SQLModel?

如何将Pydantic模型导入SQLModel?
EN

Stack Overflow用户
提问于 2022-10-23 21:58:58
回答 1查看 82关注 0票数 1

我生成了一个Pydantic模型,并希望将它导入SQLModel。由于上述模型不是从SQLModel类继承的,所以它没有在元数据中注册,这就是为什么。

代码语言:javascript
复制
SQLModel.metadata.create_all(engine)

忽略它就好。

这一讨论中,我找到了一种手动添加模型的方法:

代码语言:javascript
复制
SQLModel.metadata.tables["hero"].create(engine)

但是这样做为我抛出了一个KeyError

代码语言:javascript
复制
SQLModel.metadata.tables["sopro"].create(engine)
KeyError: 'sopro'

我用这种方式解决这个问题的动机是,我想从这样一个简单的字典中生成一个SQLModel:

代码语言:javascript
复制
model_dict = {"feature_a": int, "feature_b": str}

这就是答案中,我找到了一种可行的方法。提前感谢您的帮助!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-10-24 20:42:29

据我所知,在运行时不可能简单地将现有的Pydantic模型转换为SQLModel。(至少到现在为止。)

在模型定义过程中会发生很多事情。这涉及到一个自定义元类,因此您不可能简单地替换一个常规的Pydantic模型类来代替一个真正的SQLModel类,除非手动地对所有缺失的片段进行猴子标记。

尽管如此,您澄清了您的实际动机是能够在运行时根据字段定义的字典动态创建SQLModel类。幸运的是,这实际上是可能的。您所需要做的就是使用Pydantic create_model函数并传递正确的__base____cls_kwargs__参数:

代码语言:javascript
复制
from pydantic import create_model
from sqlmodel import SQLModel

field_definitions = {
    # your field definitions here
}

Hero = create_model(
    "Hero",
    __base__=SQLModel,
    __cls_kwargs__={"table": True},
    **field_definitions,
)

这样,SQLModel.metadata.create_all(engine)应该根据您的字段定义创建相应的数据库表。

有关更多详细信息,请参阅这个问题

确保对字段定义使用正确的表单,因为您给出的示例将无效。如文档所述,您需要以二元组(或仅为默认值)的形式定义字段:

代码语言:javascript
复制
model_dict = {
    "feature_a": (int, ...),
    "feature_b": (str, ...),
    "feature_c": 3.14,
}

希望这能有所帮助。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/74175111

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档