You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

SQLAlchemy报错:QueryableAttribute缺失参数问题求助

问题修复方案

错误原因

你传入的target_col是模型的列属性(比如Players.player_uid),它的__class__是QueryableAttribute类,而非实际的数据库模型类(比如Players)。用delete(target_col.__class__)会生成错误的删除语句,触发QueryableAttribute.__clause_element__()缺少参数的报错。

解决方法

SQLAlchemy的列属性自带.class_属性,直接指向该列所属的模型类。只需修改删除语句中的模型类获取方式,同时修正参数的类型注解:

修改后的完整函数代码

from sqlalchemy import delete
from sqlalchemy.orm import Session
from sqlalchemy.sql.base import QueryableAttribute
import logging
import sqlalchemy.exc

def delete_record(target_col: QueryableAttribute, primary_key: str = None) -> None:
    """
    Deletes record from db where primary key matches
    :param target_col: Column of the target table
    :param primary_key: Primary key value of the record to delete
    :returns None
    """
    try:
        with Session(engine) as session:
            if primary_key is None:
                err_msg = "None was passed to delete_record()"
                logging.error(err_msg)
                raise ValueError(err_msg)
            
            # 关键修改:用target_col.class_获取所属模型类
            statement = delete(target_col.class_).where(target_col == primary_key)
            session.execute(statement)
            session.commit()

    except (ValueError | sqlalchemy.exc.DatabaseError) as err:
        logging.error(err)
        raise err

关键修改点

  1. 类型注解修正:将target_col: Base改为target_col: QueryableAttribute,符合实际传入的参数类型(模型列属性)
  2. 模型类获取:用target_col.class_替代target_col.__class__,正确获取列所属的数据库模型类
  3. 简化逻辑:移除冗余的elif primary_key判断,因为前面已经排除了primary_key is None的情况

调用方式保持不变:

delete_record(Players.player_uid, primary_key='123456')

内容的提问来源于stack exchange,提问作者DECROMAX

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.07 19:03:32