访问数据库

原理

我们本节说的数据库,主要是指关系型数据库,常见的有MySQL、PostgreSQL、Oracle、SQLite

其中MySQL、PostgreSQL、Oracle都有数据库服务系统。

我们的应用程序(下图中的App)要访问数据库,其实是访问一个数据服务进程(下面图中的Server process),这个数据服务进程再去读写磁盘上的数据文件。

我们的应用 通常需要通过一个Driver库 从网络访问数据库服务,数据在网络上传输。

image


而SQLite 则不同,我们的应用程序直接使用库文件 访问存储在硬盘上的文件。

image

MySql数据库的访问

现在大家接触的最多的数据库可能就是MySql了。

通常Mysql是运行在Linux服务器上的。关于如何安装Mysql服务,我们就不多讲了。

如果大家没有Linux服务器,可以安装一个虚拟器里面安装CentOS或者Ubuntu,然后再安装Mysql。 大家可以百度搜索,有很多教程。

目前使用Python语言访问mysql数据库, 最好的库就是mysqlclient。

这个库遵循 Python统一数据库访问接口规范(参考PEP 249),支持Python3 并且 抽象层级比较高。

这是个开源的库,官方网址在github上 https://github.com/PyMySQL/mysqlclient-python

使用文档在这里 https://mysqlclient.readthedocs.io/


安装

既然是Python的库,基本都是用 pip安装了

直接 运行: pip install mysqlclient

注意Windows上安装的这个库其实还需要一个C语言开发的本地库, 以前还要从源代码编译本地库安装, 现在比较简单了。这个库里面就包含了编译好的本地库。

读取数据库表内容

我们来看下面这样的一个读取数据库表的例子。

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):
    # 返回的是一个元组,里面每个元素代表一个字段
    row = c.fetchone()
    print(row)

插入数据到数据库表

我们来看下面这样的一个插入数据到数据库表的例子。

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