Python 操作 MySQL 数据库

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u013486414/article/details/85768722

写在之前

在之前的文章中我们学习用文件形式将数据保存到磁盘中,虽然这已经是一种不错的方式,但是头秃的大佬们还是发明了更快更便捷的东西:「数据库」。它更具有格式化的特点,并且写入和读取更快更方便。

到目前为止,我们所熟知的主流数据库有三种:

  • 关系型数据库:MySQL,SQL Server,Oracle 等。

  • 非关系型数据库:MongoDB,BigTable(Google) 等。

  • 键值数据库:Apache Cassandra(Facebook),LevelDB(Google) 等。

MySQL 概况

MySQL 是一个使用非常广泛的数据库,很多网站都在用。MySQL 在过去由于性能高、成本低、可靠性好,已经成为最流行的开源数据库,因此被广泛应用在 Internet 上的中小型网站中。随着它的不断成熟,MySQL 也逐渐用于更多大规模网站和应用,比如 Google 和 Facebook 等网站。我们所熟知的开源软件组合 LAMP 中的 “M”指的就是 MySQL。

但在被甲骨文公司收购后,Oracle 大幅调涨了 MySQL 商业版的售价,并且它不再支持另一个自由软件项目的发展,导致一些原先使用 MySQL 的开源软件逐渐流向其它数据库,但是不管怎样,MySQL 依然是一个不错的数据库选择,足够支持我们完成一个不小的网站。

MySQL 安装

你要用 MySQL,首先就得安装它,因为每个人用的操作系统不一样,所以我就不在这单独说安装的问题,你可以去 Google,网上很多教程都很详细。当然,你按照别人的流程安装,可能会很成功的安装好,也可能出现这样那样的问题,能够顺利安装成功无疑是幸运的,但是要我来看,其实期间出现点这样那样的问题才是更幸运的,有机会研究自己碰到的问题,可以提升自己的能力,这是很好的事情,这也是我为什么要写这一小节的原因,不要畏困难如猛虎。

MySQL 运行

进入数据库的交互模式中,是操作这个数据库的最基本的方式之一(在这我用的是 windows 系统):

mysql -h localhost -u root -p

再输入密码以后,出现的情况如下图所示:

在这里插入图片描述

如果出现上述图的情况,恭喜你,你已经进入到数据库操作界面了,接下来就可以对这个数据库进行操作。例如:

mysql> show databases;

show databases 的含义是要列出当前已有的数据库,显示的结果如下图所示:

在这里插入图片描述

对数据库的操作,除了用命令以外,还可以用一些可视化的工具,比如Navicate 或 phpmyadmin(这是一个基于 PHP 的数据库管理工具,大家不要因为学习 Python 就排斥 PHP)。

关于更多关于数据库的操作的知识我就不再这具体介绍了,想深入学习的可以参考相关书籍。现在我们的 MySQL 已经安装好,但是 Python 还不能操作它,我们还要继续安装 Python 操作数据库的模块 – PyMySQL。

安装 PyMySQL

PyMySQL 是 Python 操作数据库的模块。我们在实际的编程当中会遇到很多类似的模块,也称之为「接口程序」,通过接口程序对另外一个对象进行操作。我们可以把接口程序比喻成钥匙,如果要开锁的话,你直接用手指去捅是行不通的,必须要借助正确的工具插入到锁孔中才能把锁打开。这个打开锁的工具就是「接口程序」。谁都知道,用对应的钥匙开锁是最好的,如果用别的工具,比如锤子,钻头等虽然也能开,但是不太便利。

PyMySQL 就是打开 MySQL 数据库的钥匙,它的源码保存在 https://github.com/PyMySQL,大家可以下载源码进行安装。下面说一个别的安装方式:

>>> pip3 install PyMySQL

一行命令搞定,简单快捷高效不秃顶,提高生产力。安装之后,在 Python 交互模式下运行如下命令:

>>> import pymysql
>>>

如果不报错,恭喜你,你已经安装成功了;如果报错了,那也恭喜你,你可以借助错误信息提高自己的能力了。

连接数据库

在连接数据库以前,我们首先要建立数据库。我们先来进入到数据库操作页面,然后输入如下命令,建立一个数据库:

mysql> create database bookdb character set utf8;
Query OK, 1 row affected, 1 warning (0.12 sec)

注意上面的指令,如果仅仅是输入 create database bookdb 也可以,但是我在后面增加了 character set utf8,意思是所建立的数据库 bookdb,编码是 utf8,这样我们要是存入汉字的话就不会乱码了。

看到下面的一行提示:Query OK, 1 row affected, 1 warning (0.12 sec),说明这个数据库已经建立好了,名字就叫 bookdb。

数据库建立之后,就可以用 python 通过已经安装的 PyMySQL 模块来连接这个名字叫做 bookdb 的数据库了。

