我正在尝试使用 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'.
为什么会发生这种情况,我该如何解决?另外,是否有更好的选项来创建更新插入操作?
您需要将
schema.Table
对象传递给 insert
:
insert(Base.metadata.tables[Product.__tablename__]).values(...)
当我有
sqlalchemy==1.4.26
时,我遇到了这个错误。我回滚到版本1.3.24
,这个错误就消失了。
pip uninstall sqlalchemy
pip istall sqlalchemy==1.3.24
在我的例子中,这是更新语句中的拼写错误,而不是使用模型类
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())
...
...