我生成了一个Pydantic模型,并希望将它导入SQLModel。由于上述模型不是从SQLModel类继承的,所以它没有在元数据中注册,这就是为什么。
SQLModel.metadata.create_all(engine)忽略它就好。
在这一讨论中,我找到了一种手动添加模型的方法:
SQLModel.metadata.tables["hero"].create(engine)但是这样做为我抛出了一个KeyError。
SQLModel.metadata.tables["sopro"].create(engine)
KeyError: 'sopro'我用这种方式解决这个问题的动机是,我想从这样一个简单的字典中生成一个SQLModel:
model_dict = {"feature_a": int, "feature_b": str}在这就是答案中,我找到了一种可行的方法。提前感谢您的帮助!
发布于 2022-10-24 20:42:29
据我所知,在运行时不可能简单地将现有的Pydantic模型转换为SQLModel。(至少到现在为止。)
在模型定义过程中会发生很多事情。这涉及到一个自定义元类,因此您不可能简单地替换一个常规的Pydantic模型类来代替一个真正的SQLModel类,除非手动地对所有缺失的片段进行猴子标记。
尽管如此,您澄清了您的实际动机是能够在运行时根据字段定义的字典动态创建SQLModel类。幸运的是,这实际上是可能的。您所需要做的就是使用Pydantic create_model函数并传递正确的__base__和__cls_kwargs__参数:
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)应该根据您的字段定义创建相应的数据库表。
有关更多详细信息,请参阅这个问题。
确保对字段定义使用正确的表单,因为您给出的示例将无效。如文档所述,您需要以二元组(或仅为默认值)的形式定义字段:
model_dict = {
"feature_a": (int, ...),
"feature_b": (str, ...),
"feature_c": 3.14,
}希望这能有所帮助。
https://stackoverflow.com/questions/74175111
复制相似问题