按日期时间过滤失败

问题描述 投票:0回答:1

我正在使用 Python 和 Tortoise ORM 来管理我的 SQLite 数据库。我定义了一个

User
模型,如下所示:

class User(Model):
    id = tortoise.fields.IntField(primary_key=True)
    age = tortoise.fields.IntField()
    datetime = tortoise.fields.DatetimeField(auto_now_add=True)

我尝试通过

datetime
字段查询用户模型,每次这样做都会得到一个空列表。这是初始化和查询代码:

import asyncio
import time
import tortoise.connection
import tortoise.timezone

from tortoise import Tortoise
from database import User
from datetime import timedelta


async def test():
    for _ in range(5):
        user = await User.create(age=18)
        print(f"Created user with datetime: {user.datetime}")

    time.sleep(5)
    end_time = tortoise.timezone.now()
    start_time = end_time - timedelta(hours=2)

    print(f"Start time is {start_time}")
    print(f"End time is {end_time}")
    users = await User.filter(datetime__range=(start_time, end_time)).all()
    print(users)


async def main():
    await Tortoise.init(
        db_url="sqlite://:memory:",
        # timezone="Europe/Moscow",
        # use_tz=True,
        modules={"discord": ["database"]}
    )
    await Tortoise.generate_schemas()
    await test()


if __name__ == "__main__":
    try:
        asyncio.run(main())
    finally:
        asyncio.run(tortoise.connection.connections.close_all())

它输出:

Created user with datetime: 2024-09-21 16:57:31.550512+00:00
Created user with datetime: 2024-09-21 16:57:31.550512+00:00
Created user with datetime: 2024-09-21 16:57:31.550512+00:00
Created user with datetime: 2024-09-21 16:57:31.551512+00:00
Created user with datetime: 2024-09-21 16:57:31.551512+00:00
Start time is 2024-09-21 14:57:36.552198+00:00
End time is 2024-09-21 16:57:36.552198+00:00
[]

显然,这不是预期的输出,因为我在 5 秒前创建了用户,而 ORM 没有将它们返回给我。
谁能解释我做错了什么?我尝试在

timezone
中设置
use_tz
Tortoise.init()
参数。没有结果。这是 ORM 生成的 SQL 查询:

SELECT "datetime","age","id"
FROM "user"
WHERE "datetime" BETWEEN '2024-09-21T14:57:36.552198+00:00' AND '2024-09-21T16:57:36.552198+00:00'
python sqlite timezone tortoise-orm
1个回答
0
投票

我不是 tortoise-orm 的专家,但是 这里有一个链接,指向

tortoise-orm
的已解决问题,它解决了类似的问题。

这个问题可能与您使用的版本有关(sqlite,tortoise-orm,...),或者只是因为错误没有完全修复。由于生成 SQL 不会返回结果,但如果您从 WHERE 子句的时间部分中删除

“T”
,如 GitHub Issue 中所述,则会返回条目。

我只测试了sqlite(版本3.47.0)部分/查询。

© www.soinside.com 2019 - 2024. All rights reserved.