《疯狂Python讲义》之数据库编程

十年热恋 提交于 2020-02-05 07:31:46

Python数据库API简介

全局变量

Python推荐支持DB API2.0的数据库模块都应该提供如下3个全局变量

  • apilevel:该全局变量显示数据库模块的API版本号
  • threadsafety:该全局变量指定数据库模块的线程安全等级
  • paramstyle:该全局变量指定当SQL语句需要参数时,可以使用哪种风格的参数

数据库API的核心类

  • cursor(factory=Cursor):打开游标
  • commit():提交事务
  • rollback():回滚事务
  • close():关闭数据库连接
  • isolation_level:返回或设置数据库连接中事务的隔离级别
  • in_transaction:判断当前是否处于事务中

游标对象通常会具有如下方法和属性:

  • execute(sql[,parameters]):执行SQL语句
  • executemany(sql,seq_of_parameters):重复执行SQL语句
  • fetchone():获取查询结果集的下一行,如果没有下一行,则返回None
  • fetchmany(size=cursor.arraysize):返回查询结果集的下N行组成的列表,如果没有更多的数据行,则返回空列表
  • fetchall():返回查询结果集的全部行组成的列表
  • close():关闭游标
  • rowcount:该只读数据返回收SQL语句影响的行数
  • lastrowid:该只读属性可获取最后修改行的rowid
  • arraysize:用于设置或获取fetchmany()默认获取的记录条数,默认为1
  • description:该只读属性可获取最后一次查询返回的所有列的信息
  • connection:该只读属性返回创建游标的数据库连接对象
    总结来看,Python的DB API2.0由一个connect()开始,一共涉及数据库连接和游标两个核心API:
  • 数据库连接:用于获取游标、控制事务
  • 游标:执行各种SQL语句

操作数据库的基本流程

  1. 调用connect()方法打开数据库连接,该方法返回数据库连接对象
  2. 通过数据库连接对象打开游标
  3. 使用游标执行SQL语句,如果执行的是查询语句,则处理查询数据
  4. 关闭游标
  5. 关闭数据库连接

操作SQLite数据库

Python默认自带SQLite数据库和API模块-----在Python安装目录下的DLLs子目录中可以看到sqlite3.dll文件,该文件就是SQLite数据库的核心文件;也可以在Python安装目录下的lib目录看到sqlite3子目录,它就是SQLite数据库的API模块。

创建数据表

使用connect()方法打开或创建一个数据库,代码如下:

conn = sqlite3.connect(first.db)

如果first.db文件存在,那么程序就打开该数据库;如果该文件不存在,则会在当前目录下创建相应的文件。

# 导入访问SQLite的模块
import sqlite3

# ①、打开或创建数据库
# 也可以使用特殊名::memory:代表创建内存中的数据库
conn = sqlite3.connect('first.db')
# ②、获取游标
c = conn.cursor()
# ③、执行DDL语句创建数据表
c.execute('''create table user_tb(
	_id integer primary key autoincrement,
	name text,
	pass text, 
	gender text)''')
# 执行DDL语句创建数据表
c.execute('''create table order_tb(
	_id integer primary key autoincrement,
	item_name text,
	item_price real,
    item_number real,
	user_id inteter,
    foreign key(user_id) references user_tb(_id) )''')
# ④、关闭游标
c.close()
# ⑤、关闭连接
conn.close()

使用SQLite Expert工具

安装SQLite Expert(具体安装步骤就不详细列出了)

使用序列重复执行DML语句

使用游标的execute()方法也可以执行DML的insert、update、delete语句,这样即可对数据库执行插入、修改和删除数据操作。

执行查询

由于select语句执行完成后可以得到查询结果,因此程序可通过游标的fetchone()、fetchmany(n)、fetchall来获取查询结果。

事务控制

事务具备4种特性:原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)和持续性(Durability),简称ACID

执行SQL脚本

SQLite数据库模块的游标对象还包含一个executescript()方法。

# 导入访问SQLite的模块
import sqlite3

# ①、打开或创建数据库
# 也可以使用特殊名::memory:代表创建内存中的数据库
conn = sqlite3.connect('first.db')
# ②、获取游标
c = conn.cursor()
# ③、调用executescript()方法执行一段SQL脚本
c.executescript('''
    insert into user_tb values(null, '武松', '3444', 'male');  
    insert into user_tb values(null, '林冲', '44444', 'male');
    create table item_tb(_id integer primary key autoincrement,
	name,
	price);
    ''')
conn.commit()
# ④、关闭游标
c.close()
# ⑤、关闭连接
conn.close()

