2022年 11月 9日

《零基础学Python》Python数据库编程【十】

整体文章目录

整体目录

一、 当前章节目录

在这里插入图片描述

二、数据库简介

数据库功能:

  • 数据定义功能。
    • DBMS提供相应数据语言来定义数据库结构
    • DDL通常包括对每个对象的创建、修改以及删除命令。
  • 数据操纵功能。
    • DBMS提供数据操纵语言,实现对数据库数据的基本操作。
    • DML通常包括对数据的增加、删除、修改以及查询命令。
  • 数据库的管理和维护功能。
    • 数据的安全性、完整性和并发控制。
    • 数据库初始数据的装入。
    • 数据库的转储、恢复、重组织。
    • 系统性能监视、分析等功能。

数据库类型:

  1. 关系型数据库:Oracle、MySQL、Microsoft SQL Server
  2. 非关系型数据库:NoSQL、MongoDB、Redis、HBase

三、Python DATABASE API简介

  • Python访问数据库的具体步骤
    1. 导入相应数据库的第三方模块。如访问Oracle数据库的专用模块cx_Oracle、访问MySQL数据库的专用模块pymysql、访问SQL Server数据库的专用模块pymssql、Python自带的SQLite3模块
    2. 调用connect()创建数据库连接,返回连接对象conn
    3. 调用conn.execute()方法创建表结构并插入数据。如果设置了手动提交,需要调用conn.commit()提交插入或修改的数据。
    4. 调用conn.cursor()方法返回游标对象cur,通过cur.execute()方法查询数据库。
    5. 调用cur.fetchall()、cur.fetchmany()或cur.fetchone()返回查询结果。
    6. 关闭cur和conn。
  • 数据库连接对象
    • host:数据库主机名
    • user:数据库登录名
    • passwd:数据库登陆的密码
    • DATABASE:要使用的数据库名
    • port:MySQL服务使用的TCP端口等
      在这里插入图片描述
  • 游标对象
    在这里插入图片描述

四、Python连接数据库的专用模块

4.1 数据库专业模块的下载与安装

在这里插入图片描述

4.2 Python连接Oracle数据库

import cx_oracle                    # 导入cx_Oracle模块

connection = cx_oracle.connect("system", "123", "orcl")             # 连接Oracle数据库
cursor = connection.cursor()                                        # 获取cursor对象操作数据库
sql = """select empname 姓名, emptel 电话, sal 薪水, deptname 部门     # 定义sql查询语句
        from emp e, dept d
        where sal > 2500
        and e.deptno = d.deptno
        order by sal"""
cursor.execute(sql)                                                 # 执行sql语句
for x in cursor.fetchall():                                         # 外循环获取所有数据
    for value in x:                                                 # 内输出每一行数据
        print(value, end=' ')
print()                                                             # 换行
cursor.close()                                                      # 关闭游标
connection.close()                                                  # 关闭连接
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16

4.3 Python连接MySQL数据库

import sys                  # 导入sys模块
import pymysql              # 导入pymysql模块
try:                        # 捕获异常
    conn = pymysql.connect(host='127.0.0.1', port=3306, user='root', passwd='a',
                           db='mysql', charset='utf8')       # 打开数据库连接
except Exception as e:      # 异常处理
    print(e)                # 打印异常信息
    sys.exit()              # 中断连接
cursor = conn.cursor()      # 使用cursor()方法创建一个游标对象cursor
# 向teacherinfo表中插入数据
sql_insert = "insert into teacherinfo(t_id, t_name, t_sex, t_pro, t_tel)values(%s, %s, %s, %s, %s)"
values = (("1113", "张海", '男', '讲师', '13891234456'), ("1114", "廖明", '女', '教授', '13891232222'))
try:                        # 捕获异常
    cursor.executemany(sql_insert, values)                          # 插入多条数据
except Exception as e:      # 异常处理
    print(e)                # 打印异常信息
sql = "select t_id, t_name, t_sex, t_pro, t_tel from teacherinfo"         # 定义SQL查询
cursor.execute(sql)         # 使用execute()方法执行SQL查询
print(cursor.rowcount)      # 打印游标获取的行数
for d in cursor.fetchall(): # 外循环获取所有数据
    for value in d:         # 内循环输出每一行数据
        print(value, end=' ')
    print()                 # 换行
cursor.close()              # 关闭游标
conn.close()                # 关闭连接
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25

运行结果:

4.4 Python连接SQL Server数据库

import pymssql                      # 导入pymssql模块
connection = pymssql.connect(host='127.0.0.1', user='root',password='123', database='mysql')            #连接SQL Server数据库
cursor = connection.cursor()        # 获取cursor对象操作数据库
sql = """select stcode 学号, stname 姓名, staddress 地址, class 班级, major 专业 from 
    studentinfo where major='计算机系' and class='一班'"""        # 定义sql查询语句
cursor.execute(sql)                 # 执行sql查询语句
for d in cursor.fetchall():         # 外循环获取所有数据
    for value in d:                 # 内循环输出每一行数据
        print(value, end=' ')
        print()                     # 换行
cursor.close()                      # 关闭游标
connection.close()                  # 关闭连接
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

4.5 Python连接SQLite数据库

import sqlite3
# 连接数据库
conn = sqlite3.connect("D:\python例题源代码\ch10code/schoolmanage.db")
# 创建表
conn.execute("create table courseinfo(c_id char(10)primary key, c_name varchar(20) "
             "not null, c_press varchar(50) not null, c_price float not null")
# 插入数据
conn.execute("insert into courseinfo(c_id, c_name, c_press, c_price)values('1001',"
             "'Python开发','人民邮电出版社', 69")
conn.execute("insert into courseinfo(c_id, c_name, c_press, c_price)values('1002',"
             "'Java开发','机械工业出版社', 60")
conn.commit()                               # 手动提交数据
cur = conn.cursor()                         # 获取游标对象
cur.execute("select * from courseinfo")     # 使用游标查询数据
res = cur.fetchall()                        # 获取所有结果
print("courseinfo: ", res)                  # 输出所有课程信息
for line in res:                            # 通过循环遍历输出结果集对象res
    for f in line:
        print(f, end=" ")
    print()                                 # 换行
cur.close()                                 # 关闭游标
conn.close()                                # 关闭连接
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22

五、使用Python的持久化模块读写数据

import shelve                                               # 导入shelve模块

addresses = shelve.open('addresses')                        # 打开或创建数据库
addresses['1'] = ['Tom', 'Beijing road', '2008-01-03']      # 插入数据
addresses['2'] = ['Jerry', 'Shanghai road', '2008-03-30']   # 插入数据
if '2' in addresses:                                        # 判断关键字“2”是否在addresses中
    del addresses['2']                                      # 删除关键字“2”对应的数据
for a in addresses.items():                                 # 循环遍历输出addresses对象的内容
    print(a)
addresses.close()                                           # 关闭连接
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10