【Python】Mysql数据库操作类

来源:互联网 发布:二维码 调用数据库 编辑:程序博客网 时间:2024/04/27 22:53

在《【Python】Windows平台下Python、Pydev连接Mysql数据库》(点击打开链接)中介绍了如何为Python与Eclipse中的Pydev环境增加Mysql的操作能力。

下面为Python的Mysql数据库操作设置一个类,以后每次使用就不会将代码写得七零八落了,尽管Python是简直有爱的脚本语言,但还是要将代码写得尽可能好看。

还是完成《【Java】利用单例模式、可变参数优化Java操作Mysql数据库、JDBC代码的写作》(点击打开链接)中的事情,同样在test数据库中有张用烂的usertable表:


里面有11条数据如下:


我们同样要在Python完成对这张表的增删改查。

只是Python中所有类成员没有公有私有的概念,也无法将构造函数私有化,这里写不成单例模式。

具体程序如下:

#-*-coding:utf-8-*-import MySQLdb#数据库操作类class DB:    conn=None;#这里的None相当于其它语言的NULL    def __init__(self):#构造函数        self.conn=MySQLdb.connect(host="127.0.0.1",user="pc",passwd="admin",db="test",port=3306);        #数据库连接,localhost python不认,必须127.0.0.1    def getBySql(self,sql,*param):        cursor=self.conn.cursor();#初始化游标        result=cursor.fetchmany(cursor.execute(sql,param));        self.conn.commit();#提交上面的sql语句到数据库执行        return result;        def getBySql_result_unique(self,sql,*param):        cursor=self.conn.cursor();#初始化游标        result=cursor.fetchmany(cursor.execute(sql,param));        self.conn.commit();#提交上面的sql语句到数据库执行        return result[0][0];    def setBySql(self,sql,*param):        cursor=self.conn.cursor();#初始化游标        cursor.execute(sql,param);        self.conn.commit();#提交上面的sql语句到数据库执行    def __del__(self):#析构函数        self.conn.close();#关闭数据库连接#主程序        db=DB();print "usertable中的条目数:"print db.getBySql_result_unique("select count(*) from usertable");print "usertable中id大于4的结果:"result=db.getBySql("select * from usertable where id>%s",4)for row in result:    for cell in row:        print str(cell)+",",    print;#增删改实例:db.setBySql("insert into usertable(username,password) values(%s,%s)","ff","s");

运行结果如下:


在主程序中先实例化DB Mysql数据库操作类。

在这个数据库操作类的构造函数中先建立数据库连接,增删改这样无数据返回的操作,初始化游标之后,直接利用execute(self, query, args):执行单条sql语句就行,其实这个函数的返回值就是受影响的行数,唯一需要清晰就是(或者说是我感到奇怪的是),在执行完插入或删除或修改操作后,需要调用一下conn.commit()方法进行提交。这样,数据才会真正保存在数据库中。我不清楚是否是我的mysql设置问题,总之,如果不用commit,那数据就不会保留在数据库中,但是,数据确实在数据库呆过。因为自动编号进行了累积,而且返回的受影响的行数并不为0。反正记住Python要求所有数据库操作必须commit就是。所以打包成这样的一个类,在主函数直接调用这个方法,你就不用每次submit了。

这里利用到《【Python】构造函数、析构函数与可变参数传递》(点击打开链接)接受变长参数,如同C语言的printf函数一样,后面的参数自动替换%s,虽然一般python不会用来写web,但是主要利用到python的变量类型自动转化的特性,你无须关注变量类型。换句话说,要注意的是,无论你要插入的数据是什么类型,占位符永远都要用%s。

对于有返回值的select语言,在cursor.execute()之后还要通过cursor.fetchmany()返回一个二维数组。将返回的结果集,一张表,自动存放的一个可变长的list之后。得到这个list自行遍历即可。

这里特意开一个方法,针对只有一个结果返回的查询。直接取其[0][0]位置,得到查询得到的唯一结果。尽管python还有其它方法,例如fetchone等,但个人感觉并不好使。

上述程序完成基本的增删改查CRUD,增加(Create)、读取(Retrieve)(重新得到数据)、更新(Update)和删除(Delete)几个单词的首字母简写,足够!

0 0