访问数据库
原理
我们本节说的数据库,主要是指关系型数据库,常见的有MySQL、PostgreSQL、Oracle、SQLite
其中MySQL、PostgreSQL、Oracle都有数据库服务系统。
我们的应用程序要访问数据库,其实是访问一个数据服务进程,这个数据服务进程再去读写磁盘上的数据文件。
我们的应用 通常需要调用一个客户端库,也就是下图中的驱动模块, 通过网络访问数据库服务。
而SQLite 则不同,我们的应用程序直接使用库文件 访问存储在硬盘上的文件。
MySql数据库的访问
现在大家接触的最多的数据库可能就是MySql了。
通常Mysql是运行在Linux服务器上的。如何在Linux上安装Mysql服务,请参考我们的教程 CentOS上安装MySQL详解
如果大家没有Linux服务器,可以安装一个虚拟器里面安装CentOS或者Ubuntu,然后再安装Mysql。 大家可以百度搜索,有很多教程。
安装客户端库
目前使用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方法,否则不生效。
扫码分享给朋友,一起学更有动力哦