为了简化编程,SQLite数据库模块还为数据库连接对象提供了3个方法:

  • execute(sql[,parameters):执行一条SQL语句
  • executemany(sql[,parameters]):根据序列重复执行SQL语句
  • executescript(sql_script):执行SQL脚本

创建自定义函数

数据库连接对象还提供了一个create_function(name,num_params,func)方法,该方法用于注册一个自定义函数。

  • name参数:指定注册的自定义函数的名字
  • num_params:指定自定义函数所需参数的个数
  • func:指定自定义函数对应的函数
# 导入访问SQLite的模块
import sqlite3

# 先定义一个普通函数,准备注册为SQL中的自定义函数
def reverse_ext(st):
    # 对字符串反转,前后加方括号
    return '[' + st[::-1] + ']'
# ①、打开或创建数据库
# 也可以使用特殊名::memory:代表创建内存中的数据库
conn = sqlite3.connect('first.db')
# 调用create_function注册自定义函数:enc
conn.create_function('enc', 1, reverse_ext)
# ②、获取游标
c = conn.cursor()
# ③、在SQL语句中使用enc自定义函数
c.execute('insert into user_tb values(null, ?, enc(?), ?)', 
    ('贾宝玉', '123456', 'male'))
conn.commit()
# ④、关闭游标
c.close()
# ⑤、关闭连接
conn.close()

创建聚集函数

标准的SQL语句提供了如下5个标准的聚集函数:

  • sum():统计总和
  • avg():统计平均值
  • count():统计记录条数
  • max():统计最大值
  • min():统计最小值
    如果需要自定义聚集函数,可以使用数据库连接对象所提供的create_aggregate(name,num_params,aggregate_class)方法:
  • name:指定自定义聚集函数的名字
  • num_params:指定聚集函数所需的参数
  • aggregete_class:指定聚集函数的实现类
# 导入访问SQLite的模块
import sqlite3

# 先定义一个普通类,准备注册为SQL中的自定义聚集函数
class MinLen:
    def __init__(self):
        self.min_len = None
    def step(self, value):
        # 如果self.min_len还未赋值,直接将当前value赋值给self.min_lin
        if self.min_len is None :
            self.min_len = value
            return
        # 找到一个长度更短的value,用value代替self.min_len
        if len(self.min_len) > len(value):
            self.min_len = value
    def finalize(self):
        return self.min_len
# ①、打开或创建数据库
# 也可以使用特殊名::memory:代表创建内存中的数据库
conn = sqlite3.connect('first.db')
# 调用create_aggregate注册自定义聚集函数:min_len
conn.create_aggregate('min_len', 1, MinLen)
# ②、获取游标
c = conn.cursor()
# ③、在SQL语句中使用min_len自定义聚集函数
c.execute('select min_len(pass) from user_tb')
print(c.fetchone()[0])
conn.commit()
# ④、关闭游标
c.close()
# ⑤、关闭连接
conn.close()

创建比较函数

如果需要注册一个自定义的比较函数,可以使用数据库连接对象所提供的create_collation(name,callable)方法:

  • name:指定自定义比较函数的名字
  • callable:指定自定义比较函数对应的函数
# 导入访问SQLite的模块
import sqlite3

# 去掉字符串第一个、最后一个字符后比较大小
def my_collate(st1, st2):
    if st1[1: -1] == st2[1: -1]:
        return 0
    elif st1[1: -1] > st2[1: -1]:
        return 1
    else:
        return -1
# ①、打开或创建数据库
# 也可以使用特殊名::memory:代表创建内存中的数据库
conn = sqlite3.connect('first.db')
# 调用create_collation注册自定义比较函数:sub_cmp
conn.create_collation('sub_cmp', my_collate)
# ②、获取游标
c = conn.cursor()
# ③、在SQL语句中使用sub_cmp自定义的比较函数
c.execute('select * from user_tb order by pass collate sub_cmp')
# 采用for循环遍历游标
for row in c:
    print(row)
conn.commit()
# ④、关闭游标
c.close()
# ⑤、关闭连接
conn.close()

操作MySQL数据库

下载和安装MySQL数据库

(具体安装步骤就不详细列出了)

使用pip工具管理模块

查看已安装的模块
pip show mysql-connector-python
卸载已安装的模块
pip uninstall mysql-connector-python
安装模块
pip install mysql-connector-python

执行DDL语句

使用MySQL模块对MySQL数据库执行DDL语句,Python程序在连接MySQL数据库时可指定远程服务器IP地址和端口

执行DML语句

MySQL数据库通样可以使用游标的execute()方法执行DML的insert、update、delete语句,对数据库进行插入、修改和删除数据操作。

SQL语句中的占位符:%s,它指定在SQL语句中使用扩展的格式代码来作为占位符

执行查询语句

使用MySQL数据库模块执行查询语句,与使用SQLite数据库模块执行查询语句基本相似,只需注意SQL语句中的占位符

调用存储过程

MySQL数据库模块为游标对象提供了一个非标准的callproc(self,procname,args=())方法,该方法调用数据库存储过程。其中,procname参数代表存储过程的名字,而args参数则用于为存储过程传入参数

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!