程序访问数据库服务
前面,我们都是通过命令行客户端对数据库进行操作的。
这个命令行客户端 是一个特殊的 数据库客户端程序, 它能够把我们的SQL语句发送给 MySQL数据库服务,然后把运行结果展示在屏幕上。
大部分的数据库客户端程序,是要完成特殊的功能的。 典型的就是我们后面要学习的 web服务端程序。
我们后面的教程会教大家开发一个 医药公司的 订单管理系统 BYCRM。
这个系统要完成各种业务功能,比如 药品的添加、客户的添加、订单的创建等等,当然要大量地使用数据库服务,它也是一个数据库客户端程序。
我们现在先学习一下 自己开发简单的程序,来使用数据库服务。
我们的应用程序要访问数据库,其实是访问数据服务进程,这个数据服务进程再去读写磁盘上的数据文件。
我们的应用 通常需要调用一个客户端库,也就是下图中的驱动模块, 通过网络访问数据库服务。
安装客户端库
目前使用Python语言访问mysql数据库, 推荐使用客户端库 mysqlclient 和 PyMySQL。
mysqlclient 库是C语言开发的,性能比较高。我们这里就使用它。
这个库遵循 Python统一数据库访问接口规范(参考PEP 249),支持Python3 并且 抽象层级比较高。
这是个开源的库,官方网址在github上 https://github.com/PyMySQL/mysqlclient-python
使用文档在这里 https://mysqlclient.readthedocs.io/
既然是Python的第三方库,当然是用 pip安装了。 运行命令 pip install mysqlclient
安装
有时,我们可能需要指定mysqlclient库的版本为1.3.12,像这样 pip install mysqlclient==1.3.12 。因为mysqlclient 需要依赖一个c语言开发的库, 1.3.12版本安装包已经将c语言库编译好了,成为可执行代码库,就不需要安装时候编译了。
如果你想使用 的客户端库是PyMySQL ,运行命令 pip install PyMySQL
安装
读取数据库表内容
我们来看下面这样的一个读取数据库表的例子。
import MySQLdb
# 创建一个 Connection 对象,代表了一个数据库连接
connection = MySQLdb.connect(
host="192.168.0.100",# 数据库IP地址
user="username", # mysql用户名
passwd="xxxxx", # mysql用户登录密码
db="dbname" , # 数据库名
# 如果数据库里面的文本是utf8编码的,
#charset指定是utf8
charset = "utf8")
# 返回一个 Cursor对象
c = connection.cursor()
# 执行一个获取 users 表中所有记录的 sql 语句
c.execute("""SELECT * FROM users """)
# rowcount属性记录了最近一次 execute 方法获取的数据行数
numrows = c.rowcount
for x in range(numrows):
# fetchone 方法返回的是一个元组,
# 代表获取的一行记录,元组里面每个元素代表一个字段
row = c.fetchone()
print(row)
我们可以发现,对数据库的操作是 通过SQL语句
进行的。
我们的代码需要先创建一个 Connection 对象 , 然后再通过Connection 对象创建一个Cursor 对象。
最后使用Cursor对象的execute方法,传入要数据库服务执行的SQL语句。
调用execute执行完SQL语句后,cursor 对象的 fetchone 方法是获取一行记录。
fetchone 方法返回的是一个元组,代表获取的一行记录,元组里面每个元素代表一个字段。
上面的代码通过一个for循环,可以依次获取到数据库的记录行。
我们还可以用 fetchmany 方法来获取多行记录,该方法的参数就是要获取记录的条数,比如
# 执行一个获取 users 表中所有记录的 sql 语句
c.execute("""SELECT * FROM users """)
# fetchmany方法返回的是一个元组,
# 里面每个元素也是元组,代表一行记录
rows = c.fetchmany(2)
print(rows)
我们还可以用 fetchall 方法来获取所有记录,比如
# 执行一个获取 users 表中所有记录的 sql 语句
c.execute("""SELECT * FROM users """)
# fetchall方法返回的是一个元组,
# 里面每个元素也是元组,代表一行记录
rows = c.fetchall()
print(rows)
插入数据到数据库表
我们来看下面这样的一个插入数据到数据库表的例子。
import MySQLdb
# 创建一个Connection 对象,代表了一个数据库连接
connection = MySQLdb.connect(
host="192.168.0.100",# 数据库IP地址
user="username", # mysql用户名
passwd="xxxxx", # mysql用户登录密码
db="dbname" , # 数据库名
# 如果数据库里面的文本是utf8编码的,
#charset指定是utf8
charset = "utf8")
# 返回一个cursor对象
c = connection.cursor()
# 插入一行数据到 user 表中
c.execute(f"""INSERT INTO users ( name, nickname, phone) VALUES ('baiyueheiyu', '白月黑羽', '13312345678')"""
)
# 注意 一定要commit,否则添加数据不生效
connection.commit()
connection.close()
插入数据操作当然也是通过 Cursor对象的execute方法,传入要数据库服务执行的 插入操作对应的SQL语句
。
注意, 凡是执行 更改
数据的SQL语句,包括:插入、修改、删除, 后面一定要调用connection的commit方法,否则不生效。
作业和练习
前面的作业,我们创建了Prac库,在其中添加user 表 和 medicine表,并且添加了一些记录。
请用 Python语言编写一个程序
连接数据库,执行下面的操作
-
在user表中查询 注册日期在 2019年1月2日之后的 用户记录,并且查询结果安装注册日期升序排列,注册日期相同再根据 等级 降序排列。
-
用SQL语句 修改 medicine 表,将其中 有效期截止时间 在 2019年1月2日之前的药品 有效状态 改为 0
-
用SQL语句 删除 medicine 表中, 有效期截止时间 在 2019年1月2日之前的药品
扫码分享给朋友,一起学更有动力哦