Как выбрать строку в sqlite с именем в строке вместо идентификатора с python? - PullRequest
0 голосов
/ 17 апреля 2020

Я программирую систему управления магазином на python, используя sqlite в качестве базы данных. Я хочу видеть цену товара при вводе имени товара вместо идентификатора товара ... ниже приведен фрагмент кода

   def ajax2(self, *args, **kwargs):
        self.get_name = self.entername_e.get()
        #get the products info with that name or id and fill labels above
        query = "SELECT * FROM inventory WHERE name=?"
        result = c.execute(query, (self.get_name, ))
        for self.r in result:
            self.get_name = self.r[1] #name
            self.get_price = self.r[4] #sp
            self.get_stock = self.r[2] #stock
        self.productname.configure(text="Product's Name: "+ str(self.get_name))
        self.pprice.configure(text="Price: Gh "+str(self.get_price))

Каждый раз, когда я запускаю код после ввода имени в метка Entry, имя появляется, даже если его нет в базе данных, а в командной строке следует сообщение об ошибке, как показано ниже:

Exception in Tkinter callback
Traceback (most recent call last):
File "C:\Users\GH\AppData\Local\Programs\Python\Python38\lib\tkinter\__init__.py", line 1883, in 
__call__
return self.func(*args)
File "main.py", line 96, in ajax2
self.pprice.configure(text="Price: Gh "+str(self.get_price))
AttributeError: 'Application' object has no attribute 'get_price'
PS C:\Users\GH\Desktop\Developments\Store Management Software> 

Ответы [ 2 ]

0 голосов
/ 17 апреля 2020

Я не думаю, что вы понимаете объектно-ориентированный подход в этом python коде. Ключевое слово self используется для доступа к базовому объекту, все атрибуты которого должны быть определены в функции init класса. Эти атрибуты должны присутствовать только для представления состояния экземпляра класса. Смотрите эту ссылку: ссылка

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

def getAttribute_1(self):
   return self.attribute_1

. Существует множество хороших книг и учебных пособий по объектно-ориентированному программированию, если вы хотите узнать о них больше, просто зайдите в Google.

В этом случае, например, я не понимаю, почему вы делаете: for self.r in result: ..., когда вы должны позволить go исключить ключевое слово self: for r in result: ... Поскольку эта переменная результата актуальна только в области действия ваша функция.

Кроме того, если вы хотите установить атрибут цены вашего текущего объекта, вы должны определить этот атрибут в функции init :

def __init__(self, ...)
    self.price = 0 """or whatever default value 
you want to give it, or initiate it by giving the initial 
value as an argument for the constructor"""

возможно определите метод получения и установки следующим образом:

def get_price(self):
    return self.price
def set_price(self, new_price):
    self.price = new_price

Затем используйте эти методы в вашей функции ajax. Просто не забудьте провести различие между локальными переменными, например price = result[4], которые имеют отношение только к этой функции, и атрибутами вашего объекта, такими как self.price! Это два совершенно разных понятия.

Чтобы ответить на вашу ошибку в этом примере: get_price не устанавливается, если результаты, возвращаемые запросом, равны None, и в этом случае l oop не будет введено. В этом случае атрибут self.get_price вашего объекта никогда не создавался, поэтому возникает ошибка.

Надеюсь, это поможет

0 голосов
/ 17 апреля 2020

Если имя отсутствует в базе данных, курсор, возвращаемый запросом, пуст и значение l oop не вводится. В результате, self.get_name не изменяется и сохраняет введенное значение, а self.get_price не устанавливается, поэтому возникает ошибка.

Вы должны явно протестировать для этого случая:

    ...
    result = c.execute(query, (self.get_name, ))
    empty = True
    for self.r in result:
        empty = False
        self.get_name = self.r[1] #name
        self.get_price = self.r[4] #sp
        self.get_stock = self.r[2] #stock
    if empty:    // name is not present in database
        ...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...