4Python操作MySQL数据库
1.课前准备
1.python DB API 介绍
2.python 开发MySQL环境
止
2.python 操作数据库对象
1.数据库连接对象connection
连接对象:建立python客户端与数据库的网络连接
创建方法:MySQLdb.Connect(参数)
参数名 |
类型 |
说明 |
host |
字符串 |
MySQL服务器地址 |
port |
数字 |
MySQL服务器端口 |
user |
字符串 |
用户名 |
passwd |
字符串 |
密码 |
db |
字符串 |
数据库名称 |
charset |
字符串 |
连接编码 |
connection对象支持的方法:
方法名 |
说明 |
cursor() |
使用该连接创建并返回游标 |
commit() |
提交事务 |
rollback() |
回滚事务 |
close() |
关闭连接 |
2.游标对象cursor
游标对象:用于执行查询和获取结果
cursor对象支持的方法:
参数名 |
说明 |
execte(op[,args]) |
执行一个数据库查询和命令(增删改) |
fetchone() |
取的结果集的下一行 |
fetchmany(size) |
获取结果集的下几行 |
fetchall() |
获取结果集中剩下的所有行 |
rowcount |
最近一次exectue返回数据的行数或影响行数 |
close() |
关闭游标对象 |
execute执行方法流程:
3.Python 增删改查数据库
1.实例演示select数据
代码示例:
import MySQLdb
conn=MySQLdb.Connect(
host='127.0.0.1',
port=3306,
user='root',
passwd='123456',
db='mysql',
charset='utf-8'
)
cursor=conn.cursor()
sql="select * from user "
cursor.execute(sql)
#此时本地的缓冲区已经存放了所有的数据
print cursor.rowcount #打印获取到本地的数据的行数
rs=cursor.fetchone()
rs=cursor.fetchmany(3)
rs=cursor.fetchall()
#每次执行都是从上一次的执行结果的后面开始执行
#如果数据量比较小则fetchall()全部获取
#如果数据量比较大则可以一条一条处理,如下:
rs=fetchall()#是一个元组的元组,所以可以二维遍历
for row inrs:
print"userid=%s,username=%s" %row
2.实例演示insert-update-delete数据
开发中怎样使用事物:
1.关闭自动commit:设置conn.autocommite(False)
2.正常结束事务:conn.commit()
3.异常结束事务:conn.rollback()
import MySQLdb
conn=MySQLdb.Connect(
host='127.0.0.1',
port=3306,
user='root',
passwd='123456',
charset='utf-8')
cursor=conn.cursor()
sql_insert="insertinto user(userid,username) values(10,'name10')"
sql_update="updateuser set username='name91' where username='name9'"
sql_delete="deletefrom user where userid<3"
try:
cursor.execute(sql_insert)
printcursor.rowcount #1
cursor.execute(sql_update)
printcursor.rowcount #1
cursor.execute(sql_delete)
printcursor.rowcount #2
conn.commit()
except Exceptionase:
printe
conn.rollback()
cursor.close()
conn.close()
4.使用Python实现实例
1.银行转账实例-代码流程
账户A给账户B转账100元
2.准备数据表和代码编写
account:数据表,accid和money字段,且为Innodb引擎
#coding:utf-8
import sys
import MySQLdv
class TransferMoney(object):
def__init__(self,conn):
self.conn=conn
defcheck_acct_available(self,acctid):
cursor=self.conn.cursor()
try:
sql="select * from account where acctid=%s"%acctid
cursor.execute(sql)
print"check_acct_available: " + sql
rs=cursor.fetchall()
iflen(rs)!=1:
raise Exception("账号%s不存在" %acctid)
finally:
cursor.close()
defhas_enough_money(self,acctid,money):
cursor=self.conn.cursor()
try:
sql="select * from acctid where acctid=%s and money>=%s" %(acctid,money)
cursor.execute(sql)
print"has_enough_money: "+sql
rs=cursor.fetchall()
iflen(rs)!=1:
raise Exception("账号%s没有足够的money"%acctid)
finally:
cursor.close()
defreduce_money(self,acctid,money):
cursor=self.conn.cursor()
try:
sql="update account set money=money-%s whereacctid=%s" % (money,acctid)
cursor.execute(sql)
print"reduce_money: "+sql
ifcursor.rowcount!= 1:
raise Exception("帐号%s减款失败"% acctid)
finally:
cursor.close()
defadd_money(self,acctid,money):
cursor=self.conn.cursor()
try:
sql="update account set money=money+%s where acctid=%s"% (money,acctid)
cursor.execute(sql)
print"add_money: "+sql
ifcursor.rowcount!= 1:
raise Exception("帐号%s加款失败"% acctid)
finally:
cursor.close()
deftransfer(self,source_acctid,target_acctid,money):
try:
self.check_acct_available(source_acctid)
self.check_acct_available(target_acctid)
self.has_enough_money(source_acctid,money)
self.reduce_money(source_acctid,money)
self.add_money(target_acctid.money)
self.conn.commit()
exceptException as e:
self.conn.rollback()
raisee #为了让上一层的调用再捕捉到该异常,异常对象保存在了对象e中
if __name__=="__main__":#程序的入口
source_acctid=sys.argv[1]
target_acctid=sys.argv[2]
money=sys.argv[3]
#创建转账操作的对象
conn=MySQLdb.Connect(host='127.0.0.1',user='root',passwd='123456',port=3306,charset='utf-8')
tr_money=TransferMoney(conn)
#开始转账操作
try:
tr_money.transfer(source_acctid,target_acctid,money)
exceptException as e:
print"出现问题:" +str(e)
finally:
conn.close()