是否可以将 peewee SQL 查询保存为字符串或 json,然后加载回 ModelSelect 对象

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

我在电报机器人中创建了一个带有分页的通用键盘。它适用于 peewee 查询对象

ModelSelect
,但我无法将其保存到 redis 或其他存储中,现在我将其保存在内存中,每次运行该对象都会被删除,键盘也会停止工作。

我尝试过:

from playhouse.shortcuts import model_to_dict, dict_to_model
from peewee import * 

db = SqliteDatabase('test.db')

class User(Model): 
    id:   int 
    name: str = TextField()
    
    class Meta:
        database = db

# create User table
User.create_table()

# add new User
User(name = "new_user").save()

# select User with id = 1
item = User.select().where(User.id == 1)
print(f"SQL: {item.sql()}")

# try to convert ModelSelect to dict
_dict = model_to_dict(item)
print(_dict)

# try to convert dict to ModelSelect
_item = dict_to_model(User, _dict)
print(_item)

但出现错误:

SQL: ('SELECT "t1"."id", "t1"."name" FROM "user" AS "t1" WHERE ("t1"."id" = ?)', [1])
Traceback (most recent call last):
  File "C:\testfile.py", line 27, in <module>
    _dict = model_to_dict(item)
  File "C:\Python310\lib\site-packages\playhouse\shortcuts.py", line 74, in model_to_dict
    for field in model._meta.sorted_fields:
AttributeError: 'ModelSelect' object has no attribute '_meta'
python python-3.x peewee
1个回答
0
投票

这是错误的想法。将模型instances序列化为字典是完全可以的,并且它们可以反序列化回模型实例。但是,您不能合理地期望序列化查询对象。该查询仅代表 SQL,并且在执行时包含对游标对象的引用。

如果你想序列化一个对象,你会:

# select User with id = 1 -- note call to .get()!!
item = User.select().where(User.id == 1).get()
data = model_to_dict(item)
© www.soinside.com 2019 - 2024. All rights reserved.