Seite 1 von 1

MySQL-Verbindung später trennen

Verfasst: Mittwoch 2. Dezember 2015, 20:32
von Sophus
Hallo Leute,

nachfolgend seht ihr ein Skript, in welches ich eine Verbindung zum MySQL-Server herstelle. Soweit auch alles ganz gut. Nun seht ihr, dass ich eine weitere Funktion eingebaut habe, und zwar die interrupt_connection_to_mysql()-Funktion. Mir geht es darum, dass ich später die Verbindung zum Server manuell trennen möchte, sobald diese Funktion aufgerufen wird. Nun grübel ich, wie ich dies bewerkstelligen könnte.

Code: Alles auswählen

#!/usr/bin/env python
#-*- coding:utf-8 -*-

FILE_NAME = "manage_mysql.py"

from sqlalchemy import create_engine
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy import exc
from sqlalchemy import Column, Integer, String
from sqlalchemy.orm import sessionmaker


Base = declarative_base()

def interrupt_connection_to_mysql():
    answer = ""
    while True :
        if not answer == "":
            print "Disconnected"
            # Here I want to disconnect  from server 
            break
        else:
            print "Was sagt?", conn_serv
            result = raw_input("Disconnect? (Y)es or (N)o: ")
            if result == "Y":
                answer = "No more empty variable"

def connect_to_mysql(dbm_system, dbm_driver, db_user, db_passwd, db_host, db_port, db_name):
    
    print "STATUS [OK]  (", FILE_NAME, "):  Calling the function (connect_to_mysql)"
    try:
        print "STATUS [OK]  (", FILE_NAME, "):  Creating an engine-instance"

        engine = create_engine(dbm_system+'+'+dbm_driver+'://' + db_user + ':' + db_passwd + '@' + db_host + ':' + db_port + '/' + db_name,
             encoding='utf8', echo=True)

        Base.metadata.create_all(engine)
        Session = sessionmaker(bind=engine)
        print "SESSION:", Session
        print "STATUS [OK]  (", FILE_NAME, "):  Engine-instance was created"    


        print "STATUS [OK]  (", FILE_NAME, "):  Successfully connected to the database."
        connection = engine.connect()

        print "STATUS [OK]  (", FILE_NAME, "):  Using the chosen database"

        return True
    except exc.SQLAlchemyError as AlErr:
        print "ERROR IN CONNECTION: {}".format(AlErr.args[0])
        return AlErr[0]


def get_access_data():
    server_host = unicode(raw_input("Serverhost: "))
    db_user = unicode(raw_input("Username: "))
    db_passwd = unicode(raw_input("Password: "))
    data_base_name = unicode(raw_input("Database: "))
    db_port = unicode(raw_input("Port: "))

    dbms_driver = u'pymysql'
    dbm_system = u'mysql'

    conn_result = connect_to_mysql(dbm_system,
                                   dbms_driver,
                                   db_user,
                                   db_passwd,
                                   server_host,
                                   db_port,
                                   data_base_name)
    if conn_result == True:
        print "You are connect with database."
        interrupt_connection_to_mysql()
    else:
        print conn_result

if __name__ == "__main__":
    get_access_data()

Re: MySQL-Verbindung später trennen

Verfasst: Mittwoch 2. Dezember 2015, 21:07
von Sirius3
@Sophus: conn_serv ist nicht definiert, die Funktion ist auch irgendwie von hinten durch die Brust. Was ist der Sinn der Variable answer?

Code: Alles auswählen

def interrupt_connection_to_mysql(conn_serv):
    while True :
        print "Was sagt?", conn_serv
        result = raw_input("Disconnect? (Y)es or (N)o: ")
        if result == "Yes":
            print "Disconnected"
            conn_serv.close()
            break
Aber was ist überhaupt der Sinn einer solchen Funktion?

