python with语句使用示例,pythonwith,下面代码中的Entry类


下面代码中的Entry类存放数据,SQLAction类用来封装MySQLdb来简化数据库操作的代码

#!/usr/bin/env python# -*- coding:utf-8 -*-# author: lintaoimport MySQLdbfrom gensql import gensqlfrom Entry import Entryclass Error(Exception):    passclass SQLAction(object):    def __init__(self, logininfo):        self.__login(logininfo)        self.__entryies = {}        self.cursor = {}    def __login(self, logininfo):        try:            self.conn = MySQLdb.connect(                    **logininfo)        except:            raise Error,"Login failed"    def execute(self, sql, tablename):        self.cursor[tablename] = self.conn.cursor()        self.cursor[tablename].execute(sql)    def commit(self):        self.conn.commit()    def __describe(self, tablename):        sql = "describe %s;"%tablename        self.execute(sql, tablename)        return list(i[0] for i in self.cursor[tablename].fetchall())        pass    # Begin with statement, select    def select(self, tablename, conddicts=None):        return self.innerSelect(self, tablename, conddicts)    class innerSelect(object):        def __init__(self, outer, tablename, cond=None):            self.outer = outer            self.tablename = tablename            self.cond = cond            self.entry = self.outer.getentry(self.tablename)            self.select()        def select(self):            sql = gensql("select", \                    self.tablename, \                    self.entry.getfield(), \                    self.cond)            #print sql            self.outer.execute(sql, self.tablename)            pass        def next(self):            tmpone = self.outer.cursor[self.tablename].fetchone()            if not tmpone:                return False            with self.entry.edit():                self.entry.update(dict(zip(self.entry.getfield(), tmpone)))            self.entry.enablequery()            return True        def __enter__(self):            self.entry.enablequery()            return self            pass        def __getitem__(self, key):            return self.entry[key]        def __setitem__(self, key, value):            raise Error, "Can't set key and value"        def __exit__(self, exc_type, exc_value, traceback):            self.entry.disablequery()            pass    # End with statement, select    # Begin with statement, update    def update(self, tablename, conddicts):        return self.innerUpdate(self, tablename, conddicts)    class innerUpdate(object):        def __init__(self, outer, tablename, cond):            self.outer = outer            self.tablename = tablename            self.cond = cond            self.entry = self.outer.getentry(self.tablename)            self.select()        def __getitem__(self, key):            return self.entry[key]        def __setitem__(self, key, value):            self.entry[key] = value        def select(self):            sql = gensql("select", \                    self.tablename, \                    self.entry.getfield(), \                    self.cond)            #print sql            self.outer.execute(sql, self.tablename)            pass        def next(self):            tmpone = self.outer.cursor[self.tablename].fetchone()            if not tmpone:                return False            with self.entry.edit():                self.entry.update(dict(zip(self.entry.getfield(), tmpone)))            self.entry.enableedit()            self.oldentry = self.entry.copydict()            return True        def update(self):            sql = gensql("update", \                    self.tablename, \                    self.entry.copydict(), \                    self.oldentry)            self.outer.execute(sql, self.tablename)            self.outer.commit()            pass        def ok(self):            self.update()        def __enter__(self):            self.entry.enableedit()            return self            pass        def __exit__(self, exc_type, exc_value, traceback):            self.entry.disableedit()            pass    # End with statement, update    # Begin with statement, insert    def insert(self, tablename):        return self.innerInsert(self, tablename)    class innerInsert(object):        def __init__(self, outer, tablename):            self.outer = outer            self.tablename = tablename            self.entry = self.outer.getentry(self.tablename)        def __enter__(self):            self.entry.enableedit()            return self            pass        def __getitem__(self, key):            return self.entry[key]        def __setitem__(self, key, value):            self.entry[key] = value        def ok(self):            self.insert()        def insert(self):            sql = gensql("insert", \                    self.tablename, \                    self.entry.copydict())            self.outer.execute(sql, self.tablename)            self.outer.commit()        def __exit__(self, exc_type, exc_value, traceback):            self.entry.disableedit()            pass    # End with statement, insert    def newentry(self, tablename):        self.__entryies[tablename] = Entry(self.__describe(tablename))    def getentry(self, tablename):        return self.__entryies.get(tablename, None)if __name__ == "__main__":    logininfo = {"user":"lint", "host":"localhost", "passwd":"123456", "db":"TestBesBkk"}    sqlaction = SQLAction(logininfo)    sqlaction.newentry("person")    oneentry = sqlaction.getentry("person")    #with oneentry.edit():    #    oneentry["id_p"] = "5"    #    oneentry["name_p"] = "lint07"    #    oneentry["age"] = 22    #with oneentry.query():    #    print oneentry["id_p"]    #    print oneentry["name_p"]    #    print oneentry["age"]    #print sqlaction.cursor    #with sqlaction.insert("person") as s:    #    s["id_p"] = 1000    #    s["name_p"] = "lintao07"    #    s["age"] = 22222    #    s.ok()    with sqlaction.update("person", {"id_p":1000}) as s:        while s.next():            s["name_p"] = s["name_p"] + str(s["age"])            s["age"] = 55555            s.ok()    #with sqlaction.select("person", None) as s:    #    print s.entry.getfield()    #    while s.next():    #        print s["id_p"]    #        print s["name_p"]    #        print s["age"]    #        #print s["noage"]

评论关闭