当前位置: 首页 > 工具软件 > DBApi > 使用案例 >

Python数据库操作、Python DB API、数据库连接对象connection、数据库游标对象cursor

乔鸿骞
2023-12-01

学习连接地址:点击打开

1.Python DB API

Python DB API包含:

数据库连接对象:connection

数据库交互对象:cursor

数据库异常类:exceptions


开发数据库程序流程:

1.创建connection对象,获取cursor

2.使用cursor执行SQL

3.使用cursor获取数据、判断执行状态

4.提交事务 或者 回滚事务


使用Python DB AP访问数据库流程:

开始------->创建数据库连接connection------>获取cursor------>处理数据(增删查改)------->关闭cursor------>关闭connection------>结束


2.数据库连接对象connection

创建方法:MySQLdb.connect(参数)

参数名     类型      说明
host       字符串    MySQL服务器地址
port       数字      MySQL服务器端口号
user       字符串    用户名
passwd     字符串    密码
db         字符串    数据库名称
charset    字符串    连接编码

Connection对象支持的方法:

方法名          说明
cursor()        使用该连接创建并返回游标 
commit()        提交当前事务
rollback()      回滚当前事务
close()         关闭丽连接

创建数据库连接例子
import MySQLdb
conn = MySQLdb.connect(
    host='127.0.0.1',
    port=3306,
    user='root',
    passwd='mysql1991',
    db='testpy',
    charset='utf8'
)
cursor = conn.cursor()
print conn
print cursor
cursor.close()
conn.close()

3.数据库游标对象cursor

游标对象:用于执行查询和获取结果
cursor支持的方法
参数名                  说明
execute(op[,args])      执行一个数据库查询和命令,将结果从数据库获取到客服端
fetchone                取的结果集的下一行
fetchmany(size)         获得结果集下几行
fetchall()              获取结果集中剩下的所有行
rowcount                最近一次execute返回数据的行数或影响行数,获取缓冲区中数据所有行数
close()                 关闭游标对象
fetch*()方法:移动rownumber,返回数据
select语句获取数据库数据
# -*-coding:utf-8-*-
import MySQLdb

conn=MySQLdb.Connect(host='127.0.0.1',port=3306,user='root',passwd='mysql1991',db='testpy',charset='utf8')
cursor = conn.cursor()

#sql查询语句
sql='select * from user '
#sql语句执行
cursor.execute(sql)
#获取返回数据总条数
rs=cursor.rowcount
print rs
#获取返回的第一条数据,此时游标rownumber=0,获取后=1
rs=cursor.fetchone()
print rs
#获取返回数据的接下来3条数据,此时游标rownumber=1,获取后=4
rs=cursor.fetchmany(3)
print rs
#获取剩下的所有返回数据,此时游标rownumber=4,获取后=最后条
rs=cursor.fetchall()
print rs
#循环获取,对每条数据进行处理
for row in rs:
    print 'userID=%s  username=%s'% row
cursor.close()
conn.close()

事务的概念
事务:访问和更新数据库的一个程序执行单元
-原子性:事务中包括的诸操作要么都做,要么都不做
-一致性:事务必须是数据库从一致性状态变到另一个一致性状态
-隔离性:一个事务的执行不能被其他事务干扰
-永久性:事务一旦提交。它对数据库的改变就是永久性的

开发中的使用事务
-关闭自动commit:设置conn.autocommit(False)
-正常结束事务:conn.commit()
-异常结束事务:conn.rollback()

  
  
增删改中事务的使用
# -*-coding:utf-8-*-
import MySQLdb

conn = MySQLdb.Connect(host='127.0.0.1', port=3306, user='root', passwd='mysql1991', db='testpy', charset='utf8')
cursor = conn.cursor()

