python MySQLdb学习笔记
MySQLdb库是Python访问MySql的连接库,最近项目中需要使用,将学习使用所得整理如下。
由于我是windows环境,安装很简单,到这里下载一个.windows环境下载exe版本,直接双击安装很方便.
MySQLdb windows下运行需要 libmySQL.dll、libmmd.dll 和 libguide40.dll ,可以放在sitepackage下也可以在windows\system32\学习MySQLdb的使用,下面的文档必不可少:
- 建立数据库连接,取得Cursor对象
- 执行sql语句,接收返回值
- 根据执行情况,提交或者回滚数据库。
- 关闭Cursor,关闭数据库连接
import MySQLdb conn=MySQLdb.connect(host="localhost",user="root",passwd="123456",db="appdb")
参数定义:
host:数据库主机名.默认是用本地主机.
user:数据库登陆名.默认是当前用户.
passwd:数据库登陆的秘密.默认为空.
db:要使用的数据库名.没有默认值.
port:MySQL服务使用的TCP端口.默认是3306.
连接对象提供了对事务操作的支持:commit()和rollback()
2,执行sql语句和接收返回值
cursor=conn.cursor() n=cursor.execute(sql,param)建立建立连接后,首先就要获取一个Cursor对象,因为以后的数据库操作都要通过它来进行。那么Cursor对象都有哪些方法呢?Cursor对象的主要有以下方法:
- callproc(self, procname, args):执行存储过程,接收的参数为存储过程名和参数列表,返回值为受影响的行数
- execute(self, query, args):执行单条sql语句,接收的参数为sql语句本身和使用的参数列表,返回值为受影响的行数
- executemany(self, query, args):执行单挑sql语句,但是重复执行参数列表里的参数,返回值为受影响的行数
- nextset(self):移动到下一个结果集
- fetchall(self):接收全部的返回结果行.
- fetchmany(self, size=None):接收size条返回结果行.如果size的值大于返回的结果行的数量,则会返回cursor.arraysize条数据.
- fetchone(self):返回一条结果行.
- scroll(self, value, mode='relative'):移动指针到某一行.如果mode='relative',则表示从当前所在行移动value条,如果mode='absolute',则表示从结果集的第一行移动value条.
下面是具体进行数据库操作的示意代码:
插入数据:#使用sql语句,这里要接收的参数用%s表示,它就是一个占位符,无论代表的数据是什么类型,都用%s来表示 sql="insert into operator values(%s,%s,%s,%s,%s)" #参数应该为tuple或者list ps=(id,name,age,sex,password) #执行,如果成功,n的值为1 n=cursor.execute(sql,ps)
查询数据:
cursor.execute("select * from operator") #fetchall方法返回的全部结果.每条结果都是一个tuple类型的数据,rs就是tuple组成的tuple rs=cursor.fetchall() #可以这样使用结果集 print rs[0][3] #或者直接显示出来,看看结果集的真实样子 print rs
#实际数据形式应该是这样的:((1,'zhang',25,'male','123'),(2,'wang',28,'male','1123'))
批量插入数据:
sql="insert into operator values(%s,%s,%s,%s,%s)" #参数同样需要一个tuple组成的tuple,当然tuple组成的list也是可以的 ps=((1,'zhang',25,'male','123'),(2,'wangxia',28,'female','1123')) #使用executemany方法来批量的插入数据。 n=cursor.executemany(sql,ps)
3,根据执行情况,提交或者回滚数据库:
conn.commit()
4,关闭数据库连接
首先关闭Cursor对象,然后是连接对象:
cursor.close()
conn.close()
另,MySQLdb默认情况下,查询结果行都是返回tuple,访问的时候不是很方便,必须按照0,1这样读取。以前使用sqllite3的时候,可以修改过Connection对象的row_factory属性,以便使用sqlite3.Row,这样结果集中的数据行就是字典形式的,可以用字段名访问,那么MySQLdb中是不是也有这样的方法呢,经过在网上搜索发现,MySQLdb中有DictCursor,要做到这点也很简单,那就是建立数据库连接是传递cusorclass参数,或者在获取Cursor对象时传递cusorclass参数即可:
import MySQLdb import MySQLdb.cursors conn=MySQLdb.connect(host="localhost",user="root",passwd="123456",db="appdb",cursorclass=MySQLdb.cursors.DictCursor) cursor=conn.cursor();
或者
import MySQLdb import MySQLdb.cursors conn=MySQLdb.connect(host="localhost",user="root",passwd="123456",db="appdb") cursor=conn.cursor(cursorclass=MySQLdb.cursors.DictCursor);
然后我们上面例子中的查询结果就会变成下面这个样子的:
({id:1,name:'zhang',age:25,sex:'male',password:'123'}.....)