跟老齐学Python之使用Python操作数据库(1)


Posted in Python onNovember 25, 2014

在上一讲中已经连接了数据库。就数据库而言,连接之后就要对其操作。但是,目前那个名字叫做qiwsirtest的数据仅仅是空架子,没有什么可操作的,要操作它,就必须在里面建立“表”,什么是数据库的表呢?下面摘抄字维基百科对数据库表的简要解释,要想详细了解,需要看官在找一些有关数据库的教程和书籍来看看。

在关系数据库中,数据库表是一系列二维数组的集合,用来代表和储存数据对象之间的关系。它由纵向的列和横向的行组成,例如一个有关作者信息的名为 authors 的表中,每个列包含的是所有作者的某个特定类型的信息,比如“姓氏”,而每行则包含了某个特定作者的所有信息:姓、名、住址等等。
对于特定的数据库表,列的数目一般事先固定,各列之间可以由列名来识别。而行的数目可以随时、动态变化,每行通常都可以根据某个(或某几个)列中的数据来识别,称为候选键。
我打算在qiwsirtest中建立一个存储用户名、用户密码、用户邮箱的表,其结构用二维表格表现如下:

username password email
qiwsir 123123 qiwsir@gmail.com

特别说明,这里为了简化细节,突出重点,对密码不加密,直接明文保存,虽然这种方式是很不安全的。但是,有不少网站还都这么做的,这么做的目的是比较可恶的。就让我在这里,仅仅在这里可恶一次。

建数据库表并插入数据

为了在数据库中建立这个表,需要进入到mysql>交互模式中操作。道理在于,如果qiwsirtest这个屋子里面没有类似家具的各种数据库表,即使进了屋子也没有什么好操作的东西,因此需要先到mysql>模式下在屋子里面摆家具。

进入数据库交互模式:

qw@qw-Latitude-E4300:~$ mysql -u root -p

Enter password:

调用已经建立的数据库:qiwsirtest

mysql> use qiwsirtest;

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

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

mysql> show tables;

+----------------------+

| Tables_in_qiwsirtest |

+----------------------+

| users                |

+----------------------+

1 row in set (0.00 sec)

查询显示,在qiwsirtest这个数据库中,已经有一个表,它的名字是:users。

mysql> desc users;

+----------+-------------+------+-----+---------+----------------+

| Field    | Type        | Null | Key | Default | Extra          |

+----------+-------------+------+-----+---------+----------------+

| id       | int(2)      | NO   | PRI | NULL    | auto_increment |

| username | varchar(40) | YES  |     | NULL    |                |

| password | text        | YES  |     | NULL    |                |

| email    | text        | YES  |     | NULL    |                |

+----------+-------------+------+-----+---------+----------------+

4 rows in set (0.00 sec)

显示表users的结构:

id:每增加一个用户,id号自动增加一个。
username:存储用户名,类型是varchar(40)
password:存储用户密码,类型是text
email:存储用户的邮箱,类型是text
特别提醒:在这里,我没有对每个字段做注入不得为空等设置,在真正的开发中,或许必须让username和password不得为空。

这个结构和上面所期望的结构是一样的,只不过这个表中还没有任何数据,是一个空表。可以查询一下看看:

mysql> select * from users;

Empty set (0.01 sec)

目前表是空的,为了能够在后面用python操作这个数据表,需要向里面插入点信息,就只插入一条吧。

mysql> insert into users(username,password,email) values("qiwsir","123123","qiwsir@gmail.com");

Query OK, 1 row affected (0.05 sec)
mysql> select * from users;

+----+----------+----------+------------------+

| id | username | password | email            |

+----+----------+----------+------------------+

|  1 | qiwsir   | 123123   | qiwsir@gmail.com |

+----+----------+----------+------------------+

1 row in set (0.00 sec)

到目前为止,在mysql>中的工作已经完成了,接下来就是用python操作了。

python操作数据库

要对数据库进行操作,需要先连接它。上一讲看官连接过了,但是,随后你关闭了python的交互模式,所以还要从新连接。这也是交互模式的缺点。不过在这里操作直观,所以暂且忍受一下,后面就会讲解如何在程序中自动完成了。

>>> import MySQLdb

