首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >sqlalchemy.orm.exc.UnmappedInstanceError:未映射类“db.models.Inventory.InventoryModel”

sqlalchemy.orm.exc.UnmappedInstanceError:未映射类“db.models.Inventory.InventoryModel”
EN

Stack Overflow用户
提问于 2022-05-31 15:38:45
回答 1查看 502关注 0票数 0

我正在构建几个API示例,并遇到这个“未映射”的sqlalchemy.orm.exe.UnmappedInstance错误问题。我相信,如果我试图传递一个不是模型的对象实例,就有可能产生这个错误,但是,我在映射的db.add()方法中传递一个pydanic模型(或者至少我认为是这样)。因此,当被传递给db.Add (new_inventory)的对象是一个与基本模式对齐的谨慎模型时,我不知道为什么要得到这个错误。我遗漏了什么?或者告诉我为什么我会得到一个未映射的实例错误,当我清楚地看到所接收的类型是一个映射的迂回模型时。我已经对现有的Stack溢出帖子进行了讨论,它的中心是使用棉花糖,我更愿意把它变成一个“如果所有其他方法都失败了”的解决方案。任何解决方案,以获得我在适当的代码按摩将是非常感谢的。使用Python3.10.4/ Pydantic / SqlAlchemy / FastAPI

文件名c:\app\main.py

代码语言:javascript
复制
'''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**
EN

回答 1

Stack Overflow用户

发布于 2022-11-04 09:12:40

您似乎混淆了模型和模式的继承,BaseModel用于模式,Base用于模型

尝试更改以下类别:

代码语言:javascript
复制
class InventoryModel(BaseModel):    

class InventorySchema(Base):
        __tablename__ = "vehicles"

至:

代码语言:javascript
复制
class InventoryModel(Base):
        __tablename__ = "vehicles"

class InventorySchema(BaseModel): 
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72450616

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档