在一个比较小的Flask项目中使用SQLAlchemy,没有用ORM,只用了SQL Expression Language。
业务逻辑中有mtype(主类别)和stype(子类别)之分,一个mtype包括多个stype。
现在需要查询所有的mtype,并显示每个mtype的所有stype,代码如下:
mtypes = Type.get_mtypes()
for m in mtypes:
m['stypes'] = Type.get_stypes(m['MainTypeID'])
其中get_mtypes和get_stypes的定义如下:
class Type:
@
staticmethod def get_mtypes():
return g.conn.execute(
select([mtype])
.order_by(mtype.c.ShowOrder.asc())).fetchall()
@
staticmethod def get_mtype_by_id(mtype_id):
return g.conn.execute(
select([mtype])
.where(mtype.c.MainTypeID == mtype_id)).fetchone()
报错:'RowProxy' object does not support item assignment
文档对RowProxy的描述如下:
Proxy values from a single cursor row.
Mostly follows “ordered dictionary” behavior, mapping result values to the string-based column name, the
integer position of the result in the row, as well as Column instances which can be mapped to the original
Columns that produced this result set (for results that correspond to constructed SQL expressions).
好像这个ordered dictionary是无法赋予其新的key:value。目前的解决方法是,在赋值前手动将所有的RowProxy转换为dict类型:
mtypes = [dict[m] for m in Type.get_mtypes()]
for m in mtypes:
m['stypes'] = Type.get_stypes(m['MainTypeID'])
这样就不会报错了,不过每次都要额外加一个转换,感觉很蛋疼。
目前想到的简化方法是,在获取get_stypes这个函数里面就把所有的stypes通过子查询找到,而不是在获取了RowProxy后再去给它赋值。
大家还有什么好的建议没?