从Python中发送Sqlite查询的JSON响应

7 投票
3 回答
18947 浏览
提问于 2025-04-18 19:08

我有一个用Python写的HTTP服务器,它可以接收基于JSON格式的请求。在收到请求后,它会从JSON输入中提取出一个关键字,然后查询一个Sqlite数据库,看看这个关键字是否存在。现在我想用一个结果的JSON消息来回复这个请求。但我对Python还不太熟悉,不知道该怎么做。

我的代码结构大致如下:

 import ...

 key=...;//get key from request
 con = lite.connect('test.db')
 with con:
    con.row_factory = lite.Row
    cur = con.cursor()
    cur.execute("SELECT * FROM mytable ");
    while True:

        row = cur.fetchone()

        if row == None:
            break
        if key==row['key']:
            # How can I add the record to the response?

处理请求的部分会像这样写回复(在一个继承自BaseHTTPRequestHandler的类中,并且是由一个线程启动的)

self.send_response(200)
self.send_header('Content-Type', 'application/json')
self.end_headers()
self.wfile.write(??????) # What do I need to write here?

3 个回答

1

看起来我还是没有足够的积分来评论。
@freakish - 是的,我正在使用 conn.row_factory = sqlite3.Row 来把结果当作 Python 字典来处理,确实你的解决方案有效,但它没有按照我需要的方式,把结果编码成一个字典列表,使用列名。

问题的关键在于,sqlite 返回的是 sqlite 对象,而 json.dumps 处理不了这些对象。我需要一种方法来生成像下面这样的输出,包含 3 行数据:

{
'json': [
         {'column1': value, 'column2': value, 'column3': value},
         {'column1': value, 'column2': value, 'column3': value},
         {'column1': value, 'column2': value, 'column3': value}
        ]
}

我相信这样可以做到,但没有你的一行代码那么简洁 :)

rows = []
for row in data:
    cols = {}
    for col in row.keys():
        cols[col] = row[col]
    rows.append(cols)
jsn = json.dumps(rows)

6

你可以试试这个

import sqlite3


def row_to_dict(cursor: sqlite3.Cursor, row: sqlite3.Row) -> dict:
    data = {}
    for idx, col in enumerate(cursor.description):
        data[col[0]] = row[idx]
    return data

with sqlite3.connect(db_path) as con:
    con.row_factory = row_to_dict
    result = con.execute('SELECT * FROM table_name')
    print(result.fetchall())

5

返回JSON响应就这么简单:

import json
import sqlite3

def get_my_jsonified_data(key):
    with sqlite3.connect('test.db') as conn:
        cursor = conn.cursor()
        cursor.execute("SELECT * FROM mytable WHERE column=?;", [key])
        data = cursor.fetchall()
        return json.dumps(data)

(假设 litesqlite3 的别名)

还有几点需要注意:

  1. 我去掉了 while True: 循环。这个循环效率低下,不安全,而且不容易阅读;
  2. 我在SQL查询中添加了对 key 的检查(为什么要从数据库中加载不必要的数据呢?)

撰写回答