在《【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)几个单词的首字母简写,足够!