簡體   English   中英

SQLModel:禁止突變

[英]SQLModel: Forbid mutation

from sqlmodel import SQLModel


class Foo(SQLModel):
    bar: str
        
    class Config:
        """
        Forbid mutation in order to freeze the inheriting classes
        """
        allow_mutation = False


foo = Foo(bar='bar')

產品

---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
/tmp/ipykernel_3092/4259691966.py in <module>
----> 1 foo = Foo(bar='bar')

/usr/local/lib/python3.8/site-packages/sqlmodel/main.py in __init__(__pydantic_self__, **data)
    512         object.__setattr__(__pydantic_self__, "__fields_set__", fields_set)
    513         for key, value in values.items():
--> 514             setattr(__pydantic_self__, key, value)
    515         non_pydantic_keys = data.keys() - values.keys()
    516         for key in non_pydantic_keys:

/usr/local/lib/python3.8/site-packages/sqlmodel/main.py in __setattr__(self, name, value)
    530             # non relationship values
    531             if name not in self.__sqlmodel_relationships__:
--> 532                 super().__setattr__(name, value)
    533 
    534     @classmethod

/usr/local/lib/python3.8/site-packages/pydantic/main.cpython-38-x86_64-linux-gnu.so in pydantic.main.BaseModel.__setattr__()

TypeError: "Foo" is immutable and does not support item assignment

問題:是否可以禁止SQLModel class 的突變?

上下文:我有一個代碼庫,其中包含基於凍結的 Pydantic 類構建的所有數據 model 類,我想從BaseModel遷移到SQLModel以存儲繼承的表類。

當然allow_mutation=True就像一個魅力。

這可以說是SQLModel.__init__的當前(0.0.8)實現中的一個錯誤。

它調用自己的__setattr__ ,后者又調用BaseModel.__setattr__ 因為突變是被禁止的,所以你得到了錯誤。 這已經在這里提到了。 我還沒有看到修復它的 PR,所以可能需要一段時間。

編輯:

下面的代碼不是可用的解決方法 BaseModel.__config__是一個 class 變量,這意味着使用這段代碼,您在第一次初始化后仍然有效地設置allow_mutation=False 也許有人可以想出一個關於如何解決這個問題的想法。

原文部分:

同時,這里有一個可能的解決方法:

from sqlmodel import SQLModel


class ImmutableSQLModel(SQLModel):
    def __init__(self, **data: object) -> None:
        super().__init__(**data)
        self.__config__.allow_mutation = False


class Foo(ImmutableSQLModel):
    bar: str


if __name__ == "__main__":
    foo = Foo(bar="bar")
    print(foo)
    try:
        foo.bar = "baz"
    except Exception as e:
        print(repr(e))

Output:

bar='bar'
TypeError('"Foo" is immutable and does not support item assignment')

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM