sqlalchemy.orm.exc.unmappedinstanceerror:class' db.models.inventory.inventorymodel'没有映射

发布于 2025-02-03 03:00:13 字数 7152 浏览 2 评论 0原文

我正在构建几个示例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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

帝王念 2025-02-10 03:00:13

看来您与模型和模型的继承相混淆, basemodel用于架构,而基础是模型

尝试更改

class InventoryModel(BaseModel):    

class InventorySchema(Base):
        __tablename__ = "vehicles"

以下类的类别:

class InventoryModel(Base):
        __tablename__ = "vehicles"

class InventorySchema(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:

class InventoryModel(BaseModel):    

class InventorySchema(Base):
        __tablename__ = "vehicles"

to:

class InventoryModel(Base):
        __tablename__ = "vehicles"

class InventorySchema(BaseModel): 
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文