>>> conn = MySQLdb.connect(host="localhost",user="root",passwd="123123",db="qiwsirtest",charset="utf8")

完成连接的过程,其实是建立了一个MySQLdb.connect()的实例对象conn,那么这个对象有哪些属性呢?

commit():如果数据库表进行了修改,提交保存当前的数据。当然,如果此用户没有权限就作罢了,什么也不会发生。
rollback():如果有权限,就取消当前的操作,否则报错。
cursor([cursorclass]):游标指针。下面详解。
连接成功之后,开始操作。注意:MySQLdb用游标(指针)cursor的方式操作数据库,就是这样:

>>> cur = conn.cursor()

因该模块底层其实是调用CAPI的,所以,需要先得到当前指向数据库的指针。这也就提醒我们,在操作数据库的时候,指针会移动,如果移动到数据库最后一条了,再查,就查不出什么来了。看后面的例子就明白了。

下面用cursor()提供的方法来进行操作,方法主要是:

执行命令
接收结果

cursor执行命令的方法:

execute(query, args):执行单条sql语句。query为sql语句本身,args为参数值的列表。执行后返回值为受影响的行数。
executemany(query, args):执行单条sql语句,但是重复执行参数列表里的参数,返回值为受影响的行数
例如,要在数据表users中插入一条记录,使得:username="python",password="123456",email="python@gmail.com",这样做:

>>> cur.execute("insert into users (username,password,email) values (%s,%s,%s)",("python","123456","python@gmail.com"))

1L

没有报错,并且返回一个"1L"结果,说明有一行记录操作成功。不妨用"mysql>"交互方式查看一下:

mysql> select * from users;

+----+----------+----------+------------------+

| id | username | password | email            |

+----+----------+----------+------------------+

|  1 | qiwsir   | 123123   | qiwsir@gmail.com |

+----+----------+----------+------------------+

1 row in set (0.00 sec)

咦,奇怪呀。怎么没有看到增加的那一条呢?哪里错了?可是上面也没有报错呀。

在这里,特别请列位看官注意,通过"cur.execute()"对数据库进行操作之后,没有报错,完全正确,但是不等于数据就已经提交到数据库中了,还必须要用到"MySQLdb.connect"的一个属性:commit(),将数据提交上去,也就是进行了"cur.execute()"操作,要将数据提交,必须执行:

>>> conn.commit()

在到"mysql>"中运行"select * from users"试一试:

mysql> select * from users;

+----+----------+----------+------------------+

| id | username | password | email            |

+----+----------+----------+------------------+

|  1 | qiwsir   | 123123   | qiwsir@gmail.com |

|  2 | python   | 123456   | python@gmail.com |

+----+----------+----------+------------------+

2 rows in set (0.00 sec)

good,very good。果然如此。这就如同编写一个文本一样,将文字写到文本上,并不等于文字已经保留在文本文件中了,必须执行"CTRL-S"才能保存。也就是在通过python操作数据库的时候,以"execute()"执行各种sql语句之后,要让已经执行的效果保存,必须运行"commit()",还要提醒,这个属性是"MySQLdb.connect()"实例的。

再尝试一下插入多条的那个命令"executemany(query,args)".

>>> cur.executemany("insert into users (username,password,email) values (%s,%s,%s)",(("google","111222","g@gmail.com"),("facebook","222333","f@face.book"),("github","333444","git@hub.com"),("docker","444555","doc@ker.com")))

4L

>>> conn.commit()

到"mysql>"里面看结果:

mysql> select * from users;

+----+----------+----------+------------------+

| id | username | password | email            |

+----+----------+----------+------------------+

|  1 | qiwsir   | 123123   | qiwsir@gmail.com |

|  2 | python   | 123456   | python@gmail.com |

|  3 | google   | 111222   | g@gmail.com      |

|  4 | facebook | 222333   | f@face.book      |

|  5 | github   | 333444   | git@hub.com      |

|  6 | docker   | 444555   | doc@ker.com      |

+----+----------+----------+------------------+

6 rows in set (0.00 sec)

成功插入了多条记录。特别请列位注意的是,在"executemany(query,args)"中,query还是一条sql语句,但是args这时候是一个tuple,这个tuple里面的元素也是tuple,每个tuple分别对应sql语句中的字段列表。这句话其实被执行多次。只不过执行过程不显示给我们看罢了。

