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
关键修改点
- 类型注解修正:将
target_col: Base改为target_col: QueryableAttribute,符合实际传入的参数类型(模型列属性) - 模型类获取:用
target_col.class_替代target_col.__class__,正确获取列所属的数据库模型类 - 简化逻辑:移除冗余的
elif primary_key判断,因为前面已经排除了primary_key is None的情况
调用方式保持不变:
delete_record(Players.player_uid, primary_key='123456')
内容的提问来源于stack exchange,提问作者DECROMAX
相关产品推荐
相关产品推荐

