在字典列表

时间:2017-04-15 02:07:40

标签: python sql

我有一组用户需要使用自己的查询字符串查询的数据。当前的解决方案创建了一个临时的内存中sqlite数据库,该数据库运行查询。

数据集是" flat"的列表字典,即没有嵌套数据。查询字符串不需要是SQL,但使用现有的查询框架定义它应该很简单。

它需要支持排序(升序,降序,自定义)和过滤。

这个问题的目的是获得一系列可能适用于此用例的不同解决方案。

import sqlite3

items = [
    {'id': 1},
    {'id': 2, 'description': 'This is a description'},
    {'id': 3, 'comment': 'This is a comment'},
    {'id': 4, 'height': 1.78}
]

# Assemble temporary sqlite database
conn = sqlite3.connect(':memory:')
cur = conn.cursor()

knownTypes = { "id": "real", "height": "real", "comment": "text" }

allKeys = list(set().union(*(d.keys() for d in items)))
allTypes = list(knownTypes.get(k, "text") for k in allKeys)

createTable_query = "CREATE TABLE data ({});".format(", ".join(["{} {}".format(x[0], x[1]) for x in zip(allKeys, allTypes)]))
cur.execute(createTable_query)
conn.commit()

qs = ["?" for i in range(len(allKeys))]
insertRow_query = "INSERT INTO data VALUES ({});".format(", ".join(qs))

for p in items:
    vals = list([p.get(k, None) for k in allKeys])
    cur.execute(insertRow_query, vals)
conn.commit()

# modify user query here
theUserQuery = "SELECT * FROM data"

# Get data from query
data = [row for row in cur.execute(theUserQuery)]

1 个答案:

答案 0 :(得分:0)

YAQL是我正在寻找的。

它不会执行SQL,但它会执行查询字符串 - 这是进行复杂的用户定义排序和过滤的简单方法。