作者:billy
版权声明:著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处
在项目开发中,数据库应用必不可少。虽然数据库的种类有很多,如 SQLite、MySQL、Oracle 等等,但是它们的功能基本都是一样的,为了对数据库进行统一的操作,大多数语言都提供了简单的、标准化的数据库接口(API)。在 Python Database API 2.0 规范中,定义了 Python 数据库 API 接口的各个部分,如模块接口、连接对象、游标对象、类型对象和构造器、DB API 的可选扩展以及可选的错误处理机制等等。
在 Python 中,可以通过数据库模块的 connect() 函数获取数据库连接对象(Connection Object),该对象主要提供获取数据库游标对象和提交/回滚事务的方法,以及关闭数据库连接。
connect() 函数常用的参数及说明,请参考下表:
参数 | 说明 |
---|---|
dsn | 数据源名称,给出该参数表示数据库依赖 |
user | 用户名 |
password | 用户密码 |
host | 主机名 |
database | 数据库名称 |
connect() 函数返回的连接对象,有以下常用方法:
方法名 | 说明 |
---|---|
close() | 关闭数据库连接 |
commit() | 提交事务 |
rollback() | 回滚事务 |
cursor() | 获取游标对象,操作数据库,如执行 DML 操作、调用存储过程等 |
游标对象(Cursor Object)代表数据库中的游标,用于指示抓取数据库操作的上下文。主要提供执行 SQL 语句、调用存储过程、获取查询结果等方法。游标对象的常用方法如下表所示:
方法名 | 说明 |
---|---|
callproc(procname, [, parameters]) | 调用存储过程,需要数据库支持 |
close() | 关闭当前游标 |
execute(operation[, parameters]) | 执行数据库操作,SQL 语句或者数据库命令 |
executemany(operation, seq_of_params) | 用于批量操作,如批量更新 |
fetchone() | 获取查询结果集中的下一条记录 |
fetchmany(size) | 获取指定数量的记录 |
fetchall() | 获取结果集的所有记录 |
nextset() | 跳至下一个可用的结果集 |
arraysize | 指定使用 fetchmany() 获取的行数,默认为 1 |
setinputsizes(sizes) | 设置在调用 execute*() 方法时分配的内存区域大小 |
setoutputsize(sizes) | 设置列缓冲区大小,对大数据列如 LONGS 和 BLOBS 尤其有用 |
与许多其他数据库管理系统不同,SQLite 不是一个客户端/服务器结构的数据库引擎,而是一种嵌入式数据库,它的数据库就是一个文件。SQLite 将整个数据库,包括定义、表、索引以及数据本身,作为一个单独的、可跨平台使用的文件存储在主机中。由于 SQLite 本身使用 C 语言写的,而且体积很小,所以经常被集成到各种应用程序中。Python 就内置了 SQLite3,所以在 Python 中使用 SQLite 不需要安装任何模块,直接使用。
操作数据库流程如下:
示例1:
import sqlite3 # 导入 SQLite 数据库
# 连接数据库文件 demo.db,如果文件不存在,会自动在当前目录创建
conn = sqlite3.connect('demo.db')
# 获取游标
cursor = conn.cursor()
# 创建表 user
cursor.execute('create table user(id int(10) primary key, name varchar(20))')
# 向表 user 中插入数据
cursor.execute('insert into user(id, name) values ("1", "Billy")')
cursor.execute('insert into user(id, name) values ("2", "Kitty")')
cursor.execute('insert into user(id, name) values ("3", "Alice")')
# 关闭游标
cursor.close()
# 提交事务
conn.commit()
# 断开连接
conn.close()
示例2:
import sqlite3
conn = sqlite3.connect('demo.db')
cursor = conn.cursor()
cursor.execute('select * from user')
result = cursor.fetchone()
print(result)
cursor.execute('select * from user where id > 1')
result = cursor.fetchall()
print(result)
cursor.execute('update user set name = ? where id = ?', ("Miss", 3))
cursor.execute('select * from user')
result = cursor.fetchall()
print(result)
cursor.execute('delete from user where id = ?', (2, ))
cursor.execute('select * from user')
result = cursor.fetchall()
print(result)
cursor.close()
conn.commit()
conn.close()
上述例子的运行结果为:
(1, 'Billy')
[(2, 'Kitty'), (3, 'Alice')]
[(1, 'Billy'), (2, 'Kitty'), (3, 'Miss')]
[(1, 'Billy'), (3, 'Miss')]
MySQL 是一款开源的数据库软件,由于其免费特性得到了全世界用户的喜爱,是目前使用人数最多的数据库,在使用前需要先下载安装。
下载地址1:官网下载
下载地址2:网盘下载
提取码:l4f2
配置完环境变量之后,在 D:\mysql\mysql-8.0.21-winx64 目录下新增加一个配置文件 mysql.ini ,同时在 bin 的同级目录下创建一个 data 文件夹(用于存放数据库数据)
[mysql]
# 设置mysql客户端默认字符集
default-character-set=utf8
[mysqld]
#设置3306端口
port = 3306
# 设置mysql的安装目录
basedir=D:\mysql\mysql-8.0.21-winx64
# 设置mysql数据库的数据的存放目录
datadir=D:\mysql\mysql-8.0.21-winx64\data
# 允许最大连接数
max_connections=200
# 服务端使用的字符集默认为8比特编码的latin1字符集
character-set-server=utf8
# 创建新表时将使用的默认存储引擎
default-storage-engine=INNODB
初始化数据库:mysqld --initialize-insecure --user=mysql
安装 mysql:mysqld install
启动服务:net start mysql
以管理员身份登录 mysql:mysql -u root -p
默认密码为空,直接回车即可
修改管理员密码:ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '123456';
刷新权限:FLUSH PRIVILEGES;
至此大功告成,可以使用 Navicat for MySQL 操作数据库了
下载并安装 Navicat for MySQL
下载地址:网盘下载
提取码:7q8u
由于 MySQL 服务器以独立的进程运行,并通过网络对外服务,所以,需要支持 Python 的 MySQL 驱动来连接到 MySQL 服务器。在 Python 中支持 MySQL 的数据库模块有很多,我们选择使用 PyMySQL。
cmd -> 右键以管理员身份运行命令提示符,输入以下命令:
pip3 install PyMySQL
如果安装失败,可以在后面添加镜像路径:
pip3 install PyMySQL -i https://pypi.douban.com/simple
示例:
import pymysql
# 打开数据库,参数依次为:主机名/IP,用户名,密码,数据库名,字符集
db = pymysql.connect("localhost", "root", "123456", "python", charset='utf8')
# 使用 cursor() 方法创建一个游标对象 cursor
cursor = db.cursor()
# 使用 execute() 方法执行 SQL 查询
cursor.execute("select version()")
# 使用 fetchone() 方法获取单条数据
data = cursor.fetchone()
print("Datebase version : %s " % data) # 输出 Datebase version : 8.0.21
# 如果表 books 存在,则删除表
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)
# 数据列表
data = [("Python 深度解析", 'Python', '79.80', '2018-5-20'),
("零基础学 Python", 'Python', '69.80', '2018-6-18'),
("PHP 项目开发实战入门", 'PHP', '79.80', '2016-5-21'),
("Java 从入门到精通", 'Java', '69.80', '2017-5-21')]
try:
# 执行 SQL 语句,插入多条数据
cursor.executemany("insert into books(name, category, price, publish_time) values (%s, %s, %s, %s)", data)
# 提交数据
db.commit()
except:
# 发生错误时回滚
db.rollback()
# 关闭数据库连接
db.close()