首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何将数据库对象保存在PeeWee中,如果在保存时存在递归错误

如何将数据库对象保存在PeeWee中,如果在保存时存在递归错误
EN

Stack Overflow用户
提问于 2022-02-09 20:51:19
回答 1查看 143关注 0票数 0

当我试图保存对象的实例时,会发生错误。

这是我的文件结构:

代码语言:javascript
运行
复制
class Loader():
    dbhandle = SqliteDatabase('history.db')

    def __init__(self):
        try:
            Loader.dbhandle.connect()
            Hotel.create_table()
        except peewee.InternalError as px:
            print(str(px))
        try:
            HistoryObject.create_table()
        except peewee.InternalError as px:
            print(str(px))

    def save_to_database(self):
        history_object = HistoryObject(chat_id=0,
                                       command='123',
                                       date_time='123'
                                       )
        history_object.save()
    #...

class BaseModel(Model):
    class Meta:
        database = Loader.dbhandle

class HistoryObject(BaseModel):
    id = PrimaryKeyField(null=False)
    chat_id = IntegerField()
    command = CharField(max_length=100)
    date_time = CharField(max_length=100)

    class Meta:
        db_table = "historyObjects"

在调用save to database类的Loader方法时,会发生以下错误:

代码语言:javascript
运行
复制
Traceback (most recent call last):
  File "C:\Users\342\PycharmProjects\python_basic_diploma\my_venv\lib\site-packages\telebot\__init__.py", line 611, in infinity_polling
    self.polling(none_stop=True, timeout=timeout, long_polling_timeout=long_polling_timeout,
  File "C:\Users\342\PycharmProjects\python_basic_diploma\my_venv\lib\site-packages\telebot\__init__.py", line 658, in polling
    self.__threaded_polling(non_stop, interval, timeout, long_polling_timeout, allowed_updates)
  File "C:\Users\342\PycharmProjects\python_basic_diploma\my_venv\lib\site-packages\telebot\__init__.py", line 720, in __threaded_polling
    raise e
  File "C:\Users\342\PycharmProjects\python_basic_diploma\my_venv\lib\site-packages\telebot\__init__.py", line 680, in __threaded_polling
    self.worker_pool.raise_exceptions()
  File "C:\Users\342\PycharmProjects\python_basic_diploma\my_venv\lib\site-packages\telebot\util.py", line 135, in raise_exceptions
    raise self.exception_info
  File "C:\Users\342\PycharmProjects\python_basic_diploma\my_venv\lib\site-packages\telebot\util.py", line 87, in run
    task(*args, **kwargs)
  File "C:\Users\342\PycharmProjects\python_basic_diploma\Handlers\LowHighPrice.py", line 63, in handle
    make_query(message)
  File "C:\Users\342\PycharmProjects\python_basic_diploma\Handlers\LowHighPrice.py", line 152, in make_query
    loader.save_to_database(0, '123', '123')
  File "C:\Users\342\PycharmProjects\python_basic_diploma\loader.py", line 72, in save_to_database
    history_object.save()
  File "C:\Users\342\PycharmProjects\python_basic_diploma\my_venv\lib\site-packages\peewee.py", line 6577, in save
    pk_value = self._pk
  File "C:\Users\342\PycharmProjects\python_basic_diploma\my_venv\lib\site-packages\peewee.py", line 6542, in get_id
    return getattr(self, self._meta.primary_key.safe_name)
  File "C:\Users\342\PycharmProjects\python_basic_diploma\my_venv\lib\site-packages\peewee.py", line 4481, in __get__
    .where(self.field == getattr(instance, dest)))
  File "C:\Users\342\PycharmProjects\python_basic_diploma\my_venv\lib\site-packages\peewee.py", line 4481, in __get__
    .where(self.field == getattr(instance, dest)))
  File "C:\Users\342\PycharmProjects\python_basic_diploma\my_venv\lib\site-packages\peewee.py", line 4481, in __get__
    .where(self.field == getattr(instance, dest)))
  [Previous line repeated 488 more times]
  File "C:\Users\342\PycharmProjects\python_basic_diploma\my_venv\lib\site-packages\peewee.py", line 4479, in __get__
    return (self.rel_model
  File "C:\Users\342\PycharmProjects\python_basic_diploma\my_venv\lib\site-packages\peewee.py", line 6326, in select
    return ModelSelect(cls, fields, is_default=is_default)
  File "C:\Users\342\PycharmProjects\python_basic_diploma\my_venv\lib\site-packages\peewee.py", line 6994, in __init__
    super(ModelSelect, self).__init__([model], fields)
  File "C:\Users\342\PycharmProjects\python_basic_diploma\my_venv\lib\site-packages\peewee.py", line 6859, in __init__
    super(_ModelQueryHelper, self).__init__(*args, **kwargs)
  File "C:\Users\342\PycharmProjects\python_basic_diploma\my_venv\lib\site-packages\peewee.py", line 2281, in __init__
    super(Select, self).__init__(**kwargs)
  File "C:\Users\342\PycharmProjects\python_basic_diploma\my_venv\lib\site-packages\peewee.py", line 812, in __init__
    super(_HashableSource, self).__init__(*args, **kwargs)
  File "C:\Users\342\PycharmProjects\python_basic_diploma\my_venv\lib\site-packages\peewee.py", line 768, in __init__
    super(Source, self).__init__()
  File "C:\Users\342\PycharmProjects\python_basic_diploma\my_venv\lib\site-packages\peewee.py", line 2042, in __init__
    super(Query, self).__init__(**kwargs)
RecursionError: maximum recursion depth exceeded while calling a Python object
"
Traceback (most recent call last):
  File "C:\Users\342\PycharmProjects\python_basic_diploma\my_venv\lib\site-packages\telebot\__init__.py", line 611, in infinity_polling
    self.polling(none_stop=True, timeout=timeout, long_polling_timeout=long_polling_timeout,
  File "C:\Users\342\PycharmProjects\python_basic_diploma\my_venv\lib\site-packages\telebot\__init__.py", line 658, in polling
    self.__threaded_polling(non_stop, interval, timeout, long_polling_timeout, allowed_updates)
  File "C:\Users\342\PycharmProjects\python_basic_diploma\my_venv\lib\site-packages\telebot\__init__.py", line 720, in __threaded_polling
    raise e
  File "C:\Users\342\PycharmProjects\python_basic_diploma\my_venv\lib\site-packages\telebot\__init__.py", line 680, in __threaded_polling
    self.worker_pool.raise_exceptions()
  File "C:\Users\342\PycharmProjects\python_basic_diploma\my_venv\lib\site-packages\telebot\util.py", line 135, in raise_exceptions
    raise self.exception_info
  File "C:\Users\342\PycharmProjects\python_basic_diploma\my_venv\lib\site-packages\telebot\util.py", line 87, in run
    task(*args, **kwargs)
  File "C:\Users\342\PycharmProjects\python_basic_diploma\Handlers\LowHighPrice.py", line 63, in handle
    make_query(message)
  File "C:\Users\342\PycharmProjects\python_basic_diploma\Handlers\LowHighPrice.py", line 152, in make_query
    loader.save_to_database(0, '123', '123')
  File "C:\Users\342\PycharmProjects\python_basic_diploma\loader.py", line 72, in save_to_database
    history_object.save()
  File "C:\Users\342\PycharmProjects\python_basic_diploma\my_venv\lib\site-packages\peewee.py", line 6577, in save
    pk_value = self._pk
  File "C:\Users\342\PycharmProjects\python_basic_diploma\my_venv\lib\site-packages\peewee.py", line 6542, in get_id
    return getattr(self, self._meta.primary_key.safe_name)
  File "C:\Users\342\PycharmProjects\python_basic_diploma\my_venv\lib\site-packages\peewee.py", line 4481, in __get__
    .where(self.field == getattr(instance, dest)))
  File "C:\Users\342\PycharmProjects\python_basic_diploma\my_venv\lib\site-packages\peewee.py", line 4481, in __get__
    .where(self.field == getattr(instance, dest)))
  File "C:\Users\342\PycharmProjects\python_basic_diploma\my_venv\lib\site-packages\peewee.py", line 4481, in __get__
    .where(self.field == getattr(instance, dest)))
  [Previous line repeated 488 more times]
  File "C:\Users\342\PycharmProjects\python_basic_diploma\my_venv\lib\site-packages\peewee.py", line 4479, in __get__
    return (self.rel_model
  File "C:\Users\342\PycharmProjects\python_basic_diploma\my_venv\lib\site-packages\peewee.py", line 6326, in select
    return ModelSelect(cls, fields, is_default=is_default)
  File "C:\Users\342\PycharmProjects\python_basic_diploma\my_venv\lib\site-packages\peewee.py", line 6994, in __init__
    super(ModelSelect, self).__init__([model], fields)
  File "C:\Users\342\PycharmProjects\python_basic_diploma\my_venv\lib\site-packages\peewee.py", line 6859, in __init__
    super(_ModelQueryHelper, self).__init__(*args, **kwargs)
  File "C:\Users\342\PycharmProjects\python_basic_diploma\my_venv\lib\site-packages\peewee.py", line 2281, in __init__
    super(Select, self).__init__(**kwargs)
  File "C:\Users\342\PycharmProjects\python_basic_diploma\my_venv\lib\site-packages\peewee.py", line 812, in __init__
    super(_HashableSource, self).__init__(*args, **kwargs)
  File "C:\Users\342\PycharmProjects\python_basic_diploma\my_venv\lib\site-packages\peewee.py", line 768, in __init__
    super(Source, self).__init__()
  File "C:\Users\342\PycharmProjects\python_basic_diploma\my_venv\lib\site-packages\peewee.py", line 2042, in __init__
    super(Query, self).__init__(**kwargs)
RecursionError: maximum recursion depth exceeded while calling a Python object

Loader类还用于使用pyTelegramBotApi和从另一个文件调用的方法来实例和轮询bot。不知道它是否会引起问题

Loader本身总是只实例一次,因此必须只调用__init__方法一次。

更多的信息:在尝试调试它时,我用peewee.py包文件在getattr中编写了一个打印函数来打印dest变量。它总是等于'id'

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-02-10 19:49:21

这个问题出现在数据库的另一个表中,后者与ForeignKeyField(HistoryObject, related_name='id')的第一个表有关。属性related_name破坏了所有这些,在移除属性之后,一切都很好。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71056545

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档