带有多个文件的 TinyDB 中的 Query()

Query() in TinyDB with multiple files

我使用 Python + TinyDB,我有 2 个 json 文件,我创建了 2 个 TinyDB 对象:

db = TinyDB(“db.json”)
forum = TinyDB(“forum.json”)

但是我该如何使用 Query()? 我如何编写 Query() 将仅检查 db.json 或反之亦然的代码?

tiny db 中的“查询”是一个特殊的 Python 对象,它覆盖运算符,因此当使用它们时,tinyDB 引擎可以在“搜索”方法中使用它们来比较所有记录中的值它可以达到。

这样做是为了不附加到任何特定的 tinyDB 对象(“数据库”):它只是绑定要在后续搜索中执行的任何操作数和操作。

搜索必须是特定数据库或tinyDB对象的.search方法

因此,如果您有两个数据库,您希望在其中执行相同的查询,只需这样做,在一个数据库中调用 .search 方法,然后在另一个数据库中调用。

但是如果你想以某种方式进行依赖于两个数据集的搜索,比如关系搜索:tinyDB 不会那样做。它旨在简单,并且不关联数据。

如果你需要,制作一个快速脚本将你的 tinyDB 内容转储到 SQLite 数据库,然后使用普通 SQL(或 ORM,轻量级或非轻量级)来完成查询。

将 tinyDB 库转储到 sqlite 可以很简单:

from tinydb import TinyDB
import sqlite3



def get_schema_from_db(db):
    schema = {}
    for record in db.all():
        for key, value in record.items():
            schema.setdefault(key, set()).add(type(value))
    return {key:('REAL' if float in v else 'INTEGER' if int in v else 'TEXT' if str in v else "BLOB") for key, v in schema.items()}


def create_sql_table(sqldb, name, schema):
    createsql = f"CREATE TABLE IF NOT EXISTS {name} (id INTEGER PRIMARY KEY, {{}})".format(", ".join(f"{key} {value}" for key, value in schema.items() ) )
    sqldb.execute(createsql)

def transfer(tydb, sqldb, schema, tablename):
    insertsql = f"INSERT INTO {tablename} ({', '.join(schema.keys())})  VALUES ({', '.join('?' for _ in range(len(schema)))})"
    sqldb.executemany(insertsql, [tuple(rec.values()) for rec in tydb.all()])

# And to use these 3 functions:

tydb = TinyDB("db.json")
sqldb = sqlite3.connect("sql.db")

schema = get_schema_from_db(tydb)
create_sql_table(sqldb, "mytable", schema)
transfer(tydb, sqldb, schema, "mytable")

抱歉,如果上面的代码看起来太复杂了:它基本上是字符串操作来达到最终的 SQL 形式——它是“复杂的”但是 不“复杂”——相反,非常简单。

之后你的 tinyDB 数据就变成了 SQL 的形式并且可以 post 查询 连接不同的表等等。