我正在使用 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'
我不是 tortoise-orm 的专家,但是 这里有一个链接,指向
tortoise-orm
的已解决问题,它解决了类似的问题。
这个问题可能与您使用的版本有关(sqlite,tortoise-orm,...),或者只是因为错误没有完全修复。由于生成 SQL 不会返回结果,但如果您从 WHERE
子句的时间部分中删除
“T”,如 GitHub Issue 中所述,则会返回条目。
我只测试了sqlite(版本3.47.0)部分/查询。