#!/usr/bin/env python # -*- coding:utf-8 -*- # author: lintao # TODO # This may have some bugs. # So, I need to develop it. import MySQLdb from gensql import gensql import copy class LoginInfo(object): def __init__(self): self.user = "lint" self.passwd = "123456" self.host = "localhost" self.db = "" class Table(object): def __init__(self, tablename, logininfo): self.tablename = tablename self.__login(logininfo) self.__describe_table() # Variable self.__condition__enable = False self.__set_condition__enable = False pass def __login(self, logininfo): try: self.conn = MySQLdb.connect( host = logininfo.host, user = logininfo.user, passwd = logininfo.passwd, db = logininfo.db) except: raise Exception, "Login failed" def __execute(self, sql): self.cursor = self.conn.cursor() self.cursor.execute(sql) def __commit(self): self.conn.commit() def __describe_table(self): sql = "describe %s;" %self.tablename self.__execute(sql) self.tablekeys = [ i[0] for i in self.cursor.fetchall()] pass def __check_inputkey(self, inputkey): if not inputkey: return True if isinstance(inputkey, str): return (inputkey in self.tablekeys) return all((i in self.tablekeys) for i in inputkey) def __getitem__(self, key): if not self.__condition__enable: raise Exception, "Please enable conditions, or in the with statement" return if not (self.__check_inputkey(key) or key=="*"): raise Exception, "Not found the key:(%s)"%key return if self.__one_entry: if key == "*": return self.__one_entry return self.__one_entry[key] def selectBeginCond(self, conddicts=None): """ You need to begin with cond, so I can begin to fetch data """ if self.__condition__enable: return self.__condition__enable = True if not self.__check_inputkey(conddicts): raise Exception, "The condition has some errors" sql = gensql("select", \ self.tablename, \ ",".join(self.tablekeys), \ conddicts) self.__execute(sql) self.__one_entry = None pass def selectNext(self): if self.__condition__enable: tmpone = self.cursor.fetchone() if tmpone: self.__one_entry = dict(zip(self.tablekeys, \ tmpone)) if self.__one_entry: return True return False pass def selectEndCond(self): if not self.__condition__enable: return self.__condition__enable = False self.__one_entry = None pass # def selectcond(self, cond=None): return self.innerselect(self, cond) # Use the with Statement class innerselect(object): def __init__(self, outer, cond): self.outer = outer self.cond = cond def __enter__(self): self.outer.selectBeginCond(self.cond) return self def next(self): return self.outer.selectNext() def __getitem__(self, key): return self.outer[key] def __getitem__raise(self, *args, **kwds): raise Exception, "Can't call out the with statement" def __exit__(self, exc_type, exc_value, traceback): self.outer.selectEndCond() # def updatecond(self, cond=None): return self.innerupdate(self, cond) class innerupdate(object): def __init__(self, outer, cond): self.outer = outer self.cond = cond def __enter__(self): self.outer.updateBeginCond(self.cond) return self def next(self): return self.outer.updateNext() def ok(self): self.outer.updateOK() def __getitem__(self, key): return self.outer[key] def __setitem__(self, key, value): self.outer[key] = value def __exit__(self, exc_type, exc_value, traceback): self.outer.updateEndCond() # TODO def updateBeginCond(self, conddicts): if self.__set_condition__enable: return self.__set_condition__enable = True self.selectBeginCond(conddicts) # It is to save the conddicts self.__tmp__dict__update = copy.deepcopy(conddicts) pass def updateEndCond(self): # if it didn't start, just return if not self.__set_condition__enable: return self.__tmp__dict__update = None self.selectEndCond() self.__set_condition__enable = False pass def updateNext(self): if not self.__set_condition__enable: return False return self.selectNext() def updateOK(self): #print self.__one_entry # TODO # Really to update if not isinstance(self.__one_entry, dict): return False sql = gensql("update", \ self.tablename, \ self.__one_entry, \ self.__tmp__dict__update) self.__execute(sql) self.__commit() return True pass def __setitem__(self, key, value): if not (self.__condition__enable and self.__set_condition__enable): pass if not (self.__check_inputkey(key)): raise Exception, "Not found the key:(%s)"%key return self.__one_entry[key] = value pass # TODO def insertBegin(self): if self.__condition__enable or self.__set_condition__enable: return self.__condition__enable = True self.__set_condition__enable = True self.__one_entry = {} #dict((key, None) for key in self.tablekeys) pass def insertEnd(self): if not (self.__condition__enable and self.__set_condition__enable): return self.__condition__enable = False self.__set_condition__enable = False if not any(self.__one_entry.values()): print "nothing to insert" return sql = gensql("insert", \ self.tablename, \ self.__one_entry) self.__execute(sql) self.__commit() self.__one_entry = None pass def insertcond(self): return self.innerinsert(self) pass class innerinsert(object): def __init__(self, outer): self.outer = outer def __enter__(self): self.outer.insertBegin() return self def __getitem__(self, key): return self.outer[key] def __setitem__(self, key, value): self.outer[key] = value def __exit__(self, exc_type, exc_value, traceback): self.outer.insertEnd() pass if __name__ == "__main__": logininfo = LoginInfo() logininfo.db = "TestBesBkk" t = Table("person", logininfo) # Test 0 #print t.tablekeys #print t.s__check_inputkey("id_p") #print t.s__check_inputkey(["id_p","p"]) # Test 1 #t.selectBeginCond({"id_p":2}) #while t.selectNext(): # print t["id_p"], # print t["name_p"] # print t["*"] # #print t["notexist"] #t.selectEndCond() #pass # Test 2 #t.updateBeginCond({"id_p":3}) #while t.updateNext(): # #t["id_p"] = "3" # t["id_p"] = "3" # t.updateOK() #t.updateEndCond() # Post Test 3 #t.selectBeginCond() #while t.selectNext(): # print t["id_p"], # print t["name_p"] # print t["*"] #t.selectEndCond() # Test 4 #t.insertBegin() #t["id_p"] = 10 #t.insertEnd() # Test 5 #with t.selectcond() as l: # while l.next(): # print l["*"] ##print l["*"] # Test 6 #with t.updatecond({"id_p":3}) as l: # while l.next(): # l["name_p"] = "lint@ihep" # l["age"] = "222" # l.ok() # Test 7 with t.insertcond() as l: l["name_p"] = "lintao51@gmail.com" l["id_p"] = 100 l["age"] = 22 print l["name_p"]