sqlalchemy.orm.exc.UnmappedInstanceError: 类 'db.models.Inventory.InventoryModel' 未映射



我正在构建几个示例api,并遇到了这个'未映射' sqlalchemy.org .exe. unmappedinstance错误问题。我相信,如果我试图传递一个不是模型的对象实例,则可能产生此错误,但是,我在映射的db.add()方法中传递一个pydanic模型(或者至少我认为它是)。所以,我不知道为什么我得到这个错误时,对象被传递给db。Add (new_inventory)是一个与基本模式保持一致的谨慎模型。我错过了什么?或者告诉我,当我清楚地看到接收到的类型是一个映射的学究模型时,为什么会得到一个未映射的实例错误。我已经在Stack Overflow上发表了一篇以使用棉花糖为中心的文章,我更喜欢将其作为"如果所有其他方法都失败"的解决方案。任何解决方案得到的代码,我已经到位按摩将非常感谢。使用Python 3.10.4/Pydantic/SqlAlchemy/FastAPI

文件名称c:appmain.py

from msilib import schema
mport psycopg2
from psycopg2.extras import RealDictCursor  
from os import stat
from fastapi import Depends, FastAPI, Response, status,     HTTPException
from pydantic import BaseModel
from typing import Optional
import pdb
from db.conn import Postgre
from db.sql_alchemy import db_engine, fetch_db, Base
from db.models.Inventory import InventorySchema, InventoryModel
from sqlalchemy.orm import Session
from pydantic import BaseModel
Base.metadata.create_all(bind=db_engine)
app = FastAPI()
@app.get("/fetch/vehicles", status_code=status.HTTP_200_OK)
def fetch_vehiles(db: Session = Depends(fetch_db)):        
vehicles = db.query(InventorySchema).all() 
print(vehicles)
return {"all vehicles": vehicles}

@app.post("/post/vehicles",status_code=status.HTTP_201_CREATED)
def insert_vechiles(inventory: InventoryModel, db: Session = Depends(fetch_db)):    

new_inventory = InventoryModel(
name = inventory.name,
price = inventory.price,
color = inventory.color,
manufactured_by = inventory.manufactured_by,
model = inventory.model,
size = inventory.size,
quantity = inventory.quantity,
active = inventory.active)
pdb.set_trace()
db.add(new_inventory)  # <---generates error 
# db.commit()
# db.refresh(new_intentory)
return {"Posted": new_inventory}
# file name: c:dbmodelsInventory.py
from email.policy import default
from msilib import schema
from xmlrpc.client import Boolean, boolean
from psycopg2 import Timestamp
from pydantic import BaseModel
from db.sql_alchemy import Base
from sqlalchemy import TIMESTAMP, Column, Integer, String, Boolean
from sqlalchemy.sql.expression import text
from sqlalchemy.sql.sqltypes import TIMESTAMP

class InventoryModel(BaseModel):    
name: str = 'Yshmael'
price: str = '3.00'
color: str  = 'blue'
manufactured_by: str = 'ford'
model: str = 'branch'
size: str = '4 door'
quantity: str = '10'
active: str = 'False'

class InventorySchema(Base):
__tablename__ = "vehicles"
id = Column(Integer, primary_key=True, nullable=False)
name  = Column(String, nullable=False)
price = Column(String, nullable=False)
color = Column(String, nullable=False)
manufactured_by = Column(String, nullable=False)
model = Column(String, nullable=False)
size = Column(String, nullable=False)
quantity = Column(String, nullable=False)
active = Column(String, nullable=False)
created_on = Column(TIMESTAMP(timezone=True), nullable=False, 
server_default=text('now()'))

异常堆栈:

