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

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

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

python mysql基类_CRUD

里面有11条数据如下:

python mysql基类_Mysql_02

我们同样要在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");



运行结果如下:

python mysql基类_Mysql_03

在主程序中先实例化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)几个单词的首字母简写,足够!