ValueError: <class 'dict'> has no matching SQLAlchemy type #1308
-
First Check
Commit to Help
Example Codefrom typing import List, Optional, Dict, Any
from pydantic import BaseModel, Field, field_validator
from sqlalchemy.dialects.postgresql import JSONB
from sqlalchemy.ext.mutable import MutableDict
from sqlmodel import SQLModel
class Combo(SQLModel, table=True):
__tablename__ = "combo"
__table_args__ = {'schema': 'public'}
id: Optional[int] = Field(primary_key=True)
update_date: datetime = Field(default_factory=datetime.now, index=True)
difficult: int
pos_x: int
pos_y: int
front_pos: dict[str, float] = Field(default_factory=dict, sa_type=MutableDict.as_mutable(JSONB))
data: dict[str, Any] = Field(default_factory=dict, sa_type=MutableDict.as_mutable(JSONB))
# or
# front_pos: Dict = Field(default_factory=dict, sa_type=JSONB)
# data: Dict = Field(default_factory=dict, sa_type=JSONB)
# or with sa_column = Column(JSONB)
# also doesnt work:
# class Config:
# arbitrary_types_allowed = True DescriptionI got exactly the same error doesnt metter which way I use.
Operating SystemWindows Operating System DetailsNo response SQLModel Version0.0.22 Python Version3.12.7 Additional ContextNo response |
Beta Was this translation helpful? Give feedback.
Replies: 2 comments
-
Have you tried to use a generic from sqlalchemy.sql.schema import Column
from sqlalchemy.sql.sqltypes import JSON
class ModelWithGenericJsonColumn(SQLModel, table=True):
id: int = Field(primary_key=True)
d: dict[str, str] = Field(default={"key": "value"}, sa_column=Column(JSON)) Maybe would work :) |
Beta Was this translation helpful? Give feedback.
-
The problem is in the import: from pydantic import BaseModel, Field, field_validator You should import from typing import Any, Optional
from sqlalchemy.dialects.postgresql import JSONB
from sqlalchemy.ext.mutable import MutableDict
from sqlmodel import Field, Session, SQLModel, create_engine
class Combo(SQLModel, table=True):
id: Optional[int] = Field(primary_key=True)
data: dict[str, Any] = Field(
default_factory=dict,
sa_type=MutableDict.as_mutable(JSONB),
)
engine = create_engine(
"postgresql://user:mysecretpassword@localhost/some_db", echo=True
)
SQLModel.metadata.drop_all(engine)
SQLModel.metadata.create_all(engine)
with Session(engine) as session:
combo = Combo(data={"key": "value"})
session.add(combo)
session.commit()
session.refresh(combo)
combo.data["key"] = "new_value"
session.commit()
with Session(engine) as session:
combo = session.get(Combo, 1)
assert combo.data["key"] == "new_value" |
Beta Was this translation helpful? Give feedback.
The problem is in the import:
You should import
Field
fromsqlmodel
, not frompydantic