0

我正在 python3 中使用 sqlite3 JSON1扩展。以下代码将输出作为字符串返回,但我希望它是一个 JSON 对象。在没有使用 json.loads() 的情况下,这甚至可以在 sqlite3 中实现吗?

conn = sqlite3.connect(':memory:')
c = conn.cursor()
c.execute('''SELECT json_quote(json_object('a',2,'c',json_object('e',5))),  
            json_array(1,2,'3',4),
            json_object('a',2,'c',json_object('e',5))            
         ''')
row = c.fetchone()
col_a, col_b, col_c = row
print(row)
print(type(col_a), type(col_b), type(col_c))

输出

('{"a":2,"c":{"e":5}}', '[1,2,"3",4]', '{"a":2,"c":{"e":5}}')
<class 'str'> <class 'str'> <class 'str'>

如果我可以通过 SQLalchemy 让它工作会更好(同样,我想避免使用 json.loads())

from sqlalchemy import create_engine, Column, String, MetaData, Table, JSON
from sqlalchemy.orm import mapper
from sqlalchemy.sql import text

engine = create_engine('sqlite:///:memory:', echo=True)

metadata = MetaData(bind=engine)

table = Table('device', metadata, Column('id', String, primary_key=True), Column('properties', JSON))
table.create()
properties = {'id': 'id1', 'device_name': 'device1', 'role': 'backbone', 'in_maint': True}
table.insert().values(id=properties['id'], properties=properties).execute()


class SqliteTable(object):
    pass


mapper(SqliteTable, table)

sql_string = '''SELECT json_extract(device.properties, '$') AS properties
                FROM device'''
sql_params = {}

with engine.connect() as connection:
    rows = connection.execute(text(sql_string), **sql_params).fetchall()

results = [{k: v for k, v in row.items()} for row in rows]
print(results)
engine.dispose()

属性值是一个字符串,而不是 JSON 对象。

[{'properties': '{"id":"id1","device_name":"device1","role":"backbone","in_maint":true}'}]

编辑:我不知道返回的哪些列将包含 JSON 数据,因此,需要在不对每个列的值执行 json.loads() 的情况下执行此操作。最终,这些数据将以 JSON 形式返回给用户。API 用户将执行原始 SQL 查询。

4

0 回答 0