create_engine kommt auch mit Keyword-Argumenten zurecht. Es gibt das logging-Modul, das ist flexibler als Deine prints. Wenn eine Exception geworfen wird, will man diese normalerweise weiterreichen, statt einen sinnfreien Rückgabewert zu erhalten. Das return hat auch einen TypeError.

Re: MySQL-Verbindung später trennen

Verfasst: Mittwoch 2. Dezember 2015, 21:41
von BlackJack
@Sophus: Dazu müsstest Du die Sitzung und alle Verbindungen schliessen und auf der Engine die `dispose()`-Methode aufrufen. Und dazu müsstest Du diese Objekte irgendwie auch aus der Verbindungsfunktion heraus geben und nicht `True` oder eine Zeichenkette — was eine etwas eigenartige API-Entscheidung ist. Überhaupt ist das Umwandeln einer Ausnahme in eine Zeichenkette mit der Fehlermeldung als Rückgabewert ”falsch”. Warum an der Stelle nicht einfach beim Aufrufer die Ausnahme behandeln, so wie das gedacht ist.

Re: MySQL-Verbindung später trennen

Verfasst: Mittwoch 2. Dezember 2015, 21:48
von Sophus
@Sirius3: In der Tat sind mir einige Fehler unterlaufen. Das sehe ich auch gerade. Da war ich zu voreilig. Die Print-Anweisungen werfe ich später auch wieder raus. Mir ging es auch nur darum, um zu sehen, ob bisher alles richtig durchlaufen wird. Bezüglich der answer -Variable ist, dass ich die While-Schleife unterbrechen will, sobald sie nicht mehr leer ist. Der User wird nach der erfolgreichen Verbindung gefragt, ob er die Verbindung trennen möchte. Und den Sinn dieser Funktion: Ich möchte erst einmal eine Verbindung herstellen, und nach belieben hinterher die Verbindung wieder trennen. Ich stelle mir dabei wie bei einem FTP-Client-Programm vor. Man baut eine Verbindung auf, und man hat auch gleich die Wahl, die Verbindung auch wieder zu trennen.

Ich versuche das so zu lösen, dass ich die Verbindung per return übergebe, und sie dann an die interrupt_connection_to_mysql als Argument übergebe und darüber mit der close() die Verbindung trenne. Aber ich denke, damit ist es noch nicht getan?

Code: Alles auswählen

#!/usr/bin/env python
#-*- coding:utf-8 -*-

FILE_NAME = "manage_mysql.py"

from sqlalchemy import create_engine
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy import exc
from sqlalchemy import Column, Integer, String
from sqlalchemy.orm import sessionmaker


Base = declarative_base()


def interrupt_connection_to_mysql(engine_obj):
    try:
        answer = ""
        while True :
            if not answer == "":
                engine_obj.close()
                print "Disconnected"
                # Here I want to disconnect from server!
                break
            else:
                result = raw_input("Disconnect? (Y)es or (N)o: ")
                if result == "Y":
                    answer = "Y"
    except Exception as e:
        pass

def connect_to_mysql(dbm_system, dbm_driver, db_user, db_passwd, db_host, db_port, db_name):
    
    print "STATUS [OK]  (", FILE_NAME, "):  Calling the function (connect_to_mysql)"
    try:
        print "STATUS [OK]  (", FILE_NAME, "):  Creating an engine-instance"

        engine = create_engine(dbm_system+'+'+dbm_driver+'://' + db_user + ':' + db_passwd + '@' + db_host + ':' + db_port + '/' + db_name,
             encoding='utf8', echo=True)

        Base.metadata.create_all(engine)
        Session = sessionmaker(bind=engine)
        print "SESSION:", Session
        print "STATUS [OK]  (", FILE_NAME, "):  Engine-instance was created"    


        print "STATUS [OK]  (", FILE_NAME, "):  Successfully connected to the database."
        conn_serv = engine.connect()

        #conn_serv = connection

        print "STATUS [OK]  (", FILE_NAME, "):  Using the chosen database"
        
        return conn_serv
    except exc.SQLAlchemyError as AlErr:
        print "ERROR IN CONNECTION: {}".format(AlErr.args[0])
        return AlErr[0]


