Python 操作数据库

作者: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 将整个数据库,包括定义、表、索引以及数据本身,作为一个单独的、可跨平台使用的文件存储在主机中。由于 SQLite 本身使用 C 语言写的,而且体积很小,所以经常被集成到各种应用程序中。Python 就内置了 SQLite3,所以在 Python 中使用 SQLite 不需要安装任何模块,直接使用

操作数据库流程如下:

Created with Raphaël 2.2.0 开始 创建 connection 获取 cursor 执行 SQL 语句,处理数据结果 关闭 cursor 关闭 connection 结束

示例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

MySQL 是一款开源的数据库软件,由于其免费特性得到了全世界用户的喜爱,是目前使用人数最多的数据库,在使用前需要先下载安装。

下载地址1:官网下载

Python 操作数据库_第1张图片

下载地址2:网盘下载
提取码:l4f2

下载、解压缩完成之后,需要配置环境变量
Python 操作数据库_第2张图片

配置完环境变量之后,在 D:\mysql\mysql-8.0.21-winx64 目录下新增加一个配置文件 mysql.ini ,同时在 bin 的同级目录下创建一个 data 文件夹(用于存放数据库数据)

Python 操作数据库_第3张图片
mysql.ini 的内容如下

[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

Python 操作数据库_第4张图片
初始化数据库: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;

Python 操作数据库_第5张图片

至此大功告成,可以使用 Navicat for MySQL 操作数据库了

下载并安装 Navicat for MySQL
下载地址:网盘下载
提取码:7q8u

Python 操作数据库_第6张图片

在 Python 中使用 MySQL

由于 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()

Python 操作数据库_第7张图片

更多请参考

  • Python 进阶之路

你可能感兴趣的:(Python,Python,数据库操作,sqlite3,mysql)