[英]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.