कार्यात्मक तरीका:
यह तरीका उन कार्यों को दिखाता है जिन्हें आपको किसी अन्य मॉड्यूल में कॉल करने में सक्षम होने के लिए सेट अप करने की आवश्यकता होती है। मैंने संदर्भ प्रबंधक को हटा दिया है जिसका उपयोग इस कार्यात्मक पैटर्न के साथ नहीं किया जा सकता है, क्योंकि यह फ़ंक्शन के अंत में बंद हो जाता है Open_Conn
. तो open_conn
फ़ंक्शन एक server
बनाता है ऑब्जेक्ट, और डेटाबेस ऑब्जेक्ट db
, उन्हें close_conn
. में अगला कॉल किया जाएगा आवश्यकता पड़ने पर बंद करने के लिए।
#OpenConn.py
import MySQLdb
from sshtunnel import SSHTunnelForwarder
def open_conn():
server = SSHTunnelForwarder(
('192.168.0.10', 22),
ssh_password="xxx",
ssh_username="xxx",
remote_bind_address=('localhost', 3306))
server.start()
print('opening server : OK')
db = MySQLdb.connect(host='localhost',
port=server.local_bind_port,
user='xxx',
passwd='xxx',
db='DBNAME')
print('opening database : OK')
return (server, db)
def close_conn(server, db):
db.close()
server.stop()
print('closing connection : OK')
from PyQt5 import QtCore, QtGui, QtWidgets
import sys
from ViewClientsUI import Ui_ViewClients
from OpenConn import open_conn, close_conn
class ViewClientsWindow(QtWidgets.QDialog, Ui_ViewClients):
def __init__(self):
super(ViewClientsWindow, self).__init__()
self._new_window = None
self.setupUi(self)
self.data_load()
def data_load(self):
server, db = open_conn()
cursor = db.cursor()
query = "SELECT * FROM Clients"
cursor.execute(query)
results = cursor.fetchall()
self.tableWidget.setRowCount(0)
for row_number, row_data in enumerate(results):
self.tableWidget.insertRow(row_number)
for column_number, data in enumerate(row_data):
self.tableWidget.setItem(row_number, column_number, QtWidgets.QTableWidgetItem(str(data)))
close_conn(server, db)
if __name__ == '__main__':
app = QtWidgets.QApplication(sys.argv)
gui = ViewClientsWindow()
gui.show()
sys.exit(app.exec_())
संदर्भ प्रबंधक तरीका:
उद्घाटन और समापन भाग को स्वचालित रूप से संभालने के लिए एक संदर्भ प्रबंधक वर्ग का उपयोग करके कार्यात्मक पैटर्न में सुधार किया जा सकता है। प्रबंधक केवल db.cursor
लौटा सकता है प्रश्नों को निष्पादित करने के लिए, सर्वर प्रबंधक के अंदर रहता है। cursor
प्राप्त करने के लिए , आप __enter__
. विधि के अंदर संदर्भ प्रबंधक द्वारा मूल्य वापसी को पकड़ते हैं के रूप में . का उपयोग करके :with OpenManager() as cursor:
।
इसे बनाने के लिए, मूल रूप से, आप उद्घाटन . को स्थानांतरित कर सकते हैं विधि के अंदर कोड __enter__
(निष्पादित जब आप संदर्भ प्रबंधक को कॉल करेंगे) और समापन विधि के अंदर भाग __exit__
(with statement
. के अंत में कॉल किया जाता है ब्लॉक)
#OpenConn.py
import MySQLdb
from sshtunnel import SSHTunnelForwarder
class OpenManager(object):
def __init__(self):
self.server =None
self.db = None
# here you could define some parameters and call them next
def __enter__(self):
self.server = SSHTunnelForwarder(
('192.168.0.10', 22),
ssh_password="xxx",
ssh_username="xxx",
remote_bind_address=('localhost', 3306))
self.server.start()
print('opening server : OK')
self.db = MySQLdb.connect(host='localhost',
port=self.server.local_bind_port,
user='xxx',
passwd='xxx',
db='DBNAME')
print('opening database : OK')
return self.db.cursor() #
def __exit__(self, type, value, traceback):
self.db.close()
self.server.stop()
print('closing connection : OK')
यह पैटर्न आपको with statement
. के अंदर अपने विजेट में संदर्भ प्रबंधक को कॉल करने की अनुमति देता है नीचे की तरह:
from PyQt5 import QtCore, QtGui, QtWidgets
import sys
from ViewClientsUI import Ui_ViewClients
from OpenConn import OpenManager
class ViewClientsWindow(QtWidgets.QDialog, Ui_ViewClients):
def __init__(self):
super(ViewClientsWindow, self).__init__()
self._new_window = None
self.setupUi(self)
self.data_load()
def data_load(self):
with OpenManager() as cursor:
query = "SELECT * FROM Clients"
cursor.execute(query)
results = cursor.fetchall()
self.tableWidget.setRowCount(0)
for row_number, row_data in enumerate(results):
self.tableWidget.insertRow(row_number)
for column_number, data in enumerate(row_data):
self.tableWidget.setItem(row_number, column_number, QtWidgets.QTableWidgetItem(str(data)))
if __name__ == '__main__':
app = QtWidgets.QApplication(sys.argv)
gui = ViewClientsWindow()
gui.show()
sys.exit(app.exec_())
आप SSHTunnelForwarder
. के साथ भी संबंध बना सकते हैं इससे बचने के लिए सीधे विजेट में और कक्षा द्वारा प्रदान किए गए संदर्भ प्रबंधक का उपयोग करें, फिर अंदर डेटाबेस कनेक्शन बनाएं।
ऊपर दिखाया गया कस्टम वर्ग सर्वर और डेटाबेस से कनेक्शन को एक संदर्भ में मिलाने का एक तरीका है, यदि आपको अपने कोड में कई स्थानों पर इन कनेक्शनों की आवश्यकता है तो इसे आसान बनाया जा सकता है।