Traceback (most recent call last):
File "C:QADevprojectstestdriven.ioposting_systemvenvlibsite-packagesuvicornprotocolshttph11_impl.py", line 366, in run_asgi
result = await app(self.scope, self.receive, self.send)
File "C:QADevprojectstestdriven.ioposting_systemvenvlibsite-packagesuvicornmiddlewareproxy_headers.py", line 75, in __call__
return await self.app(scope, receive, send)
File "C:QADevprojectstestdriven.ioposting_systemvenvlibsite-packagesfastapiapplications.py", line 269, in __call__
await super().__call__(scope, receive, send)
File "C:QADevprojectstestdriven.ioposting_systemvenvlibsite-packagesstarletteapplications.py", line 124, in __call__
await self.middleware_stack(scope, receive, send)
File "C:QADevprojectstestdriven.ioposting_systemvenvlibsite-packagesstarlettemiddlewareerrors.py", line 184, in __call__
raise exc
File "C:QADevprojectstestdriven.ioposting_systemvenvlibsite-packagesstarlettemiddlewareerrors.py", line 162, in __call__
await self.app(scope, receive, _send)
File "C:QADevprojectstestdriven.ioposting_systemvenvlibsite-packagesstarletteexceptions.py", line 93, in __call__
raise exc
File "C:QADevprojectstestdriven.ioposting_systemvenvlibsite-packagesstarletteexceptions.py", line 82, in __call__
await self.app(scope, receive, sender)
File "C:QADevprojectstestdriven.ioposting_systemvenvlibsite-packagesfastapimiddlewareasyncexitstack.py", line 21, in __call__
raise e
File "C:QADevprojectstestdriven.ioposting_systemvenvlibsite-packagesfastapimiddlewareasyncexitstack.py", line 18, in __call__
await self.app(scope, receive, send)
File "C:QADevprojectstestdriven.ioposting_systemvenvlibsite-packagesstarletterouting.py", line 670, in __call__
await route.handle(scope, receive, send)
File "C:QADevprojectstestdriven.ioposting_systemvenvlibsite-packagesstarletterouting.py", line 266, in handle
await self.app(scope, receive, send)
File "C:QADevprojectstestdriven.ioposting_systemvenvlibsite-packagesstarletterouting.py", line 65, in app
response = await func(request)
File "C:QADevprojectstestdriven.ioposting_systemvenvlibsite-packagesfastapirouting.py", line 227, in app
raw_response = await run_endpoint_function(
File "C:QADevprojectstestdriven.ioposting_systemvenvlibsite-packagesfastapirouting.py", line 162, in run_endpoint_function
return await run_in_threadpool(dependant.call, **values)
File "C:QADevprojectstestdriven.ioposting_systemvenvlibsite-packagesstarletteconcurrency.py", line 41, in run_in_threadpool
return await anyio.to_thread.run_sync(func, *args)
File "C:QADevprojectstestdriven.ioposting_systemvenvlibsite-packagesanyioto_thread.py", line 31, in run_sync
return await get_asynclib().run_sync_in_worker_thread(
File "C:QADevprojectstestdriven.ioposting_systemvenvlibsite-packagesanyio_backends_asyncio.py", line 937, in run_sync_in_worker_thread
return await future
File "C:QADevprojectstestdriven.ioposting_systemvenvlibsite-packagesanyio_backends_asyncio.py", line 867, in run
result = context.run(func, *args)
File "C:QADevprojectstestdriven.ioposting_system.appmain.py", line 40, in insert_vechiles
db.add(new_inventory)
File "C:QADevprojectstestdriven.ioposting_systemvenvlibsite-packagessqlalchemyormsession.py", line 2605, in add
util.raise_(
File "C:QADevprojectstestdriven.ioposting_systemvenvlibsite-packagessqlalchemyutilcompat.py", line 207, in raise_
raise exception
**sqlalchemy.orm.exc.UnmappedInstanceError: Class 'db.models.Inventory.InventoryModel' is not mapped**

似乎您对模型和模式的继承感到困惑,BaseModel用于模式,Base用于模型.

尝试更改:

的类
class InventoryModel(BaseModel):    
class InventorySchema(Base):
__tablename__ = "vehicles"

:

class InventoryModel(Base):
__tablename__ = "vehicles"
class InventorySchema(BaseModel): 

相关内容