def get_access_data():
    server_host = unicode(raw_input("Serverhost: "))
    db_user = unicode(raw_input("Username: "))
    db_passwd = unicode(raw_input("Password: "))
    data_base_name = unicode(raw_input("Database: "))
    db_port = unicode(raw_input("Port: "))

    dbms_driver = u'pymysql'
    dbm_system = u'mysql'

    conn_result = connect_to_mysql(dbm_system,
                                   dbms_driver,
                                   db_user,
                                   db_passwd,
                                   server_host,
                                   db_port,
                                   data_base_name)
    
    interrupt_connection_to_mysql(conn_result)

if __name__ == "__main__":
    get_access_data()

Re: MySQL-Verbindung später trennen

Verfasst: Mittwoch 2. Dezember 2015, 22:27
von Sophus
Da ich meinen vorherigen Beitrag nicht ändern/löschen kann, muss ich leider einen neuen Beitrag eröffnen. Betrachte also den oberen Beitrag als gegenstandslos. Hier mein Versuch: Ich gebe zwei Objekte (conn_serv,engine und Session) als Rückgabewert zurück. Und diese übergebe ich dann der interrupt_connection_to_mysql()-Funktion. Auf das Objekt conn_obj rufe ich die close()-Methode und auf Objekt engine_obj rufe ich die dispose()-Methode und auf das Objekt session_obj rufe ich die close()-Methode auf, so wie BlackJack es mir vorgeschlagen hat. Ich hoffe, dass ich alles bedacht habe? Damit kann ich also sicher sein, dass die Verbindung zur Datenbank auch wirklich abgebrochen wurde?

Code: Alles auswählen

#!/usr/bin/env python
#-*- coding:utf-8 -*-

from sqlalchemy import create_engine
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy import exc
from sqlalchemy import Column, Integer, String
from sqlalchemy.orm import sessionmaker


Base = declarative_base()


def interrupt_connection_to_mysql(conn_serv, engine_obj, session_obj):
    try:
        answer = ""
        while True :
            if not answer == "":
                print "Disconnected"
                conn_serv.close()
                session_obj.close()
                engine_obj.dispose()
                # Here I want to disconnect from server!
                break
            else:
                result = raw_input("Disconnect? (Y)es or (N)o: ")
                if result == "Y":
                    answer = "Y"
    except Exception as e:
        pass

def connect_to_mysql(dbm_system, dbm_driver, db_user, db_passwd, db_host, db_port, db_name):
    
    try:

        engine = create_engine(dbm_system+'+'+dbm_driver+'://' + db_user + ':' + db_passwd + '@' + db_host + ':' + db_port + '/' + db_name,
             encoding='utf8', echo=True)

        Base.metadata.create_all(engine)
        Session = sessionmaker(bind=engine)
        conn_serv = engine.connect()
        
        return conn_serv, engine, Session
    except exc.SQLAlchemyError as AlErr:
        print "ERROR IN CONNECTION: {}".format(AlErr.args[0])
        return AlErr[0]


def get_access_data():
    server_host = unicode(raw_input("Serverhost: "))
    db_user = unicode(raw_input("Username: "))
    db_passwd = unicode(raw_input("Password: "))
    data_base_name = unicode(raw_input("Database: "))
    db_port = unicode(raw_input("Port: "))

    dbms_driver = u'pymysql'
    dbm_system = u'mysql'

    conn_serv, engine_obj, session_obj = connect_to_mysql(dbm_system,
                                   dbms_driver,
                                   db_user,
                                   db_passwd,
                                   server_host,
                                   db_port,
                                   data_base_name)
    
    interrupt_connection_to_mysql(conn_serv, engine_obj, session_obj)


if __name__ == "__main__":
    get_access_data()