从Python中发送Sqlite查询的JSON响应
我有一个用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)
(假设 lite
是 sqlite3
的别名)
还有几点需要注意:
- 我去掉了
while True:
循环。这个循环效率低下,不安全,而且不容易阅读; - 我在SQL查询中添加了对
key
的检查(为什么要从数据库中加载不必要的数据呢?)