代码块A

item = Query()

query = db.search(
    (item['username'] == username)
    and (item['password'] == md5(password))
)

代码块B

query = db.search(Query().fragment(
                    {
                        'username': username,
                        "password": md5(password)
                    }
                ))

一开始我以为两者是等价的,结果生产环境中出现了逻辑bug。

用print查找出了问题。

>>>print((item['username'] == username)
                      & (item['password'] == md5(password)))
QueryImpl('and', frozenset({('==', ('password',), 'testPassword'), ('==', ('username',), 'testUsername')}))

>>>print((item['username'] == username)
                      and (item['password'] == md5(password)))
QueryImpl('==', ('password',), 'testPassword')

可见,如果用and连接两个查询条件,会产生以下效果。。
>>>a = 1 and 2
>>>a
2

tinydb文档给出的连接方法是使用&符号,这有些反直觉了。。



I am a noob