数据库编程接口:python database API
python database API概述
python database API 规范对于关系数据库的访问,Python社区已经制定出一个标准,称为Python Database API,通过这个接口使python跨不同数据库的操作代码可以更加具有可移植性、让 Python 可以连接(并操作)更多的数据库。
python database API 中有两个主要对象:
- 用于管理数据库连接的Connection(连接)对象
- 用于执行查询的Cursor(游标)对象
连接对象
connect() 函数
该函数创建并返回一个 Connection 对象,connect()函数通过 Connection 对象访问数据库
该函数有多个参数,具体使用哪个参数取决于使用的数据库类型。如要访问Oracle和MySQL数据库则必须同时下载这俩python模块。这些模块在获取连接对象时都需要connect()函数。
Connect()函数属性:
user 用户名
password 密码
host 主机名
database 数据库名 MySQLdb数据库使用的是db
dsn 数据源名,指定要连接的数据库类型如:mysql、oracle
Connection连接对象
主要用于提供数据库游标对象和提交回滚事务的方法以及关闭数据库连接
Connection连接对象常用方法:
close() 关闭数据库连接
commit() 提交事务
rollback() 回滚事务
cursor() 获取游标对象,操作数据库如:执行DML操作、调用存储过程等
游标对象
cursor():通过Connection对象的cursor()方法生成游标对象
cursor对象的常用方法如下图:
执行顺序:
创建数据库连接对象→创建游标对象→执行SQL语句处理数据结果→关闭游标→关闭连接对象
使用sqlite3模块操作SQLite数据库
SQLite:嵌入式数据库,他的数据库就是一个文件,所以使用方便操作简单
sqlite3:python中内置的SQLite模块为
创建数据库文件
示例:会在当前目录创建一个数据库文件
import sqlite3
# 连接到SQLite数据库
# 数据库文件是mrsoft.db
# 如果文件不存在,会自动在当前目录创建:
conn = sqlite3.connect('mrsoft.db') #mrsoft.db表示定义的数据库名称
# 创建一个Cursor:
cursor = conn.cursor()
# 执行一条SQL语句,创建user表:
cursor.execute('create table user (id int(10) primary key, name varchar(20))')
# 关闭游标
cursor.close()
# 提交事务:
conn.commit()
# 关闭Connection:
conn.close()
操作SQLite数据库
注意:因为引号是成对出现的,所以在写sql语句是要不外面是单引号里面是双引号要不反过来
安装图形化工具Navicat for salite 安装后进行查看测试
新增
- 新增数据
示例:
import sqlite3
conn = sqlite3.connect('mrsift.db')
cursor = conn.cursor()
cursor.execute('insert into user (id,name) values(1,"小明")')
cursor.execute('insert into user (id, name) values ("2", "Andy")')
cursor.close()
conn.commit()
conn.close()
- 为避免sql注入从而泄露信息可以用占位符编写sql语句
示例:
import sqlite3
conn = sqlite3.connect('mrsift.db')
cursor = conn.cursor()
sql = 'insert into user (id,name) values(?,?)' #?占位符进行预处理
cursor.execute(sql,(2,'lisi')) #用真实的值替换占位符,一一对应的关系
cursor.close()
conn.commit()
conn.close()
- 通过 cursor.executemany 方法批量插入数据
示例:
import sqlite3
conn = sqlite3.connect('mrsift.db')
cursor = conn.cursor()
sql = 'insert into user (id,name) values(?,?)' #?占位符进行预处理
data = [(3,'wang3'),(4,'wang4'),(5,'wang5')] #定义列表
cursor.executemany(sql,data) #批量插入
cursor.close()
conn.commit()
conn.close()
查询
注意:查询是不需要提交事务
- fetchone():获取集群结果集中的下一条记录,返回一个元组
import sqlite3
conn = sqlite3.connect('mrsift.db')
cursor = conn.cursor()
cursor.execute('select * from user')
print(cursor.fetchone()) #获取第一条记录
print(cursor.fetchone()) #获取第二条记录
print(cursor.fetchone()) #获取第三条记录
cursor.close()
conn.close()
- fetchmany(size):获取指定数量的记录,返回一个列表
#size:指定获取结果集中几条记录,默认为一条
import sqlite3
conn = sqlite3.connect('mrsift.db')
cursor = conn.cursor()
cursor.execute('select * from user') #
print(cursor.fetchmany(2)) #指定获取结果集中的两条记录
cursor.close()
conn.close()
- fetchall:获取结构集中的所有记录,返回一个列表
import sqlite3
conn = sqlite3.connect('mrsift.db')
cursor = conn.cursor()
cursor.execute('select * from user where id > 3')
print(cursor.fetchall())
cursor.close()
conn.close()
修改
import sqlite3
conn = sqlite3.connect('mrsift.db')
cursor = conn.cursor()
sql = 'update user set name = ? where id = ?'
cursor.execute(sql,('wang1',1))
cursor.close()
conn.commit()
conn.close()
删除
import sqlite3
conn = sqlite3.connect('mrsift.db')
cursor = conn.cursor()
sql = 'delete from user where id = ?'
cursor.execute(sql,[1])
cursor.close()
conn.commit()
conn.close()
使用MySQL数据库
下载安装MySQL
安装PyMySQL
第三方模块PyMySQL:因为在python中并没有内置操作mysql的模块,所以我们需要安装第三方mysql操作模块,支持的模块有很多PyMySQL是其中之一
命令行执行安装:pip3 install PyMySQL
连接数据库
示例
import pymysql
# 打开数据库连接,参数1:主机名或IP;参数2:用户名;参数3:密码;参数4:数据库名称
db = pymysql.connect(host="localhost", user="root", password="123456", database="mrsoft")
# 使用 cursor() 方法创建一个游标对象 cursor
cursor = db.cursor()
# 使用 execute() 方法执行 SQL 查询
cursor.execute("SELECT VERSION()")
# 使用 fetchone() 方法获取单条数据.
data = cursor.fetchone()
print ("Database version : %s " % data)
cursor.close()
# 关闭数据库连接
db.close()
创建数据表
示例
import pymysql
# 打开数据库连接
db = pymysql.connect(host="localhost", user="root", password="123456", database="mrsoft")
# 使用 cursor() 方法创建一个游标对象 cursor
cursor = db.cursor()
# 使用 execute() 方法执行 SQL,如果表存在则删除
cursor.execute("DROP TABLE IF EXISTS books")
# 使用预处理语句创建表
sql = """
CREATE TABLE books (
id int(8) NOT NULL AUTO_INCREMENT,
name varchar(50) NOT NULL,
category varchar(50) NOT NULL,
price decimal(10,2) DEFAULT NULL,
publish_time date DEFAULT NULL,
PRIMARY KEY (id)
) ENGINE=MyISAM AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;
"""
# 执行SQL语句
cursor.execute(sql)
cursor.close()
# 关闭数据库连接
db.close()
操作数据表
删改查可以参考sqlite3,操作语句基本相同
示例:增加数据,一次插入多条
注意:sqlite的占位符为'?',而mysql中的占位符为‘%s’
import pymysql
# 打开数据库连接
db = pymysql.connect(host="localhost", user="root", password="Picc@1234", database="mrsoft") #如果有汉字需要指定字符编码否则报错
# 使用cursor()方法获取操作游标
cursor = db.cursor()
# 数据列表
data = [("零基础学Python",'Python','79.80','2018-5-20'),
("Python从入门到精通",'Python','79.80','2018-10-1'),
("Python数据分析从入门到实践",'Python','98.00','2020-6-1'),
("Java从入门到精通(第5版)",'Java','69.80','2019-2-1'),
("零基础学Java",'Java','69.80','2017-5-18'),
]
try:
# 执行sql语句,插入多条数据
cursor.executemany("insert into books(name, category, price, publish_time) values (%s,%s,%s,%s)", data)
# 提交数据
db.commit()
except:
# 发生错误时回滚
db.rollback()
cursor.close()
# 关闭数据库连接
db.close()