您的位置:首页 > 编程语言 > Python开发

Python操作MySQL数据库

2015-12-25 14:45 716 查看

4Python操作MySQL数据库

1.课前准备

python 操作数据库的连接组件的安装请见博文:http://blog.csdn.net/walxiaosage/article/details/50387285
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()
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: