如何将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?的主要内容,如果未能解决你的问题,请参考以下文章

如何将 SqlAlchemy 结果序列化为 JSON?

使用 select_related 将查询中的数据结果序列化为 json

将对象序列化为 JSON,然后使用 NEST 在弹性搜索中发送查询

如何用C#将序列化为json的字符串导入到sql server中数据库

如何在C#中将Linq to SQL数据序列化为JSON

Django 将查询集序列化为 JSON 以仅使用字段信息和 id 构造 RESTful 响应