Peewee получает данные в консоли Python, но не в приложении - PullRequest
0 голосов
/ 17 декабря 2018

У меня есть объекты, разработанные с помощью peewee на Python.Прежде чем приступить к реализации реальной базы данных, я провел несколько тестов с базами данных в памяти.Когда я начал реализовывать функциональность базы данных, я столкнулся со странной проблемой.Мои запросы возвращают пустые результаты, что еще зависит от того, запускаю ли я скрипт или использую консоль 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)

Это возвращает исключение Запрос на сопоставление экземпляра не существует

print (RouterSettings.select (). Где(RouterSettings.name == 'RUT00'). Get (). Name) Файл "C: \ Users \ Kamil \ AppData \ Local \ Programs \ Python \ Python37-32 \ lib \ site-packages \ peewee.py", строка5975, в get (clone.model, sql, params)) Entities.RouterSettingsDoesNotExist: запрос на сопоставление экземпляра не существует: SQL: SELECT "t1". "Id", "t1". "Name", "t1". "Ip"," t1 "." username "," t1 "." пароль "," t1 "." model "," t1 "." phone_num "," t1 "." provider "," t1 "." location "FROM"routersettings" AS "t1" ГДЕ ("t1". "name" =?) LIMIT?ОФСЕТ?Параметры: ['RUT00', 1, 0]

Когда я пытался отлаживать, я обнаружил, что база данных как будто не создана: enter image description here Обратите вниманиечто в отлаживаемых переменных объект базы данных равен нулю (нет).Есть ли у вас какие-либо идеи, что происходит?

Мои сущности определены следующим образом:

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()

1 Ответ

0 голосов
/ 17 декабря 2018

Вы, вероятно, запускаете его с относительным путем к файлу базы данных, и в зависимости от текущего рабочего каталога, когда вы запускаете приложение против консоли, оно использует другой файл базы данных.

...