#!/usr/bin/env python # -*- coding:utf-8 -*- # author: lintao import MySQLdb from gensql import gensql from Entry import Entry class Error(Exception): pass class 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"]