Peewee 在 python 控制台而不是在应用程序中检索数据
Peewee retrieves data in python console but not in app
我在 Python 中使用 peewee 设计了实体。在我开始实施真正的数据库之前,我已经对内存数据库进行了几次测试。当我开始实现数据库功能时,我遇到了一个奇怪的问题。我的查询 returns 空结果,如果我 运行 脚本或使用 python 控制台还取决于什么。
首先证明逻辑是正确的。当我使用 python 控制台时,一切正常:
>>> from Entities import *
>>> print (RouterSettings.select().where(RouterSettings.name=='RUT00').get().name)
RUT00
正如你所见,一切都是正确的。执行特定查询并得到 returns 结果。现在在脚本中相同:
from Entities import *
print (RouterSettings.select().where(RouterSettings.name=='RUT00').get().name)
这个returns异常实例匹配查询不存在
print
(RouterSettings.select().where(RouterSettings.name=='RUT00').get().name)
File
"C:\Users\Kamil\AppData\Local\Programs\Python\Python37-32\lib\site-packages\peewee.py",
line 5975, in get
(clone.model, sql, params)) Entities.RouterSettingsDoesNotExist: instance matching query does not exist : SQL:
SELECT "t1"."id", "t1"."name", "t1"."ip", "t1"."username",
"t1"."password", "t1"."model", "t1"."phone_num", "t1"."provider",
"t1"."location" FROM "routersettings" AS "t1" WHERE ("t1"."name" = ?)
LIMIT ? OFFSET ? Params: ['RUT00', 1, 0]
当我尝试调试时,我发现数据库就像没有创建一样:
请注意,在调试变量中,数据库对象为空 (None)。
你知道发生了什么事吗?
我的实体定义如下:
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 中使用 peewee 设计了实体。在我开始实施真正的数据库之前,我已经对内存数据库进行了几次测试。当我开始实现数据库功能时,我遇到了一个奇怪的问题。我的查询 returns 空结果,如果我 运行 脚本或使用 python 控制台还取决于什么。
首先证明逻辑是正确的。当我使用 python 控制台时,一切正常:
>>> from Entities import *
>>> print (RouterSettings.select().where(RouterSettings.name=='RUT00').get().name)
RUT00
正如你所见,一切都是正确的。执行特定查询并得到 returns 结果。现在在脚本中相同:
from Entities import *
print (RouterSettings.select().where(RouterSettings.name=='RUT00').get().name)
这个returns异常实例匹配查询不存在
print (RouterSettings.select().where(RouterSettings.name=='RUT00').get().name) File "C:\Users\Kamil\AppData\Local\Programs\Python\Python37-32\lib\site-packages\peewee.py", line 5975, in get (clone.model, sql, params)) Entities.RouterSettingsDoesNotExist: instance matching query does not exist : SQL: SELECT "t1"."id", "t1"."name", "t1"."ip", "t1"."username", "t1"."password", "t1"."model", "t1"."phone_num", "t1"."provider", "t1"."location" FROM "routersettings" AS "t1" WHERE ("t1"."name" = ?) LIMIT ? OFFSET ? Params: ['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()
您可能 运行 它具有数据库文件的相对路径,并且当您 运行 您的应用与控制台使用不同的数据库时,取决于当前的工作目录文件.