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语句
操作数据库的基本流程
- 调用connect()方法打开数据库连接,该方法返回数据库连接对象
- 通过数据库连接对象打开游标
- 使用游标执行SQL语句,如果执行的是查询语句,则处理查询数据
- 关闭游标
- 关闭数据库连接
操作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参数则用于为存储过程传入参数
来源:CSDN
作者:JJJims
链接:https://blog.csdn.net/fallenjency/article/details/104051339