《Python从小白到大牛》第二部分-第二章(数据库编程)

"""
数据库编程
Python中将数据保存在数据库中技术有很多种,但主要分为两类,遵循Python DB-API规范技术和ORM技术。
Python DB-API规范通过在Python中编写SQL语句访问数据库。(重点)
ORM技术是面向对象的,对数据的访问是通过对象实现的,程序员不需要使用SQL语句。

现在主流的数据库管理系统有oracle、SQL Server、DB 2、Sysbase、MySQL和SQLite等,以下主要基于MySQL数据库管理系统的使用和管理。
建立数据库连接:
通过connect(parameters...)函数实现,使用parameters参数连接数据库,连接成功返回Connection对象。
host:数据库主机名或IP地址
port:连接数据库端口号
user:访问数据库账号
password或passwd:访问数据库密码
database或db:数据库中的库名
charset:数据库编码格式
还有很多参数,可以参考:http://pymysql.readthedocs.io/en/latest/modules/connections.html

Connection对象有一些重要的方法,这些方法如下
close():关闭数据库连接,关闭之后再使用数据库连接将引发异常
commit():提交数据库事物
rollback():回滚数据库事物
cursor():获得Cursor游标对象

如果事务中有的操作没有成功完成,则事务中所有操作都需要被回滚,回到事务执行前的状态。

创建游标:
一个cursor游标对象表示一个数据库游标,游标暂时保存了SQL操作所影响到的数据。
游标Cursor对象有很多方法和属性,其中基本SQL操作方法有以下几种:
execute(operation[,parameters])
执行一条SQL语句,operation是SQL语句,parameters是为SQL提供的参数,可以是序列或者字典类型,返回值是整数,表示执行SQL语句影响的行数。
executemany(operation[,seq_of_params])
批量执行SQL语句,operation是SQL语句,seq_of_params是为SQL提供的参数,seq_of_params是序列,返回值是整数,表示执行SQL语句影响的行数。
callproc(procname[,parameters])
执行存储过程,procname是存储过程名,parameters是为存储过程提供的参数。
执行SQL查询语句也是通过execute()和executemany()方法实现的,但是这两个方法返回的都是整数,对于查询没有意义,因此使用execute()he executemany()
方法执行查询后,还要通过提取方法提取结果集,相关提取方法如下
fetchone():从结果集中返回一条记录的序列,如果没有数据返回None;
fetchmany():从结果集返回小于或等于size的记录数序列,如果没有数据返回空序列,size默认情况下是整个游标的行数。
fetchall():从结果集中返回所有数据

对数据库表中可以进行4类操作:数据插入(Create)、数据删除(Delete)、数据更新(Update)、数据查询(Read)

数据库编程的一般过程:
1.建立数据库连接 2.创建游标对象 3.执行SQL操作(插入、删除、更新) 4.SQL操作成功 5.提交数据库事务 6.关闭游标 7.关闭数据连接
                                                        4.SQL操作失败 5.回滚数据库事务 6.关闭游标 7.关闭数据连接
                           3.执行SQL操作(查询)  4.提取结果集  5.关闭游标  6.关闭数据连接

编写数据库脚本mydb-mysql-schema-gbk.sql
/* chapter17/mydb-mysql-schema-gbk.sql */
/* 创建数据库 */
CREATE DATABASE IF NOT EXISTS MyDB;

use MyDB;

/* 用户表 表名以及各列的名称以及属性 */
CREATE TABLE IF NOT EXISTS user(
name varchar(20),    /* 用户ID */
userid int,         /* 用户密码 */
PRIMARY KEY (userid));

/* 插入初始数据 */
INSERT INTO user VALUES('Tom',1);
INSERT INTO user VALUES('Ben',2);

Python DB-API2规范中的异常类继承层次可以自行了解,
StandardError是Python DB-API基类,一般的数据库开发使用DatabaseError异常及其子类。

"""
import pymysql

#1.建立连接
connection = pymysql.connect(host='localhost', user='root', password='Hkx19991117', database='MyDB', charset='utf8')
print(type(connection))

try:
    #2.创建游标对象
    with connection.cursor() as cursor:
        #3.执行SQL操作
        sql = 'select name,userid from user where userid >%(id)s'    #%(id)s是命名占位符
        cursor.execute(sql,{'id':0})     #执行sql语句,并绑定参数,绑定参数是字典类型,id是占位符中的名字,是字典中的键。

        #还有一种写法:
        #sql = 'select name,userid from user where userid > %s'    #%s是占位符
        #cursor.execute(sql, [0])            #绑定参数是序列类型,另外参数只有一个时,可以直接绑定,例如cursor.execute(sql,0)

        #4.提取结果集
        result_set = cursor.fetchall()

        for row in result_set:
            print('id:{0} - name:{1}'.format(row[1], row[0]))
        #with 代码块结束,5.关闭游标
finally:
    #6.关闭数据连接
    connection.close()