已经会插入了,然后就可以有更多动作。且看下一讲吧。

Python 相关文章推荐
Python聚类算法之基本K均值实例详解
Nov 20 Python
python实现中文转换url编码的方法
Jun 14 Python
详解Python中的Numpy、SciPy、MatPlotLib安装与配置
Nov 17 Python
Python实现的多进程和多线程功能示例
May 29 Python
python实现爬取图书封面
Jul 05 Python
python三大神器之fabric使用教程
Jun 10 Python
PyCharm更改字体和界面样式的方法步骤
Sep 27 Python
python 求10个数的平均数实例
Dec 16 Python
python时间与Unix时间戳相互转换方法详解
Feb 13 Python
keras 自定义loss model.add_loss的使用详解
Jun 22 Python
python如何提升爬虫效率
Sep 27 Python
如何用python插入独创性声明
Mar 31 Python
Python标准库os.path包、glob包使用实例
Nov 25 #Python
PHP魔术方法__ISSET、__UNSET使用实例
Nov 25 #Python
Python标准库之多进程(multiprocessing包)介绍
Nov 25 #Python
Python标准库之随机数 (math包、random包)介绍
Nov 25 #Python
Python标准库之循环器(itertools)介绍
Nov 25 #Python
Python标准库之sqlite3使用实例
Nov 25 #Python
Python标准库内置函数complex介绍
Nov 25 #Python
You might like
PHP更新购物车数量(表单部分/PHP处理部分)
2013/05/03 PHP
eAccelerator的安装与使用详解
2013/06/13 PHP
用Javascript实现Windows任务管理器的代码
2012/03/27 Javascript
jQuery 瀑布流 绝对定位布局(二)(延迟AJAX加载图片)
2012/05/23 Javascript
jQuery 选择器项目实例分析及实现代码
2012/12/28 Javascript
简单的Jquery遮罩层代码实例
2013/11/14 Javascript
jQuery的deferred对象详解
2014/11/12 Javascript
javascript控制台详解
2015/06/25 Javascript
微信小程序 实现拖拽事件监听实例详解
2016/11/16 Javascript
利用JQuery阻止事件冒泡
2016/12/01 Javascript
Extjs表单输入框异步校验的插件实现方法
2017/03/20 Javascript
vue axios基于常见业务场景的二次封装的实现
2018/09/21 Javascript
vue+axios实现文件下载及vue中使用axios的实例
2018/09/21 Javascript
vue项目中实现图片预览的公用组件功能
2018/10/26 Javascript
vue实现编辑器键盘抬起时内容跟随光标距顶位置向上滚动效果
2020/05/28 Javascript
vue 解决兄弟组件、跨组件深层次的通信操作
2020/07/27 Javascript
[07:59]2014DOTA2叨叨刀塔 林熊猫称被邀请赛现场盛况震撼
2014/07/21 DOTA
[05:40]DOTA2荣耀之路6:Wings最后进攻
2018/05/30 DOTA
详解python时间模块中的datetime模块
2016/01/13 Python
Python入门_浅谈逻辑判断与运算符
2017/05/16 Python
Scrapy爬虫实例讲解_校花网
2017/10/23 Python
详解Django-channels 实现WebSocket实例
2019/08/22 Python
Python enumerate函数遍历数据对象组合过程解析
2019/12/11 Python
Django微信小程序后台开发教程的实现
2020/06/03 Python
Pycharm中配置远程Docker运行环境的教程图解
2020/06/11 Python
在Keras中CNN联合LSTM进行分类实例
2020/06/29 Python
商场端午节活动方案
2014/01/29 职场文书
交通安全责任书范本
2014/07/24 职场文书
工作散漫检讨书
2014/09/16 职场文书
酒店辞职书范文
2015/02/26 职场文书
乡镇党建工作总结2015
2015/05/19 职场文书
同学聚会感言一句话
2015/07/30 职场文书
解决python绘图使用subplots出现标题重叠的问题
2021/04/30 Python
详细介绍python类及类的用法
2021/05/31 Python
mysql 8.0.27 绿色解压版安装教程及配置方法
2022/04/20 MySQL
解决ubuntu安装软件时,status-code=409报错的问题
2022/12/24 Servers