Witam
Piszę program który ma mi ułatwić życie w pracy. Wszytko dobrze jak na razie szło dopóki nie zacząłem ogarniać połączenia z bazą danych. Program ma defa kto synchronizować dwie bazy danych. Połączenie z bazą danych stworzyłem jako obiekt. Problem tkwi w tym że tego obiektu nie potrafię w sensowny sposób przekazać. Wykonuję to w ten sposób.
main.py:
.......
DB_output = 'NULL'
class Synchronizator(QWidget):
.........
def exitApp(self):
lgr.info('Exit application')
if config[0] == 'MSSQL':
print(DB_output)
DB_output.MSSQL_close()
#TODO: Poprawić rozłącznie bazy danych.
self.close()
def pushbottom_connect(self):
if len(self.lineEdit_Login.text()) >0 and len(self.lineEdit_Password.text()) >0 and len(self.lineEdit_DatabaseName.text()) >0 and len(self.lineEdit_Hostname.text()) >0:
if self.combo_SQL_name.currentText() == 'MSSQL':
DB_output = MSSQL.DB_MSSQL()
DB_output.connect(self.lineEdit_Login.text(), self.lineEdit_Password.text(), self.lineEdit_Hostname.text(), self.lineEdit_DatabaseName.text(), self.spinbox_port.text())
config[0]= 'MSSQL'
lgr.info('connect database MSSQL')
print(DB_output.table_check())
#self.treeDatabase(MSSQL_DB.table_check())
MSSQL.py
class DB_MSSQL():
def connect(self, login = 'NULL', password = 'NULL', host = 'NULL', database = 'NULL', port = 1433):
engine = create_engine('mssql+pyodbc://%s:%s@%s:%s/%s?driver=SQL+Server+Native+Client+11.0' %(login, password, host, port, database))
self.db = engine.connect()
lgr.info('MSSQL init connection')
def table_check(self):
tab=[]
query = self.db.execute('SELECT* FROM INFORMATION_SCHEMA.TABLES;')
for a in query:
tab.append(a[2])
tab.sort()
return tab
def MSSQL_close(self):
self.db.close()
print('połączenie zamknięte')
I teraz tak samo połączenie działa prawidłowo. Połączyłem się uzyskałem listę tabel z bazy danych lecz podczas wyłączania aplikacji i zamykania połączenia z bazą danych dostaję błąd:
DB_output.MSSQL_close()
AttributeError: 'str' object has no attribute 'MSSQL_close'
A jak po połączeniu z bazą danych wypisuję w tej samej funkcji DB_output dostaję referencję do obiektu natomiast jak już po połączeniu z bazą danych wypiszę DB_output z fikcji exitApp dostaję wynik NULL. Dlaczego ta zmienna się nie nadpisuje ?
Czy poprawnie wykonuję obsługę połączenia z bazą danych czy powinienem inaczej to wykonać ?