SQL verbindungs Klasse

Installation und Anwendung von Datenbankschnittstellen wie SQLite, PostgreSQL, MariaDB/MySQL, der DB-API 2.0 und sonstigen Datenbanksystemen.
Antworten
polypus
User
Beiträge: 37
Registriert: Dienstag 27. September 2005, 14:11
Wohnort: Salzburg

Ich habe eine kleine Klasse gemacht, um mich zu einer beliebigen MySQL Datenbank zu verbinden.

Hier mal der Code:

Code: Alles auswählen

#!/usr/bin/python
# -*- coding: iso-8859-1 -*- 

    #########################################################

    #    SQL-connection and executing class                
    #    polypus - March 2007                     

    #########################################################


import MySQLdb
import sys

#-------------defining class------------------


class SqlAccess:
    """ SQL Access class Instance"""
    
    #----Constructor----
    def __init__(self, host, user, passwd, db):
        self.host   = host
        self.user   = user
        self.passwd = passwd
        self.db     = db

#--------defining common functions--------

    #----connecting-----
    def db_connect(self):
        try:
            self.database = MySQLdb.connect(self.host, self.user, 
                                            self.passwd, self.db)
        except:
            print "Error in specified parameters; check your SQL-access-data!"
            print "Exiting"
            sys.exit()


    #--executing query--
    def db_execute(self, query):
        try:
            self.cursor = self.database.cursor()
            self.cursor.execute(query)
            result = self.cursor.fetchall()
            return result
        except:
            print "Error in Mysql-query: ", query
            print "or database not connected!"


    #------closing------
    def db_close(self):
        self.cursor.close()
        self.database.close()
Nun gefällt mir das ja recht gut, aber nachdem das mein erstes Ding in dieser Art ist,
hätte ich gern ein paar Ratschläge/etwas Input, was man alles besser/schöner/sicherer machen könnte. :)

Cool wäre zum beispiel wenn das Script bei execute selber erkennen würde,
welchen Fehler es gibt (nicht verbunden oder falsche SQL Syntax). Ich weiß jetzt aber nicht, ob das nicht zu viel Aufwand bedeutet (weil das script ja sowieso eingebunden werden soll... :roll:
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Generell sollte man IMHO nicht alle exceptions Abfangen und dann keine Info's dazu ausgeben ;)

Ich mach das meist so:

Code: Alles auswählen

try:
    "...mach irgendwas..."
except Exception, e:
    print "Error:", e
Einen richtigen Traceback kannst du so ausgeben:

Code: Alles auswählen

try:
    "...mach irgendwas..."
except Exception, e:
    import sys, traceback
    etype, value, tb = sys.exc_info()
    tb = tb.tb_next
    tb_lines = traceback.format_exception(etype, value, tb)
    print "".join(tb_lines)
Aber was willst du eigentlich machen???
Ich würde mir da ehr SQLAlchemy ansehen!

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
polypus
User
Beiträge: 37
Registriert: Dienstag 27. September 2005, 14:11
Wohnort: Salzburg

Naja, ich Habs eigentlich nur als Fingerübung gemacht, und es ist auch nix besonderes.
Ich wollte das nur auslagern, weil ich sowas öfter brauche und dann muss ich es nicht jedesmal neu reinschreiben...
:oops:

Und als ~Anfänger bin ich mir bei manchen Sache noch nicht so sicher.

SQLAlchemy ist mir neu, werd ich mir aber mal anschauen... :idea:
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Hab mal die Seite [wiki]try...except[/wiki]erstellt... Wobei da noch einige Sachen fehlen, wie z.B. "finally"...

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
polypus
User
Beiträge: 37
Registriert: Dienstag 27. September 2005, 14:11
Wohnort: Salzburg

ich hab mal das reingebaut:

Code: Alles auswählen

except MySQLdb.Error, e:
    print "Error %d: %s" % (e.args[0], e.args[1])
scheint zu klappen. Nur sind die Eingebauten Fehlerbezeichungen in MySQLdb scheinbar nicht die besten..
Zuletzt geändert von polypus am Montag 5. März 2007, 08:44, insgesamt 1-mal geändert.
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:


GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
polypus
User
Beiträge: 37
Registriert: Dienstag 27. September 2005, 14:11
Wohnort: Salzburg

jens hat geschrieben:Schau dir auch mal das an: http://www.python-forum.de/topic-8002.html
Da läuft es einem ja kalt den Rücken runter beim Lesen (und ich verstehe grad mal die Hälfte...). :?

Was soll ich jetzt daraus schließen? MySQLdb verschmeißen und SQLAlchemy verwenden?
Naja, noch habe ich ja keine Probleme...
Privat werde ich sowieso eher SQLite mal intensiver beäugen! :shock:
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

jens hat geschrieben:Einen richtigen Traceback kannst du so ausgeben:

Code: Alles auswählen

try:
    "...mach irgendwas..."
except Exception, e:
    import sys, traceback
    etype, value, tb = sys.exc_info()
    tb = tb.tb_next
    tb_lines = traceback.format_exception(etype, value, tb)
    print "".join(tb_lines)
Ich sehe gerade im Wiki, das es viel einfacher geht:

Code: Alles auswählen

try:
    "...mach irgendwas..."
except Exception, e:
    import traceback
    print traceback.format_exc()
Siehe: [wiki]try...except[/wiki]
Wieder was gelernt :)

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Antworten