Seite 1 von 1

sqlite-manager

Verfasst: Samstag 10. Juni 2006, 11:18
von murph
hi!
hier ein kleines probgramm. ich habe mein bestes gegeben, alles objektorientiert zu machen. ich weiß, dass da an einigen stellen bessere varianten gewesen wären, aber das ist immerhin mein erster 'großer' skript.

Code: Alles auswählen

#!/usr/bin/env python
#!/usr/bin/env python
import sys
###setup
class Setup:
    def __init__(self):
        self.usersetupfile = open('usersettings.txt','w')
        self.i = 0
    def setup(self):
        for module in ["apsw","sqlite"]:
            try:
                exec("import %s as sqlite_module") % module
                self.usersetupfile.write(module) 
                self.i+=1
                if self.i == 1:
                    break
            except:
                pass 
        if self.i == 0:
            print "Setup Failed"
        else:
            print "Succesfully Done!"
        self.usersetupfile.close()
        self.usersetupfile = open('usersettings.txt','a')
        useroutput = raw_input("Where should i print? (W)idget or (C)ommandline?")
        if useroutput == "W":
            tell("i am sorry but i wasnt able to choose the right one yet!")
            #self.usersetupfile.write("|"+"widget")
        elif useroutput == "C":
            self.usersetupfile.write("|"+"cmd")

###settings
class UserSettings:
    def get_things(self):
        self.usersettingfile = open('usersettings.txt','r').read()
        self.usersettings = self.usersettingfile.split("|") 
        return self.usersettings 
    def get_module(self):
        self.getter = UserSettings()
        self.module = self.getter.get_things()[0]   
        return self.module
    def set_module(self):
        self.setter = Setup()  
        return self.setter.setup()
    def get_output(self):
        self.output_getter = UserSettings()
        self.output = self.output_getter.get_things()[1]
        return self.output
    def set_output(self):
        setter = Setup()
        return setter.setup()
        
###useful things^^

def import_modules():
    global sqlite_module
    getter = UserSettings()
    module = getter.get_module()
    sqlite_module = __import__(module)
    tell('using module '+module)


def tell(something):
    getoutput = UserSettings()
    output = getoutput.get_output()
    if output == "cmd":
        print something
    if output == "widget":
        printer = gui_manager
        printer.output(something)
def starter():
    if len(sys.argv)==2:
        if sys.argv[1]=="--setup":
            usersetter = UserSettings()
            usersetter.set_module()
    elif len(sys.argv) == 3:
        import_modules()
        conn = sqlite_module.connect(sys.argv[1])
        cur = conn.cursor()
        cur.execute(sys.argv[2])
        cur.close()
        conn.close()
    elif len(sys.argv)>3:
        print "Arglen not supported"
        raise SystemError
    else:
        usergetter = UserSettings()
        module = usergetter.get_module()
        executer = Main()
        executer.greeting()
        executer.cmdgetter()
def connecter():
    import_modules()
    global conn
    global cur
    conn_var = raw_input("Please enter the Path to the SQLite-Database: \n")
    conn = sqlite_module.connect(conn_var)
    cur = conn.cursor()
    
class Main:
    def greeting(self):
        connecter()
    def cmdgetter(self):
        self.cmd = raw_input("&&&")
        if self.cmd == ".help":
            tell("Enter the SQL-Code here!\nTo exit this, type '.exit'")
            self.looper = Main()
            self.looper.cmdgetter()
        if self.cmd == ".exit":
            self.conn.close()
            tell("DB was closed, cya!")
            raise SystemError
        cur.execute(self.cmd)
        self.firstcommand = self.cmd.split(' ')[0]
        try :
            if self.firstcommand == 'select' or self.firstcommand == 'SELECT' or self.firstcommand == 'Select':
                tell(cur.fetchall())     
            else:
                cur.commit() 
                tell("Things were commited!")
        except:
            tell("An Error has accured")
        self.looper = Main()
        self.looper.cmdgetter()

        
if __name__ == '__main__':
    starter()

an machen stellen hätte man vielleicht keine klassen nehmen müssen oder sogar auf funktionen verzichten können (zb wird man ja sowieso nur einmal begrüßt^^), aber das war dafür da mich am OOP auszutoben.
Ab Python 2.5 wird der da oben ja ziemlich nutzlos sein, aber irgendowdran muss man ja lernen und die zähne sich ausbeißen^^

Re: sqlite-manager

Verfasst: Samstag 10. Juni 2006, 21:26
von BlackJack
murph hat geschrieben:hier ein kleines probgramm. ich habe mein bestes gegeben, alles objektorientiert zu machen. ich weiß, dass da an einigen stellen bessere varianten gewesen wären, aber das ist immerhin mein erster 'großer' skript.
OMG. :shock:

Die beste Variante wäre wohl Du hättest es gar nicht geschrieben. So was grauenvolles habe ich schon lange nicht mehr gesehen. Es ist auch nicht besonders objektorientiert.
an machen stellen hätte man vielleicht keine klassen nehmen müssen oder sogar auf funktionen verzichten können (zb wird man ja sowieso nur einmal begrüßt^^), aber das war dafür da mich am OOP auszutoben.
OOP bedeutet nicht, das man alles zwanghaft in Klassen steckt. Das muss schon Sinn machen. Du hast Dich an OOP eher in der Hinsicht ausgetobt als dass Du es vergewaltigt hast. Gelernt hast Du über OOP dabei jedenfalls nichts. Da gehört zum Beispiel dazu, dass man erkennt wann man eine Klasse braucht und was da hineingehört. Oder wann man eben keine Klasse benötigt.

Und in einer Methode einer Klasse ein weiteres Objekt dieser Klasse zu erzeugen um dann auf eine andere Methode auf diesem neuen Objekt zuzugreifen ist, nun ja... So einen Schwachsinn habe ich bisher erst einmal gesehen. Das als Schleife zu benutzen übertrifft es allerdings.
Ab Python 2.5 wird der da oben ja ziemlich nutzlos sein, aber irgendowdran muss man ja lernen und die zähne sich ausbeißen^^
Wieso sollte das ab Python 2.5 (noch) nutzlos(er) sein?

Verfasst: Samstag 10. Juni 2006, 21:42
von murph
danke, dass jemand offen darüber urteilt.(erst gemeint)
ab python 2.5 gibt es ein einheitliches sqlite-modul.
einen hauptteil habe ich ja damit verbracht, die module festzustellen und wieder auszulesen.
also erster punkt:
ich weiß, dass einige klassen vielleicht hätten anders aussehen sollen,
aber zu dem thema loop in der klasse über die funktion:
ich habe mich gescheut, den cmdgetter aus der klasse zu nehmen, weil ich zuerst umgehen wollte, 'conn' und 'cur' global zu machen.
habs dann doch gemacht und dann aber cmdgetter nmicht mehr aus main herausgenommen.
Auch UserSettings.get_things hätte ausgelagert werden müssen, denke ich mal, weil sich die klasse immer wieder selbst lädt, um darauf zuzugreifen.
Aber auch wenn der code scheiße ist, das will ich an dieser stelle sagen, funktioniert er.
immerhin habe ich gelernt, nicht alles in klassen zu packen.
(weil es mir teilweise selbst aufgefallen war, aber an der stelle mir fälschlicher weise dachte, dass man das nun ma so macht...)