预期插入、更新或删除的对象表

问题描述 投票:0回答:3

我正在尝试使用 SQLAlchemy 执行更新插入。这是我的代码:

def add_product(session, item):
    insert_statement = insert(Product.__tablename__).values(
        id=item[0],
        name=item[1],
        price=item[2],
        units_sold=item[3]
    )
    do_update_statement = insert_statement.on_conflict_do_update(
        price=item[2],
        units_sold=item[3]
    )
    session.execute(do_update_statement)


class Product(Base):
    __tablename__ = 'products'

    id = Column(Integer, primary_key=True)
    name= Column(String)
    price= Column(Float)
    units_sold= Column(Integer)

但是,当我尝试执行此操作时,出现以下错误

sqlalchemy.exc.ArgumentError: subject table for an INSERT, UPDATE or DELETE expected, got 'products'.

为什么会发生这种情况,我该如何解决?另外,是否有更好的选项来创建更新插入操作?

python sqlite sqlalchemy
3个回答
1
投票

您需要将

schema.Table
对象传递给
insert
:

insert(Base.metadata.tables[Product.__tablename__]).values(...)

0
投票

当我有

sqlalchemy==1.4.26
时,我遇到了这个错误。我回滚到版本
1.3.24
,这个错误就消失了。

pip uninstall sqlalchemy
pip istall sqlalchemy==1.3.24

0
投票

在我的例子中,这是更新语句中的拼写错误,而不是使用模型类

Evaluation
我使用了参数
evaluation
sqlalchemy_update(evaluation)
所以我得到了下面的错误,解决方案只是使用模型类
sqlalchemy_update(Evaluation) 

subject table for an INSERT, UPDATE or DELETE expected, got EvaluationUpdate(name='Evaluation1 updated', industry_id=2, published=False, created_by=UUID('e765e925-fd31-4461-9fa4-4b1093477522'), created_at=None, updated_at=None).

正确代码:

from sqlalchemy import update as sqlalchemy_update
from app.models.evaluation import Evaluation

async def updateEvaluationItem(id: int, evaluation: EvaluationUpdate, db: Session = Depends(get_async_session)):
    try:
        query = sqlalchemy_update(Evaluation).where(
            Evaluation.id == id).values(**evaluation.dict())
        ...
    ...

© www.soinside.com 2019 - 2024. All rights reserved.