我的表中有如下所示的数据:
src_id, dst_id, params
int , int , array
我正在查询数据以从数组中提取一些值 使用以下 Django 查询
dataset = query_set.values_list('src_id', 'dst_id', *[e.field for e in settings])
我需要这样输出数据:
[
[1,2,[a,b,c,d]],
[3,4,[a,c,d,e]],
...
]
但是 values_list 返回一个元组列表,例如 (1,2,a,b,c,d)(3,4,a,c,d,e)...
所以我一直在执行以下操作以将元组值重新组合到一个数组中:
[[d[0], d[1], d[2:]] for d in dataset]
它工作正常,但我有 1M+ 行,而且速度很慢。它还使用了大量内存。理想情况下,我想在 SQL 中正确格式化数据(通过 Django)并将输出直接推送到 JSON 序列化程序,而无需生成中间数组。
有没有办法优化这段代码?
我看过使用循环或 lambda,但这并没有太大区别。我查看了 array 的使用,但它只接受基本类型,所以数组的数组不太好运。
我正在寻找一种方法来查询数据库并以正确的格式直接输出数据,如果可能的话在 Django 中:
我看到 Django 可以像这样进行切片数组查找
dataset = query_set.values_list('src_id', 'dst_id', 'data__3_10')
例如获取索引 3 和 10 之间的值,但我需要检索特定索引(例如 1、4、5、6、8、11),而不是切片。
关于如何格式化查询输出的任何提示? 有可能吗,或者对 Django 来说太深奥了? 为此,我需要 raw SQL 吗?
谢谢
请您参考如下方法:
如果数据库是PostgreSQL 或Oracle 那么Django 1.11 中的内存需求可以通过iterator() 显着降低。适用于任何查询集的方法,包括 values() 或 values_list() 查询集。然后默认使用服务器端游标,而无需在 Django 或数据库驱动程序中进行任何缓存。阅读文档中的详细信息。
演示
qs = query_set.values_list('src_id', 'dst_id', 'data')
for row in qs.iterator():
print(row)
输出
(3, 4, ['a', 'c', 'd', 'e'])
...
完整的例子
qs = query_set.values_list('src_id', 'dst_id', 'data')
with open(..., 'w') as f:
f.write('[\n')
for src_id, dst_id, data in qs.iterator():
str_sub_array = ','.join(data[x] for x in column_settings)
f.write('[{},{},[{}]],\n'.format(src_id, dst_id, str_sub_array)
f.write(']\n')
内存需求可以忽略不计。