>>> import pymysql
>>> dir(pymysql)
['BINARY', 'Binary', 'Connect', 'Connection', 'DATE', 'DATETIME', 'DBAPISet', 'DataError', 'DatabaseError', 'Date', 'DateFromTicks', 'Error', 'FIELD_TYPE', 'IntegrityError', 'InterfaceError', 'InternalError', 'MySQLError', 'N
ULL', 'NUMBER', 'NotSupportedError', 'OperationalError', 'PY2', 'ProgrammingError', 'ROWID', 'STRING', 'TIME', 'TIMESTAMP', 'Time', 'TimeFromTicks', 'Timestamp', 'TimestampFromTicks', 'VERSION', 'VERSION_STRING', 'Warning', '
__all__', '__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__path__', '__spec__', '__version__', '_auth', '_compat', 'apilevel', 'charset', 'connect', 'connections', 'constants',
'converters', 'cursors', 'err', 'escape_dict', 'escape_sequence', 'escape_string', 'get_client_info', 'install_as_MySQLdb', 'optionfile', 'paramstyle', 'protocol', 'sys', 'thread_safe', 'threadsafety', 'times', 'util', 'versi
on_info']

如果你是一路看着我的文章走过来的老读者,你可能会发现每学一个新知识的时候,我都会用 dir(),希望你要重视这个东西。观察一个这个模块里面给我提供的方法,相信大家也能对某些功能猜测到一二。

接下来我们准备连接已经建立好的数据库 bookdb,你是否能看到上面有一个 connect() 方法呢?为了验证我们的猜测,要继续使用 help() 看文档。

>>> help(pymysql.connect)
Help on function Connect in module pymysql:

Connect(*args, **kwargs)
   Connect to the database; see connections.Connection.__init__() for
   more information.

从上面我们可以看到(只截取了一部分),connetc() 就是我们要找的东西,并且列出了各个参数的含义。下面我们就来试一试:

>>> conn = pymysql.connect(host = 'localhost',port = 3306,user = 'root',passwd = '123456',db = 'bookdb',charset = 'utf8')

上面括号里的是几个常用的参数,下面逐个给大家解释一下:

  • host:填写 MySQL 服务的地址,我们在学习的时候通常将数据库安装在本地(本机)上,所以使用 localhost 或者 127.0.0.1,注意引号。如果在其它的服务器上,这里应该填写 IP 地址。

  • port:是服务的端口号,默认为 3036,也可以不写,如果不写的话就是默认值。

  • user:登录数据库的用户名。

  • passwd:user 账户登录 MySQL 的密码。

  • db:就是刚刚通过 create 命令创建的数据库。

  • charset:这个设置最好加上设置为 utf8,要不然输入中文的时候可能乱码。

其实关于 connect 的参数还有别的,大家可以通过帮助信息进行查看。至此,已经完成了对数据库的连接。

就数据库而言,连接之后肯定还有其它操作。我们目前创建的这个叫做 bookdb 的数据库仅仅是个空架子,没有什么可操作的,要操作它就要在里面建立「表」。

连接数据库操作

在上面的文章中,我们已经完成了数据库的连接:

conn = pymysql.connect(host = 'localhost',port = 3306,user = 'root',passwd = '123456',db = 'bookdb',charset = 'utf8')

就数据库而言,连接之后就要对其操作。我在上面说了,要操作数据库,就必须在里面建「表」,那么什么是数据库的表呢?下面引用一下《维基百科》中对数据库表的简要解释:

在关系数据库中,数据库表示一系列二维数组的集合,用来代表和存储数据对象之间的关系。它由纵向的列和横向的行组成。
对于特定的数据库表,列的数目一般事先固定,各列之间可以由列名来识别。而行的数目可以随时、动态变化,每行通常都可以根据某个(或某几个)列中的数据来识别,我们把这个称为「候选键」。

在 bookdb 中建立一个存储用户名,用户密码和用户邮箱的表,其结构如下(提前做好的,可以在后面再看到):

在这里插入图片描述

在这里需要特别说明一下:我在这部分简化了一下细节,是为了突出重点,所以没对密码加密,直接明文保存的,这种方式是很不安全的。

数据库表

直接操作数据库不是我们这个系列的重点,但是这个又关联到后面的操作,为了让大家在阅读上连贯,我在这里快速的说明如何建立数据库表并输入内容。并且考虑到看这个系列的读者大多数是零基础的学习者,所以我在这仅用非常简单的方式展示如何向数据库中插入数据。

mysql> use bookdb
Database changed
mysql> show tables;
Empty set (0.00 sec)

用 show tables 命令显示这个数据库中是否有数据表,查询的结果显示为空。接下来用下面的命令建立一个数据表,这个数据表的内容就是上面所说明的:

mysql> create table users(
   ->        id int(2) not null primary key auto_increment,
   ->        username varchar(40),
   ->        password text,
   ->        email text) default charset=utf8;
Query OK, 0 rows affected, 1 warning (0.24 sec)

上面建立的数据表的名称是 users,其中包含上述字段,可以用下面的方式查看该数据表的结构:

mysql> show tables;
+------------------+
| Tables_in_bookdb |
+------------------+
| users        |
+------------------+
1 row in set (0.00 sec)

通过上述查询显示,在 bookdb 这个数据库中已经存在了一个表,它的名字是 users。

在这里插入图片描述

上面显示的是 users 的结构。由此我们得到了一个空表,我们可以查询来看看:

mysql> select * from users;
Empty set (0.01 sec)

接下来我们向里面插入一条信息:

mysql> insert into users(username,password,email) values ("rocky","123123",'[email protected]');
Query OK, 1 row affected (0.06 sec)

然后再来查询一下表:

mysql> select * from users;
+----+----------+----------+----------------+
| id | username | password | email       |
+----+----------+----------+----------------+
|  1 | rocky  | 123123  | [email protected] |
+----+----------+----------+----------------+
1 row in set (0.00 sec)

这样就得到了一个有内容的数据库表。

操作数据库

要操作数据库,首先要保证你已经连接了数据库,如果没有,请使用前文讲述的方式操作。

Python 建立了一个与数据库的连接,其实是建立了一个 pymysql.connect() 的实例对象(连接对象)。Python 就是通过连接对象和数据库对话。这个连接对象也有自己的方法:

>>> dir(conn)

因为方法很多,我就不在这粘贴过结果来了。我在这里介绍 4 个比较常用的,并用于操作数据库。当然了,这些方法都可以使用 help() 查看文档。

  • commit():如果数据库表进行了修改,用这个方法提交保存当前的数据。当然如果此用户没有权限的话,什么也不会发生。

  • rollback():如果有权限,就取消当前的操作,否则就会报错。

  • cursor([cursorclass]):返回连接的游标对象,通过游标执行 SQL 语句。

  • close():关闭连接。

Python 是通过游标执行 SQL 语句的,所以连接建立以后,要利用连接对象得到游标对象,方法如下:

>>> cur = conn.cursor()

此后就可以利用游标对象的方法对数据库进行操作。

1.插入

如果要在数据库表 users 中插入一条记录,使得 username=“Python”,password=“123123”,email=“[email protected]”,则可以向下面这样做:

>>> cur.execute("insert into users (username,password,email) values (%s,%s,%s)",("python","123123","[email protected]"))
1

没有报错,并且返回一个结果,说明有一行记录操作成功,让我们进入到 mysql 交互模式看一下:

mysql> select * from users;
+----+----------+----------+----------------+
| id | username | password | email       |
+----+----------+----------+----------------+
|  1| rocky  | 123123   | [email protected] |
+----+----------+----------+----------------+
1 row in set (0.00 sec)

奇怪,怎么没有看到新增加的那一条呢?上面也没报错啊。这里需要注意的是,通过 cur.execute() 对数据库进行操作以后,没有报错,完全正确,但是不等于数据就已经提交到了数据库中,还必须要用到连接对象(pymysql.connect(),不是游标对象)的一个方法 commit(),将数据提交上去,也就是进行了 cur.execute() 操作以后,要将数据提交才能有效改变数据库的内容。

>>> conn.commit()

然后我们再到 mysql 交互模式下试一试:

mysql> select * from users;
+----+----------+----------+------------------+
| id | username | password | email        |
+----+----------+----------+------------------+
|  1| rocky  | 123123   | [email protected]  |
|  2| python  | 123123  | [email protected] |
+----+----------+----------+------------------+
2 rows in set (0.00 sec)

果然如此。这就如同编写一个文本一样,将文字写到文本上,必须执行 ctrl + s 才能保存。

2.查询

如果要从数据库中查询数据,则也用游标的方法 execute() 来操作:

>>> cur.execute("select * from users")
2

这说明从 users 表汇总查询出来了 2 条记录。但是这个似乎并不怎么友好,我们只能看到 2,但是如何能像在 mysql 交互模式中那样把所有的记录都列出来呢?这就得用到游标对象的 fetchall()、fetchmany(size=None)、fetchone(),scroll(value,mode=‘relative’) 等方法。

>>> lines = cur.fetchall()
>>> for line in lines:
...     print(line)
...
(1, 'rocky', '123123', '[email protected]')
(2, 'python', '123123', '[email protected]')

果然逐条显示出来了。

3.更新数据

学习了上边的内容,再学习更新数据库里的数据就很简单了,但在这我还是要提醒的是,如果更新完毕,和插入数据一样,都需要 commit() 来提交保存(下面的 cur 依然还是游标对象,跟前面建立的方法一样):

>>> cur.execute("update users set username=%s where id=2",("mypython"))
1
>>> cur.execute("select * from users where id=2")
1
>>> cur.fetchone()
(2, 'mypython', '123123', '[email protected]')

从上述的操作中可以看出,已经将数据库中第二条的用户名修改为 mypython,用的就是 SQL 中的 update 语句。不过,要真的实现在数据库中的更新,还要运行下面的语句:

>>> conn.commit()

当操作数据完毕后,不要忘记把打开的关掉:

>>> cur.close()
>>> conn.close()

写在之后

更多内容,欢迎关注公众号「Python空间」,期待和你的交流。
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/u013486414/article/details/85768722