如何在SQLAlchemy中通过动态主键变量实现记录更新?
问题描述
现有MySQL数据库中的一条记录(JSON格式):
{ "CUSTNAME": "6813482975524", "CDES": "Derek Bros", "NAME": null, "IVDATE": "2023-03-28T00:00:00+03:00", "IVNUM": "T1000024", "FINAL": null, "STATDES": "Draft", "OWNERLOGIN": "tp3", "ORDNAME": "SO23000426" }
其中CUSTNAME是该表的主键。需要用以下记录更新对应条目(仅FINAL和STATDES字段变更):
row = { "CUSTNAME": "6813482975524", "CDES": "Derek Bros", "NAME": None, "IVDATE": "2023-03-28T00:00:00+03:00", "IVNUM": "T1000024", "FINAL": "Yes", "STATDES": "Final", "OWNERLOGIN": "tp3", "ORDNAME": "SO23000426" }
已知硬编码主键的SQLAlchemy更新语句可正常运行:
UpdateStmt = update(TableObject).where(TableObject.c.CUSTNAME == row['CUSTNAME']).values(row)
但希望通过变量获取主键名称而非硬编码,尝试以下写法失败:
table_pk = TableObject.primary_key.columns.values()[0].name UpdateStmt = update(TableObject).where(TableObject.c.table_pk == row['CUSTNAME']).values(row)
试过str(table_pk)和eval(table_pk)也无法正常工作,求解决方法。
解决方案
要通过变量访问SQLAlchemy表的列,不能直接使用.语法,需用字典索引方式获取列对象:
正确写法
# 获取主键列名称 table_pk = TableObject.primary_key.columns.values()[0].name # 通过字典索引动态获取主键列,构建where条件 UpdateStmt = update(TableObject).where(TableObject.c[table_pk] == row[table_pk]).values(row)
核心解释
TableObject.c本质是一个类字典的ColumnCollection结构,支持通过字符串键访问列对象,因此TableObject.c[table_pk]可以动态获取主键对应的列,完全替代硬编码的TableObject.c.CUSTNAME。同时用row[table_pk]代替row['CUSTNAME'],让代码彻底和主键名称解耦,通用性更强。
可选优化
如果仅需更新FINAL和STATDES两个字段,无需传入整个row,只传需要变更的字段即可减少不必要的更新操作:
update_values = { "FINAL": row["FINAL"], "STATDES": row["STATDES"] } UpdateStmt = update(TableObject).where(TableObject.c[table_pk] == row[table_pk]).values(update_values)
内容的提问来源于stack exchange,提问作者Tal_87_il
相关产品推荐
相关产品推荐

