Mysql
 sql >> डेटाबेस >  >> RDS >> Mysql

किसी अन्य स्क्रिप्ट पर डेटाबेस कनेक्शन का संदर्भ देने वाला पायथन

कार्यात्मक तरीका:

यह तरीका उन कार्यों को दिखाता है जिन्हें आपको किसी अन्य मॉड्यूल में कॉल करने में सक्षम होने के लिए सेट अप करने की आवश्यकता होती है। मैंने संदर्भ प्रबंधक को हटा दिया है जिसका उपयोग इस कार्यात्मक पैटर्न के साथ नहीं किया जा सकता है, क्योंकि यह फ़ंक्शन के अंत में बंद हो जाता है 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 . के साथ भी संबंध बना सकते हैं इससे बचने के लिए सीधे विजेट में और कक्षा द्वारा प्रदान किए गए संदर्भ प्रबंधक का उपयोग करें, फिर अंदर डेटाबेस कनेक्शन बनाएं।

ऊपर दिखाया गया कस्टम वर्ग सर्वर और डेटाबेस से कनेक्शन को एक संदर्भ में मिलाने का एक तरीका है, यदि आपको अपने कोड में कई स्थानों पर इन कनेक्शनों की आवश्यकता है तो इसे आसान बनाया जा सकता है।




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. प्रति दिनांक अंतराल पर अद्वितीय विज़िटर कैसे चुनें?

  2. SQL सर्वर तालिका को अद्यतन करने के लिए MySQL ट्रिगर

  3. हमें बाएँ और दाएँ जुड़ने की आवश्यकता क्यों है

  4. जावा, MySQL और टॉमकैट के साथ कनेक्शन पूल का उपयोग कैसे करें 6

  5. MySQL में कई-से-अनेक कनेक्शन के लिए लिंकिंग तालिका को ठीक से कैसे अनुक्रमित करें?