Führt sich nach import mehrfach aus

Installation und Anwendung von Datenbankschnittstellen wie SQLite, PostgreSQL, MySQL, der DB-API 2.0 und sonstigen Datenbanksystemen.
Antworten
Zack
User
Beiträge: 47
Registriert: Dienstag 24. April 2007, 11:19

Dienstag 12. Juni 2007, 09:25

Ich habe eine Klasse gebastelt, die mir meine SQL-Befehle ausführen und die Connection zum SQL-Server verwalten soll. Wenn ich diese aber in meine Projekte importiere, führen die sich mehrfach aus. Das heist, nachdem es Ordnungsgemäß einmal durchgelaufen ist, fängt er wieder von vorn an. Ich kann mir nicht erklären warum dies so ist. Ich hoffe ihr könnt mir weiterhelfen. Geschrieben ist dies für die Firebird-SQL-Datenbank in verbindung mit kinterbasdb.

Meine erstellte Klasse:

Code: Alles auswählen

import string, win32net, win32api, kinterbasdb, os, sys
import ConfigParser
# ------------------------------------------------------------------------------
# Verbindung zum SQL-Server aufbauen
class wSubprocess:
    def __init__(self):
        global con
        
        if not kinterbasdb.initialized:
            kinterbasdb.init(type_conv=200)
            con = kinterbasdb.connect(dsn='C:/TEST2.FDB', user='user', password='pass')
# ------------------------------------------------------------------------------
# Die SQL-Befehle für kinterbasdb aufbereiten
    def execute(self, *argv):

        cur = con.cursor()
        if (len(argv) < 2):
            cur.execute(argv[0])
        else:
            cur.execute(argv[0],argv[1])
        con.commit()
        cur.close()
# ------------------------------------------------------------------------------
# Prozesse ausführen und die ausgaben an stdout übergeben, um so die log zu füllen, die als blob in die db kommt
    def run(self, command, error='Crashed'):
        self.setHighID()
        import subprocess
        p=subprocess.Popen(command, stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE )
        res = p.wait()
        if res <> 0:
            print p.stderr.read()
            f = file(logfile, 'rb')
            cur = con.cursor()
            cur.execute("UPDATE W_BUILD set W_STATUS = ? WHERE W_ID = ?",(error,highid))
            cur.execute("UPDATE W_BUILD set W_LOG = ? WHERE W_ID = ?",(f.read(),highid))
            con.commit()
            cur.close()
            f.close()
            os.remove(logfile)
        else:
            print p.stdout.read()
            f = file(logfile, 'rb')
            cur = con.cursor()
            cur.execute("UPDATE W_BUILD set W_LOG = ? WHERE W_ID = ?",(f.read(),highid))
            con.commit()
            cur.close()
            f.close()
        return res
# ------------------------------------------------------------------------------
# den letzten SQL-Eintrag ermitteln
    def setHighID(self):
        global highid
        cur = con.cursor()
        cur.execute("SELECT W_ID FROM W_BUILD ORDER BY W_ID DESC")
        highid = cur.fetchone()[0]
        cur.close()
        return highid
# ------------------------------------------------------------------------------
# Die Log-File setzen
    def setLogFile(self, argv):
        global logfile
        logfile = argv
# ------------------------------------------------------------------------------
    def close(self):
        con.close()
        os.remove(logfile)
Mein Importaufruf sieht wie folgt aus:

Code: Alles auswählen

from wBuildManager import wPyRun
run = wPyRun.wSubprocess()
run.setLogFile(mylog.log)
...
run.close()
Diese aufrufe allein verursachen schon das Problem, ohne dass ein execute, etc aufgerufen wurde.
Die logfile wird von einem anderen modul geschrieben, dass alle stdout's in diese schreibt.
Lasse ich den Import aus, läuft das eigendliche Script einwandfrei. Daher denke ich, dass es an der oben geposteten Klasse liegen muss.

Ich hoffe ihr könnt mir weiterhelfen.
Mit freundlichen Grüßen
Zack
BlackJack

Dienstag 12. Juni 2007, 11:47

Also ich sehe da jetzt nichts auffälliges. Soviel wie Du mit globalen Namen hantierst, ist das aber sowieso nicht so übersichtlich.

`self` wird nicht ein einziges mal benutzt. Warum ist dass dann überhaupt alles in einer Klasse?
Zack
User
Beiträge: 47
Registriert: Dienstag 24. April 2007, 11:19

Dienstag 12. Juni 2007, 13:00

Ich wollte die gleiche SQL-Verbindung gerne in verschiedenen Modulen verwänden. Deshalb hab ich auf die globale Variable zurückgegriffen. Ich kahm nicht anderns an die con. als diese global zu setzen.

Und weil die Funktionen in der Klasse eh alle die gleiche SQL-Verbindung nutzen sah ich keinen Grund das in verschiedene Klassen auszulagern.
Y0Gi
User
Beiträge: 1454
Registriert: Freitag 22. September 2006, 23:05
Wohnort: ja

Dienstag 12. Juni 2007, 14:10

Vielleicht solltest du vor der Klasse erstmal ein ``con = None`` einfügen.
Zack
User
Beiträge: 47
Registriert: Dienstag 24. April 2007, 11:19

Dienstag 12. Juni 2007, 16:22

Das Problem habe ich selbst finden können. Ich schämme mich beinahe es zu sagen, aber ich habe das Modul 2x ins selbe Projekt importiert. Das führte zu dem oben erläuterten Problem.
Trotz dessen vielen dank für die Hilfe.
gruss zack
Antworten