# 增删改
sql_insert = "insert into user(id,username) VALUE (10,'name10')"
sql_update = "update user set username='name91' where id=9"
sql_dalete = "delete from user where id<3"
try:#如果没有出现异常,则提交事务
    cursor.execute(sql_insert)
    print cursor.rowcount  # 1
    cursor.execute(sql_update)
    print cursor.rowcount  # 1
    cursor.execute(sql_dalete)
    print cursor.rowcount  # 2
    conn.commit()
except Exception as e:#如果出现异常,则打印异常并且回滚事务
    print e
    conn.rollback()
cursor.close()
conn.close()

例子,银行转账操作模拟:
# coding:utf8
# sys.argv:如果模块是被直接运行的,则代码块被运行,如果模块是被导入的,则代码块不被运行。
import sys

import MySQLdb


class TransferMoney(object):
    def __init__(self, conn):
        self.conn = conn

    def transfer(self, source_account, target_account, money):
        try:
            self.check_account_available(source_account)  # 检查source_account来源账户是否可用的方法
            self.check_account_available(target_account)  # 检查target_account目标账户是否可用的方法
            self.have_enough_money(source_account, money)  # 检查source_account来源账户是否有足够的钱
            self.reduce_money(source_account, money)  # source_account来源账户减去money
            self.add_money(target_account, money)  # target_account目标账户增加相应的钱money
            self.conn.commit()  # 如果都上面所以的操作都没有异常,则提交事务执行
        except Exception as e:
            self.conn.rollback()
            raise e

    # 检查账户是否可用
    def check_account_available(self, account):
        cursor = self.conn.cursor()
        try:
            sql = "select * from account where id=%s" % account
            cursor.execute(sql)
            print 'check_account_available' + sql
            rs = cursor.fetchall()
            if len(rs) != 1:
                raise Exception('账号 %s 不存在:' % account)
        finally:
            cursor.close()

    # 检查账户余额是否充足
    def have_enough_money(self, account, money):
        cursor = self.conn.cursor()
        try:
            sql = "select * from account where id=%s and money>=%s" % (account, money)
            cursor.execute(sql)
            print 'have_enough_money' + sql
            rs = cursor.fetchall()
            if len(rs) != 1:
                raise Exception('账号 %s 没有足够的钱:' % account)
        finally:
            cursor.close()

    # 转出账户减去钱
    def reduce_money(self, account, money):
        cursor = self.conn.cursor()
        try:
            sql = "update account set money=money-%s where id=%s" % (money, account)
            cursor.execute(sql)
            print 'reduce_money' + sql
            rs = cursor.rowcount
            if rs != 1:
                raise Exception('账号 %s 减款失败:' % account)
        finally:
            cursor.close()

    # 收款账户增加钱
    def add_money(self, account, money):
        cursor = self.conn.cursor()
        try:
            sql = "update account set money=money+%s where id=%s" % (money, account)
            cursor.execute(sql)
            print 'add_money' + sql
            rs = cursor.rowcount
            if rs != 1:
                raise Exception('账号 %s 加款失败:' % account)
        finally:
            cursor.close()


if __name__ == '__main__':  # 只有当本模块之间运行的时候才执行,__name__才等于__main__
    # sys.argvh从程序外部获取参数的桥梁
    source_account = sys.argv[1]  # 来源账户
    target_account = sys.argv[2]  # 目标账户
    money_account = sys.argv[3]  # 转账金额
    # 数据库连接
    conn = MySQLdb.connect(host='127.0.0.1', port=3306, user='root', passwd='mysql1991', db='testpy', charset='utf8')
    # 转账类TransferMoney
    tr_money = TransferMoney(conn)
    try:
        tr_money.transfer(source_account, target_account, money_account)  # transfer:转账类TransferMoney中的方法
    except Exception as e:
        print '出现问题:' + str(e)
    finally:
        conn.close()



  
  

  
  

  
  

  
  

  
  

  
  

  
  

  
  

  
  

  
  

  
  

  
  

  
  




 类似资料: