Python i MySQL - problem z zapytaniem do bazy

0

Czołem! Jestem bardzo początkujący, robię właśnie powtórkę i nie idzie. Wszędzie podpowiedzi dotyczą pierwszego połączenia z bazą ale to u mnie działa i schody się zaczynają później...
W skrócie:

  • pierwsze połączenie z bazą aby sprawdzać login i hasło mam w klasie DataBaseCon, metoda logowanie działa bez zarzutu.
  • kolejne odwołania się do tego połączenia aby wyciągnąć dane z jakiejkolwiek tabeli w bazie NIE działają i nie mam pojęcia dlaczego.

Pytanie: czy muszę tworzyć kolejne połączenie z bazą? Myślałem, że to istniejące połączenie jest jakby cały czas "otwarte w tle" i mogę kolejnymi SELECTami się do niego podpiąć. Wygląda na to, że jednak nie. Podpowiecie jak w innej klasie już po zalogowaniu, gdy np. wywołam menu dla użytkownika należy się odwołać do bazy danych? Tworzyć kolejne połączenie? Nowy obiekt?

0

Pokaż kod.

0
DolBo napisał(a):

Pokaż kod.

Skopiowałem większość. Tych metod w klasie administratora nie mam jeszcze gotowych ale mam nadzieję, że widoczny jest zamysł. Dziękuję za zainteresowanie tematem.

import accessDB
import pymysql

class DataBaseConnect:
def init(self):
try:
self.connect = pymysql.connect(accessDB.dbHost, accessDB.dbUser, accessDB.dbPassword, accessDB.dbName, charset='utf8')
print('Zalogowano!')
self.logowanie()
except:
print('Error')

def logowanie(self):
    login = input('Login: ')
    paswrd = input('Hasło: ')
    self.c = self.connect.cursor()
    self.c.execute('SELECT * FROM lista_logowania WHERE login=%s AND paswrd=%s', (login, paswrd))
    logcheck = self.c.fetchall()
    if len(logcheck) == 1:
        statusuzytkownika = logcheck[0][1]
        if statusuzytkownika == 'administrator':
            administrator.aMenu(self)
        elif statusuzytkownika == 'regular':
            regular.rMenu(self)
        else:
            print('Nie przyznano Ci żadnych uprawnień!!!')
    else:
        print('Niepoprawny login lub hasło! Spróbuj ponownie!')
        self.logowanie()

class regular:
def init(self):
try:
self.conn = pymysql.connect(accessDB.dbHost, accessDB.dbUser, accessDB.dbPassword, accessDB.dbName, charset='utf8')
self.c = self.conn.cursor()
except:
print('---Brak połaczenia z bazą!---')

def rMenu(self):
    print('Uprawnienia---Basic---\nMenu wyboru:')
    while (True):
        decision = input('W - Pokaż moje dane zapisane w bazie!'
                         'Q - Wyjście z programu!').upper()
        if (decision == 'W'):
            self.displayMe()
        elif (decision == 'Q'):
            print('Koniec!')
            break
        else:
            print('\t\t|Podałeś niewłaściwy kod. Spróbuj ponownie!|')
def displayMe(self):
    self.c.execute('SELECT * FROM all_list')
    wynik = self.c.fetchone()
    print(wynik)

class administrator:
def init(self):
try:
self.conn = pymysql.connect(accessDB.dbHost, accessDB.dbUser, accessDB.dbPassword, accessDB.dbName, charset='utf8')
self.c = self.conn.cursor()
except:
print('---Brak połaczenia z bazą!---')

def aMenu(self):
    print('Jesteś administratorem---\nMenu wyboru:')
    while (True):
        decision = input('W - Pokaż WSZYSTKICH użytkowników z bazy danych!'
                         '\nD - Usun użytkownika'
                         '\nI-dodaj użytkownika'
                         '\nQ - Wyjście z programu!').upper()
        if (decision == 'W'):
            self.displayMe()
        if (decision == 'D'):
            self.delete()
        if (decision == 'I'):
            self.insert()
        elif (decision == 'Q'):
            print('Koniec!')
            break
        else:
            print('\t\t|Podałeś niewłaściwy kod. Spróbuj ponownie!|')

def displayAll(self):
    self.c.execute('SELECT * FROM all_list')
    wynik = self.c.fetchall()
    print(wynik)
0

Gdy wklejasz kod na forum używaj znaczników jest zdecydowanie czytelniej.

idea typu:


def init(self):
    try:
        self.connect = pymysql.connect(accessDB.dbHost, accessDB.dbUser, accessDB.dbPassword, accessDB.dbName, charset='utf8')
        print('Zalogowano!')
        self.logowanie()
     except:
          print('Error')

w kążdym inicie nie jest zbyt dobrym pomysłem:

  • używasz tego samego fragmentu kodu
  • to jest średnio/trudno testowalne
    dodatkowo
  • w tym gaszczu nie widze gdzie zamykasz polaczenie chyba nigdzie ( albo mi umyka bo pozna godzina)
  • nie musisz używac ( ) wokol ifow i elifow itp w Python to nie Java/C++

Generalnie konwencja jest taka iż nazwy klasy piszemy wielką literą.
Nie do końca rozumiem jaki był zamysł skoro:

class administrator

no i ty wykonujesz


administrator.aMenu(self)

potrafisz to wyjaśnić ?

0

Na pewno mocno zamieszałem bo sam nie do końca się czuję pewnie w tym co piszę więc chyba muszę wrócić do podstaw...

Moje założenie było takie, że mam kilka tabel w mysql, w których są dane odnośnie użytkowników i planuję im dać 3 poziomy uprawnień... Basic/Regular/Admin i od najmniejszych do największych uprawnień. Chciałbym wykorzystać dziedziczenie, że Basic ma jakąś podstawową funckjonalność (np. wypisywanie z jednej tabeli) a pozostali już z kolejnych tabel...

Napiszę może do końca skrypt tak jak umiem i jak to widzę i ewentualnie podrzucę do wglądu... Dzięki za odzew!

1 użytkowników online, w tym zalogowanych: 0, gości: 1