#无条件查询
#1.建立连接
connection = pymysql.connect(host='localhost', user='root', password='********', database='MyDB', charset='utf8')
try:
    #2.创建游标对象
    with connection.cursor() as cursor:
        #3.执行SQL操作
        sql = 'select max(userid) from user'
        cursor.execute(sql)

        #4.提取结果集
        row = cursor.fetchone()
        print(row)
        if row is not None:
            print('最大用户id:{0}'.format(row[0]))
        #with 代码块结束,5.关闭游标
finally:
    #6.关闭数据连接
    connection.close()

def read_max_userid():  #查询最大ID值
    # 无条件查询
    # 1.建立连接
    connection = pymysql.connect(host='localhost', user='root', password='Hkx19991117', database='MyDB', charset='utf8')
    try:
        # 2.创建游标对象
        with connection.cursor() as cursor:
            # 3.执行SQL操作
            sql = 'select max(userid) from user'
            cursor.execute(sql)

            # 4.提取结果集
            row = cursor.fetchone()
            print(row)
            if row is not None:
                print('最大用户id:{0}'.format(row[0]))
                return row[0]
            else:
                return -1
            # with 代码块结束,5.关闭游标
    finally:
        # 6.关闭数据连接
        connection.close()




#数据修改操作
connection = pymysql.connect(host='localhost', user='root', password='Hkx19991117', database='MyDB', charset='utf8')

max_id = read_max_userid()

try:
    #2.创建游标对象
    with connection.cursor() as cursor:
        #3.执行SQL操作
        sql = 'insert into user (userid, name) values (%s,%s)'
        nextid = max_id + 1
        name = 'Tony' + str(nextid)
        cursor.execute(sql, (nextid, name))

        #4.向数据库提交事务
        connection.commit()

        #with代码块结束 5.关闭游标

except pymysql.DatabaseError:
    #4.回滚数据库事务
    connection.rollback()
finally:
    #6.关闭数据连接
    connection.close()

#数据更新
connection = pymysql.connect(host='localhost', user='root', password='Hkx19991117', database='MyDB', charset='utf8')

#2.创建游标
try:
    with connection.cursor() as cursor:

        #执行sql指令
        sql = 'update user set name = %s where userid > %s'
        affectedcount = cursor.execute(sql, ('Tom', 2))
        print('影响的数据行数:{0}'.format(affectedcount))

        #提交数据库事务
        connection.commit()
    #with代码块结束,游标关闭
except pymysql.DatabaseError as e:
    #4.回滚数据库事务
    connection.rollback()
    print(e)

finally:
    #6.关闭数据连接
    connection.close()

#数据删除
connection = pymysql.connect(host='localhost', user='root', password='Hkx19991117', database='MyDB', charset='utf8')

max_id = read_max_userid()

try:
    #2.创建游标对象
    with connection.cursor() as cursor:
        #执行sql指令
        sql = 'delete from user where userid = %s'
        affectedcount = cursor.execute(sql,(max_id))
        print('影响行数:{0}'.format(affectedcount))

        #4.提交数据库事务
        connection.commit()

        #with代码块结束 5.关闭游标
except pymysql.DatabaseError:
    #4.回滚数据库事务
    connection.rollback()

finally:
    #6.关闭数据库连接
    connection.close()

"""
NoSQL数据存储
目前大部分数据库都是关系型的,通过SQL语句操作数据库。但是也有一些数据库是非关系型的,不通过SQL语句操作数据库,这些数据库称为NoSQL数据库。
dbm数据库是最简单的NoSQL数据库,它不需要安装,直接通过键值对数据存储。
Python内置dbm模块提供了存储dbm数据的API

dbm数据库的打开和关闭:
打开数据库用open()函数
dbm.open(file, flag='r')
file是数据库文件名,包括路径;参数flag是文件打开方式,flag取值‘r’ 只读(默认) ‘w’ 读写 ‘c’以读写方式打开数据库,如果不存在则创建 ‘n’ 始终创建一个新的空数据库,打开方式为读写

关闭数据库用close()函数,更推荐用with as语句来管理数据资源释放
with dbm.open(DB_NAME,'c') as db:
    pass

dbm数据存储方式类似于字典数据结构,通过键写入或读取数据。(注意:dbm数据库保存的数据是字符串类型或者字节序列类型)
1.写入数据
d[key] = data
2.读取数据
data = d[key] 或者 d.get(key, defaultvalue)
data = d[key]这中方法,如果key值不在则会抛出KeyError异常。d.get(key, defaultvalue)则会返回默认值
3.删除数据
del d[key]
4.查找数据
flag = key in d

"""
import dbm

with dbm.open('mydb', 'c') as db:
    db['name'] = 'tony'
    print(db['name'].decode())     #取出数据  db['name']取出的是字节序列,如果要取出字符串,则需要加.decode()
    age = int(db.get('age', b'18').decode())  #取出数据
    print(age)
    if 'age' in db:
        db['age'] = '20'
    
    del db['name']  
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值