首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在SQLModel中使用JSON列

如何在SQLModel中使用JSON列
EN

Stack Overflow用户
提问于 2022-01-03 15:24:27
回答 1查看 2.7K关注 0票数 7

我试图通过SQLModel定义JSON列:

代码语言:javascript
复制
from typing import Optional
from sqlmodel import Field, Session, SQLModel, create_engine, JSON


class Hero(SQLModel, table=True):
    id: Optional[int] = Field(default=None, primary_key=True)
    name: str
    secret_name: str
    age: Optional[int] = None
    meta: JSON

代码来自SQLModel,但由"meta“属性扩展。

使用上面的代码和示例代码的其余部分(设置sqlite,添加数据),我得到以下错误:

代码语言:javascript
复制
RuntimeError: no validator found for <class 'sqlalchemy.sql.sqltypes.JSON'>, see `arbitrary_types_allowed` in Config

我试图通过以下方式扩展代码

代码语言:javascript
复制
class Hero(SQLModel, table=True):
    [...]
    meta: JSON

    @validator('meta')
    def validate_json(v):
        return v

    class Config:
        arbitrary_types_allowed = True 

但这会导致另一个错误:

代码语言:javascript
复制
sqlalchemy.exc.CompileError: (in table 'hero', column 'meta'): Can't generate DDL for NullType(); did you forget to specify a type on this Column?

我试过只使用SQLAlchemy,它已经成功了。

那么,对于JSON字段,我怎样才能在SQLModel和SQLAlchemy之间实现“连接”呢?

更新:我还测试了设置它的可选性,并给它一个默认值。没有成功(2.再次出错):

代码语言:javascript
复制
class Hero(SQLModel, table=True):
    [...]
    meta: Optional[JSON] = {}

    class Config:
        arbitrary_types_allowed = True 

小提示:即使JSON是从SQLModel导入的,它最终也是从SQLAlchemy.sqltypes导入的,没有任何更改。

EN

回答 1

Stack Overflow用户

发布于 2022-01-10 22:22:07

我相信您正在寻找的连接可能是由字段的sa_column参数提供的,例如:

代码语言:javascript
复制
class Hero(SQLModel, table=True):
    [...]

    meta: Dict = Field(default={}, sa_column=Column(JSON))

    # Needed for Column(JSON)
    class Config:
        arbitrary_types_allowed = True
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70567929

复制
相关文章

相似问题

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