如何将sql查询序列化为json?
Posted
技术标签:
【中文标题】如何将sql查询序列化为json?【英文标题】:How to serialize sql query to json? 【发布时间】:2014-12-31 22:50:03 【问题描述】:我正在尝试将 sql 查询序列化为 json:
cursor.execute("""SELECT b.tonode, n.name, b.fromnode FROM zusers u JOIN znode n
ON u.code = n.created_by
JOIN zbond b
ON b.code = n.code
WHERE u.userid = %s""", [user_id] )
data = serializers.serialize('json', rows, fields = ('id', 'name', 'parent'))
但它不起作用。是否可以序列化不是模型的对象,而是 sql 查询?
【问题讨论】:
'tuple' 对象没有属性 '_meta' 检查我的编辑,找出错误发生的原因。您必须将结果转换为 django 模型对象并将其传递给序列化程序。 你发现了吗? 【参考方案1】:基于doc:
实际上,第二个参数可以是任何生成 Django 模型实例的迭代器,但它几乎总是一个 QuerySet
试试这个:
query = """SELECT b.tonode, n.name, b.fromnode FROM zusers u JOIN znode n
ON u.code = n.created_by
JOIN zbond b
ON b.code = n.code
WHERE u.userid = %s"""%user_id
data = serializers.serialize('json', YourModel.objects.raw(query), fields=('id', 'name', 'parent'))
【讨论】:
我不知道应该使用什么模型而不是“YourModel”。我只需要序列化该行列表 SQL 查询的字符串格式不是一个好主意。 docs.djangoproject.com/en/1.8/topics/db/sql/…【参考方案2】:试试这个代码:
cursor = connection.cursor()
cursor.execute("""SELECT b.tonode, n.name, b.fromnode FROM zusers u JOIN znode n ON u.code = n.created_by JOIN zbond b ON b.code = n.code WHERE u.userid = %s""", [user_id])
rows = cursor.fetchall()
result = []
keys = ('id','name','parent',)
for row in rows:
result.append(dict(zip(keys,row)))
json_data = json.dumps(result)
return HttpResponse(json_data, content_type="application/json")
【讨论】:
【参考方案3】:试试这个代码
cursor = connection.cursor()
cursor.execute("""SELECT b.tonode, n.name, b.fromnode FROM zusers u JOIN znode n ON u.code = n.created_by JOIN zbond b ON b.code = n.code WHERE u.userid = %s""", [user_id])
cursor.fetchall()
json_data = dictfetchall(cursor)
return HttpResponse(json_data, content_type="application/json")
def dictfetchall(cursor):
"Return all rows from a cursor as a dict"
columns = [col[0] for col in cursor.description]
return [
dict(zip(columns, row))
for row in cursor.fetchall()
]
【讨论】:
【参考方案4】:cursor = connection.cursor()
cursor.execute("""SELECT b.tonode, n.name, b.fromnode FROM zusers u JOIN znode n ON u.code = n.created_by JOIN zbond b ON b.code = n.code WHERE u.userid = %s""", [user_id])
rows = cursor.fetchall()
result = []
keys = ('id','name','parent',)
for row in rows:
result.append(dict(zip(keys,row)))
json_data = json.dumps(result)
return HttpResponse(json_data, content_type="application/json")
【讨论】:
以上是关于如何将sql查询序列化为json?的主要内容,如果未能解决你的问题,请参考以下文章
使用 select_related 将查询中的数据结果序列化为 json
将对象序列化为 JSON,然后使用 NEST 在弹性搜索中发送查询