我正在构建几个API示例,并遇到这个“未映射”的sqlalchemy.orm.exe.UnmappedInstance错误问题。我相信,如果我试图传递一个不是模型的对象实例,就有可能产生这个错误,但是,我在映射的db.add()方法中传递一个pydanic模型(或者至少我认为是这样)。因此,当被传递给db.Add (new_inventory)的对象是一个与基本模式对齐的谨慎模型时,我不知道为什么要得到这个错误。我遗漏了什么?或者告诉我为什么我会得到一个未映射的实例错误,当我清楚地看到所接收的类型是一个映射的迂回模型时。我已经对现有的Stack溢出帖子进行了讨论,它的中心是使用棉花糖,我更愿意把它变成一个“如果所有其他方法都失败了”的解决方案。任何解决方案,以获得我在适当的代码按摩将是非常感谢的。使用Python3.10.4/ Pydantic / SqlAlchemy / FastAPI
文件名c:\app\main.py
'''python
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:\db\models\Inventory.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()'))
'''
StackTrace
Traceback (most recent call last):
File "C:\QA\Dev\projects\testdriven.io\posting_system\venv\lib\site-packages\uvicorn\protocols\http\h11_impl.py", line 366, in run_asgi
result = await app(self.scope, self.receive, self.send)
File "C:\QA\Dev\projects\testdriven.io\posting_system\venv\lib\site-packages\uvicorn\middleware\proxy_headers.py", line 75, in __call__
return await self.app(scope, receive, send)
File "C:\QA\Dev\projects\testdriven.io\posting_system\venv\lib\site-packages\fastapi\applications.py", line 269, in __call__
await super().__call__(scope, receive, send)
File "C:\QA\Dev\projects\testdriven.io\posting_system\venv\lib\site-packages\starlette\applications.py", line 124, in __call__
await self.middleware_stack(scope, receive, send)
File "C:\QA\Dev\projects\testdriven.io\posting_system\venv\lib\site-packages\starlette\middleware\errors.py", line 184, in __call__
raise exc
File "C:\QA\Dev\projects\testdriven.io\posting_system\venv\lib\site-packages\starlette\middleware\errors.py", line 162, in __call__
await self.app(scope, receive, _send)
File "C:\QA\Dev\projects\testdriven.io\posting_system\venv\lib\site-packages\starlette\exceptions.py", line 93, in __call__
raise exc
File "C:\QA\Dev\projects\testdriven.io\posting_system\venv\lib\site-packages\starlette\exceptions.py", line 82, in __call__
await self.app(scope, receive, sender)
File "C:\QA\Dev\projects\testdriven.io\posting_system\venv\lib\site-packages\fastapi\middleware\asyncexitstack.py", line 21, in __call__
raise e
File "C:\QA\Dev\projects\testdriven.io\posting_system\venv\lib\site-packages\fastapi\middleware\asyncexitstack.py", line 18, in __call__
await self.app(scope, receive, send)
File "C:\QA\Dev\projects\testdriven.io\posting_system\venv\lib\site-packages\starlette\routing.py", line 670, in __call__
await route.handle(scope, receive, send)
File "C:\QA\Dev\projects\testdriven.io\posting_system\venv\lib\site-packages\starlette\routing.py", line 266, in handle
await self.app(scope, receive, send)
File "C:\QA\Dev\projects\testdriven.io\posting_system\venv\lib\site-packages\starlette\routing.py", line 65, in app
response = await func(request)
File "C:\QA\Dev\projects\testdriven.io\posting_system\venv\lib\site-packages\fastapi\routing.py", line 227, in app
raw_response = await run_endpoint_function(
File "C:\QA\Dev\projects\testdriven.io\posting_system\venv\lib\site-packages\fastapi\routing.py", line 162, in run_endpoint_function
return await run_in_threadpool(dependant.call, **values)
File "C:\QA\Dev\projects\testdriven.io\posting_system\venv\lib\site-packages\starlette\concurrency.py", line 41, in run_in_threadpool
return await anyio.to_thread.run_sync(func, *args)
File "C:\QA\Dev\projects\testdriven.io\posting_system\venv\lib\site-packages\anyio\to_thread.py", line 31, in run_sync
return await get_asynclib().run_sync_in_worker_thread(
File "C:\QA\Dev\projects\testdriven.io\posting_system\venv\lib\site-packages\anyio\_backends\_asyncio.py", line 937, in run_sync_in_worker_thread
return await future
File "C:\QA\Dev\projects\testdriven.io\posting_system\venv\lib\site-packages\anyio\_backends\_asyncio.py", line 867, in run
result = context.run(func, *args)
File "C:\QA\Dev\projects\testdriven.io\posting_system\.\app\main.py", line 40, in insert_vechiles
db.add(new_inventory)
File "C:\QA\Dev\projects\testdriven.io\posting_system\venv\lib\site-packages\sqlalchemy\orm\session.py", line 2605, in add
util.raise_(
File "C:\QA\Dev\projects\testdriven.io\posting_system\venv\lib\site-packages\sqlalchemy\util\compat.py", line 207, in raise_
raise exception
**sqlalchemy.orm.exc.UnmappedInstanceError: Class 'db.models.Inventory.InventoryModel' is not mapped**发布于 2022-11-04 09:12:40
您似乎混淆了模型和模式的继承,BaseModel用于模式,Base用于模型。
尝试更改以下类别:
class InventoryModel(BaseModel):
class InventorySchema(Base):
__tablename__ = "vehicles"至:
class InventoryModel(Base):
__tablename__ = "vehicles"
class InventorySchema(BaseModel): https://stackoverflow.com/questions/72450616
复制相似问题