sqlalchemy.orm.exc.unmappedinstanceerror:class' db.models.inventory.inventorymodel'没有映射
我正在构建几个示例API的过程中并遇到此“未映射” sqlalchemy.orm.orm.exe.unmappedinstance错误问题。我相信,如果我试图通过不是模型的对象实例,则可能会生成此错误是的。我想念什么?或教育我为什么当我清楚地看到收到的类型是映射的pedantic型号时,为什么会遇到未限定的实例错误。我对现有的堆栈溢出帖子进行了狂欢,该帖子是使用棉花糖围绕着的,我更喜欢将其作为“如果所有其他方法都失败”解决方案。获得我按摩的任何解决方案的任何解决方案都将不胜感激。 使用Python 3.10.4 / pydantic / sqlalchemy / fastapi
文件名c:\ app \ main.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:\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**
I am in the process of building several example APIs to and ran into this 'is not mapped' sqlalchemy.orm.exe.UnmappedInstance Error issue. I believe this error would possible be generated if I was trying to pass an object instance that wasn't a model, however, I am passing a pydanic model within the db.add() method which is mapped (or at least I think it is.) So, I'm not sure why I'm getting this error when the object being passed to db.Add (new_inventory) is a prudence model that is aligned to the base schema. What am I missing? Or educate me on why I'm getting a Unmapped Instance Error when I can clearly see that the type received is a mapped pedantic model. I've raved existing Stack Overflow post which was centered around using marshmallows, which I prefer to make that an 'if all else fails' solution. Any solution to get the code I have in place massaged would be highly appreciated.
Using Python 3.10.4 / Pydantic / SqlAlchemy / FastAPI
file name c:\app\main.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:\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**
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
看来您与模型和模型的继承相混淆, basemodel用于架构,而基础是模型。
尝试更改
以下类的类别:
It seems that you are confused with the inheritance of model and schema, BaseModel is for schemas and Base is for models.
Try to change the classes of:
to: