【问题标题】:Peewee retrieves data in python console but not in appPeewee 在 python 控制台中检索数据,但不在应用程序中
【发布时间】:2018-12-17 14:30:56
【问题描述】:

我在 Python 中使用 peewee 设计了实体。在我开始实现真正的数据库之前,我已经对内存数据库进行了几次测试。当我开始实现数据库功能时,我遇到了奇怪的问题。我的查询返回空结果,这取决于我是运行脚本还是使用 python 控制台。

首先,让我证明逻辑是正确的。当我使用 python 控制台时,一切正常:

>>> from Entities import *
>>> print (RouterSettings.select().where(RouterSettings.name=='RUT00').get().name)
RUT00

如您所见,一切都是正确的。执行特定查询并返回结果。现在在脚本中也是这样:

from Entities import *
print (RouterSettings.select().where(RouterSettings.name=='RUT00').get().name)

这个返回异常实例匹配查询不存在

打印 (RouterSettings.select().where(RouterSettings.name=='RUT00').get().name) 文件 "C:\Users\Kamil\AppData\Local\Programs\Python\Python37-32\lib\site-packages\peewee.py", 第 5975 行,在获取 (clone.model, sql, params)) Entities.RouterSettingsDoesNotExist: 实例匹配查询不存在: SQL: 选择“t1”。“id”,“t1”。“名称”,“t1”。“ip”,“t1”。“用户名”, "t1"."password", "t1"."model", "t1"."phone_num", "t1"."provider", "t1"."location" FROM "routersettings" AS "t1" WHERE ("t1"."name" = ?) 限制 ?抵消 ?参数:['RUT00', 1, 0]

当我尝试调试时,我发现数据库好像没有创建: 请注意,在调试变量中,数据库对象为空(无)。 你有什么想法吗?

我的实体定义如下:

from peewee import *


class EnumField(IntegerField):

    def __init__(self, *argv):
        super().__init__()
        self.enum = []
        for label in argv:
            self.enum.append(label)

    def db_value(self, value):
        try:
            return self.enum.index(value)
        except ValueError:
            raise EnumField.EnumValueDoesnExistError(
                "Value doesn\'t exist in enum set.\nMaybe you forgot to add "
                "that one: " + value + "?")

    def python_value(self, value):
        try:
            return self.enum[value]
        except IndexError:
            raise EnumField.EnumValueDoesnExistError(
                'No value for given id')

    class EnumValueDoesnExistError(Exception):
        pass

class ModelField(EnumField):

    def __init__(self):
        super().__init__('RUT955_Q', 'RUT955_H', 'GLiNet300M')

class ProviderField(EnumField):

    def __init__(self):
        super().__init__('Orange', 'Play', 'Virgin')


class BaseModel(Model):
    class Meta:
        database = SqliteDatabase('SIMail.db', pragmas={'foreign_keys': 1})


class RouterSettings(BaseModel):

    name = CharField(unique=True)
    ip = CharField(unique=True)
    username = CharField()
    password = CharField()
    model = ModelField()
    phone_num = IntegerField(unique=True)
    provider = ProviderField()
    location = CharField()

【问题讨论】:

    标签: python database peewee


    【解决方案1】:

    您可能使用数据库文件的相对路径运行它,并且取决于您在运行应用程序时与控制台运行时的当前工作目录,它使用不同的数据库文件。

    【讨论】:

    • 哇,真是个蹩脚的错误。由于某些原因,在手动测试期间,我无意中创建了另一个数据库文件。我没有注意到实际上我正在访问不同的 sqlite 文件。非常感谢。
    • 不是第一个也不是最后一个被它咬的。如果数据库不存在,Sqlite 会创建它,这增加了混乱。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-02-13
    • 2012-08-28
    • 2017-09-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多