0

PyQt アプリケーションを開発するために、ローカルの MySQL サーバーを実行しています。サーバーがダウンしている場合に QMessageBox を表示できれば、アプリケーションが起動しない理由をエンドユーザーが理解できるようになると便利です。

サーバーをシャットダウンして端末からプログラムを実行すると、通常の応答が返されます。

pymysql.err.OperationalError: (2003, "Can't connect to MySQL server on '127.0.0.1' (2)")

私のコードは簡単です

import pymysql as lite

con = lite.connect(host='127.0.0.1',unix_socket='/run/mysqld/mysqld.sock', user='ivica',passwd='pass',db='baza',charset='utf8')

#define one class that inherits QMainWindow and so on...

「MySQL サーバーがダウンしています!」という QMessageBox を実際に表示する方法はありますか? または似たようなものですか?MySQL サーバーが実行されていない場合、アプリケーション ウィンドウも表示されず、端末エラーだけが表示されます。

:編集:

提案された変更の後、私のコードは次のようになります。

con = None #this is how I make it global, eg. not in any method or class (?)

def dbconnect():
    global con
    #con = None
    try:
        if os.name == 'nt':
            con = lite.connect(host='127.0.0.1', user='ivica',passwd='pass',db='baza',charset='utf8')
        else:
            con = lite.connect(host='127.0.0.1',unix_socket='/run/mysqld/mysqld.sock', user='ivica',passwd='pass',db='baza',charset='utf8')
    except lite.err.OperationalError as err:
        msgBox = QtGui.QMessageBox()
        msgBox.setText(str(err))
        msgBox.show()
    return con

class Logon(QtGui.QDialog):
    def __init__(self):
        QtGui.QDialog.__init__(self)
        self.ui=Ui_dlgLogovanje()
        self.ui.setupUi(self)
        QtCore.QObject.connect(self.ui.dugmeUloguj, QtCore.SIGNAL("clicked()"), self.doLogin)

    def doLogin(self):          
        with dbconnect():
            cur = dbconnect().cursor()

私が得るエラーは次のとおりです。

Traceback (most recent call last):
  File "main.py", line 59, in doLogin
    with dbconnect():
AttributeError: __exit__

:編集2:

unutbuの答えとコードをいじった後、これが私が探していた解決策です:

con = None

def dbconnect():
    global con
    try:
        if os.name == 'nt': 
            con = lite.connect(host='127.0.0.1', user='ivica',passwd='pass',db='baza',charset='utf8')
        else:
            con = lite.connect(host='127.0.0.1',unix_socket='/run/mysqld/mysqld.sock', user='ivica',passwd='pass',db='baza',charset='utf8')
    except lite.err.OperationalError as err:
        msgBox = QtGui.QMessageBox()
        msgBox.setText(str(err))
        msgBox.show()
    return con

class Logon(QtGui.QDialog):
    def __init__(self):
        QtGui.QDialog.__init__(self)
        self.ui=Ui_dlgLogovanje()
        self.ui.setupUi(self)
        QtCore.QObject.connect(self.ui.dugmeUloguj, QtCore.SIGNAL("clicked()"), self.doLogin)

    def doLogin(self):      
        if con == None:
            reply = QtGui.QMessageBox.warning(self, 'Greška',
            "Can't establish connection to database!", QtGui.QMessageBox.Ok)
            if reply == QtGui.QMessageBox.Ok:
                self.close() #and when user clicks OK program closes

        else:
        with dbconnect():
            cur = dbconnect().cursor()
                    #do other database stuff, check credentials etc.
4

1 に答える 1

1

try...exceptブロックを使用してOperationalError例外を処理します。

import sys
from PyQt4 import QtGui
import pymysql as lite


def dbconnect():
    global con
    config = {
        'host' : '127.0.0.1',
        'user' = 'ivica',
        'passwd' = 'pass',
        'db' = 'baza',
        'charset' = 'utf8'
        }
    try:
        if os.name == 'nt':
            con = lite.connect(**config)
        else:
            con = lite.connect(unix_socket = '/run/mysqld/mysqld.sock', **config))
    except lite.err.OperationalError as err:
        msgBox = QtGui.QMessageBox()
        msgBox.setText(str(err))
        msgBox.exec_()

if __name__ == '__main__':
    app = QtGui.QApplication(sys.argv)
    con = None
    dbconnect()
    if con is not None:
        sys.exit(app.exec_())

MySQL接続はプログラムのコア部分のように思われるので、接続プロセスが失敗した場合は、最初に接続を確立するか、終了することをお勧めします。

また、

with dbconnect():
    ...

conPythonが-blockを終了すると接続が閉じられるため、グローバルの定義とは互換性がありませんwith

于 2012-09-14T18:18:19.527 に答える