Python全栈(三)数据库优化之5.MySQL自关联、外键与Python操作MySQL

一、自关联

引入:省市区三级联动数据
导入外部.sql文件的数据:
从SQLyog选择文件导入并执行SQL语句,导入了三张表(省、市、县区)的数据。
读者需要练习使用省市区数据执行脚本可以打开文末的网盘链接进行下载。

-查询湖南省
select * from provinces where province = '湖南省';

打印

+----+------------+-----------+
| id | provinceid | province  |
+----+------------+-----------+
| 18 |     430000 | 湖南省    |
+----+------------+-----------+
1 row in set (0.00 sec)
-查询湖南省下面的市
select * from cities where provinceid = 430000;

打印

+-----+--------+--------------------------------+------------+
| id  | cityid | city                           | provinceid |
+-----+--------+--------------------------------+------------+
| 186 | 430100 | 长沙市                         | 430000     |   
| 187 | 430200 | 株洲市                         | 430000     |   
| 188 | 430300 | 湘潭市                         | 430000     |   
| 189 | 430400 | 衡阳市                         | 430000     |   
| 190 | 430500 | 邵阳市                         | 430000     |   
| 191 | 430600 | 岳阳市                         | 430000     |   
| 192 | 430700 | 常德市                         | 430000     |   
| 193 | 430800 | 张家界市                       | 430000     |    
| 194 | 430900 | 益阳市                         | 430000     |   
| 195 | 431000 | 郴州市                         | 430000     |   
...         
+-----+--------+--------------------------------+------------+
14 rows in set, 5 warnings (0.00 sec)                         

嵌套子查询

select * from provinces as p inner join cities as c on p.provinceid = c.provinceid having p.province = '湖南省';

打印

+----+------------+-----------+-----+--------+--------------------------------+------------+   
| id | provinceid | province  | id  | cityid | city                           | provinceid |   
+----+------------+-----------+-----+--------+--------------------------------+------------+   
| 18 |     430000 | 湖南省    | 186 | 430100 | 长沙市                         | 430000     |         
| 18 |     430000 | 湖南省    | 187 | 430200 | 株洲市                         | 430000     |         
| 18 |     430000 | 湖南省    | 188 | 430300 | 湘潭市                         | 430000     |         
| 18 |     430000 | 湖南省    | 189 | 430400 | 衡阳市                         | 430000     |         
| 18 |     430000 | 湖南省    | 190 | 430500 | 邵阳市                         | 430000     |         
| 18 |     430000 | 湖南省    | 191 | 430600 | 岳阳市                         | 430000     |         
| 18 |     430000 | 湖南省    | 192 | 430700 | 常德市                         | 430000     |         
| 18 |     430000 | 湖南省    | 193 | 430800 | 张家界市                       | 430000     |          
| 18 |     430000 | 湖南省    | 194 | 430900 | 益阳市                         | 430000     |         
| 18 |     430000 | 湖南省    | 195 | 431000 | 郴州市                         | 430000     |         
...
+----+------------+-----------+-----+--------+--------------------------------+------------+   
14 rows in set, 170 warnings (0.00 sec)                                                        

查询areas一张表

-查询湖南省
select * from areas where name = '湖南';

打印

+----+-----+--------+------+
| id | pid | name   | type |
+----+-----+--------+------+
| 14 |   1 | 湖南   |    1 |
+----+-----+--------+------+
1 row in set (0.00 sec)
-查询湖南省下面的市
select * from areas where pid = 14;

打印

+-----+-----+-----------+------+
| id  | pid | name      | type |
+-----+-----+-----------+------+
| 197 |  14 | 长沙      |    2 |  
| 198 |  14 | 张家界    |    2 |   
| 199 |  14 | 常德      |    2 |  
| 200 |  14 | 郴州      |    2 |  
| 201 |  14 | 衡阳      |    2 |  
| 202 |  14 | 怀化      |    2 |  
| 203 |  14 | 娄底      |    2 |  
| 204 |  14 | 邵阳      |    2 |  
| 205 |  14 | 湘潭      |    2 |  
| 206 |  14 | 湘西      |    2 |  
...
+-----+-----+-----------+------+
14 rows in set (0.00 sec)       
-查询长沙 市下面的区
select * from areas where pid = 197;

打印

+------+-----+-----------+------+
| id   | pid | name      | type |
+------+-----+-----------+------+
| 1647 | 197 | 岳麓区    |    3 |
| 1648 | 197 | 芙蓉区    |    3 |
| 1649 | 197 | 天心区    |    3 |
| 1650 | 197 | 开福区    |    3 |
| 1651 | 197 | 雨花区    |    3 |
| 1652 | 197 | 开发区    |    3 |
| 1653 | 197 | 浏阳市    |    3 |
| 1654 | 197 | 长沙县    |    3 |
| 1655 | 197 | 望城县    |    3 |
| 1656 | 197 | 宁乡县    |    3 |
+------+-----+-----------+------+
10 rows in set (0.00 sec)

内连接查询

-查询湖南省下面的市
select * from areas as p inner join areas as c on p.id = c.pid having p.name = '湖南';

打印

+----+-----+--------+------+-----+-----+-----------+------+  
| id | pid | name   | type | id  | pid | name      | type |  
+----+-----+--------+------+-----+-----+-----------+------+  
| 14 |   1 | 湖南   |    1 | 197 |  14 | 长沙      |    2 |      
| 14 |   1 | 湖南   |    1 | 198 |  14 | 张家界    |    2 |       
| 14 |   1 | 湖南   |    1 | 199 |  14 | 常德      |    2 |      
| 14 |   1 | 湖南   |    1 | 200 |  14 | 郴州      |    2 |      
| 14 |   1 | 湖南   |    1 | 201 |  14 | 衡阳      |    2 |      
| 14 |   1 | 湖南   |    1 | 202 |  14 | 怀化      |    2 |      
| 14 |   1 | 湖南   |    1 | 203 |  14 | 娄底      |    2 |      
| 14 |   1 | 湖南   |    1 | 204 |  14 | 邵阳      |    2 |      
| 14 |   1 | 湖南   |    1 | 205 |  14 | 湘潭      |    2 |      
| 14 |   1 | 湖南   |    1 | 206 |  14 | 湘西      |    2 |      
...    
+----+-----+--------+------+-----+-----+-----------+------+  
14 rows in set (0.00 sec)                                    

此即自关联,同一个表关联查询。
自连结其实就是连结查询,需要两张表,只不过它的左表(主表)和右表(子表)都是自己。在做自连接查询的时候是自己链接自己,分别给主表和子表取别名,再附加条件执行。

-查询长沙市下面的区
select * from areas as c inner join areas as a on c.id = a.pid having c.name = '哈尔滨';

打印

+-----+-----+--------+------+------+-----+-----------+------+ 
| id  | pid | name   | type | id   | pid | name      | type | 
+-----+-----+--------+------+------+-----+-----------+------+ 
| 197 |  14 | 长沙   |    2 | 1647 | 197 | 岳麓区    |    3 |      
| 197 |  14 | 长沙   |    2 | 1648 | 197 | 芙蓉区    |    3 |      
| 197 |  14 | 长沙   |    2 | 1649 | 197 | 天心区    |    3 |      
| 197 |  14 | 长沙   |    2 | 1650 | 197 | 开福区    |    3 |      
| 197 |  14 | 长沙   |    2 | 1651 | 197 | 雨花区    |    3 |      
| 197 |  14 | 长沙   |    2 | 1652 | 197 | 开发区    |    3 |      
| 197 |  14 | 长沙   |    2 | 1653 | 197 | 浏阳市    |    3 |      
| 197 |  14 | 长沙   |    2 | 1654 | 197 | 长沙县    |    3 |      
| 197 |  14 | 长沙   |    2 | 1655 | 197 | 望城县    |    3 |      
| 197 |  14 | 长沙   |    2 | 1656 | 197 | 宁乡县    |    3 |      
+-----+-----+--------+------+------+-----+-----------+------+ 
10 rows in set (0.01 sec)                                     

二、外键

一个健壮的数据库一定有很好的参照完整性。为了保证数据的完整性,将两张表之间的数据建立关系,因此就需要在表中添加外键约束。
创建两张表:

create table classes(
    id int(4) not null primary key,
    name varchar(36)
);
create table student(
    sid int(4) not null primary key,
    sname varchar(36),
    gid int(4) not null
);

添加外键:
语法:alert table 表名 add constraint 外键名字 foreign key(外键字段名) references 外表表名(主键字段名);
对student表添加外键

alter table student add constraint fk_gid foreign key(gid) references classes(id);

打印

Query OK, 0 rows affected (0.01 sec)
Records: 0  Duplicates: 0  Warnings: 0

引入外键之后,外键列只能插入参照列存在的值,参照列被参照的值不能被删除,这就保证了数据的参照完整性。
验证外键的作用:

insert into student (sid, sname, gid) values(1, 'Tom', 1);

打印

ERROR 1452 (23000): Cannot add or update a child row: a foreign key constraint fails (`demo1125`.`student`, CONSTRAINT `fk_gid` FOREIGN KEY (`gid`) REFERENCES `classes` (`id`))

很显然插入失败,是外键限制,应该先在classes中插入一个班级,才能在学生中插入记录。

insert into classes values(1,'class1');

打印

Query OK, 1 row affected (0.01 sec)

此时再执行之前插入失败的语句

insert into student (sid, sname, gid) values(1, 'Tom', 1);

打印

Query OK, 1 row affected (0.00 sec)

即插入成功。
删除数据时,比如删除1班

delete from classes where id = 1;

打印

ERROR 1451 (23000): Cannot delete or update a parent row: a foreign key constraint fails (`demo1125`.`student`, CONSTRAINT `fk_gid` FOREIGN KEY (`gid`) REFERENCES `classes` (`id`))

即删除失败
要想删除班级,这里应该先删除班级为1的学生

delete from student where sid = 1;

打印

Query OK, 1 row affected (0.01 sec)

此时再执行之前删除失败的语句

delete from classes where id = 1;

打印

Query OK, 1 row affected (0.00 sec)

即删除成功。
在MySQL中,有4种针对存在外键的数据表进行操作时的设置:Cascade(级联)、No Action(不做操作)、Restrict(限制,默认)、Set null(设为空)。
删除外键约束:
alter table 表名 drop foreign key 外键名;
PS:有可能在加入外键约束后插入数据不会报错,这是因为MySQL安装时默认用的表引擎是MyISAM,而MyISAM是不支持外键的,如图,
引擎
要想解决这个问题,可以在当前的表设置引擎为InnoDB、PBXT或SolidDB,但这只是修改了这一个数据库,下次建新的数据库默认引擎还是MyISAM,我们可以在MySQL的安装目录下的配置文件my.ini中的 [mysqld] 下面加入default-storage-engine=INNODB(其他支持外键的引擎也可),再重启Mysql服务器即可,小编在这块也遇到了问题,很久都没能解决,最后请教老师成功解决了。
可参考https://www.cnblogs.com/lqcdsns/p/7858279.html

三、MySQL和Python交互

1.数据准备

创建数据库和数据表

--创建京东数据库
create database jingdong charset = utf8;

打印

Query OK, 1 row affected (0.00 sec)
--创建商品goods数据表
create table goods(
    id int unsigned primary key auto_increment not null,
    name varchar(150) not null,
    cate_name varchar(40) not null,
    brand_name varchar(40) not null,
    price decimal(10,3) not null default 0,
    is_show tinyint not null default 1,
    is_saleoff tinyint not null default 0
);

打印

Query OK, 0 rows affected (0.01 sec)

插入数据

-- 向goods表中插入数据
insert into goods values(0,'r510vc 15.6英寸笔记本','笔记本','华硕','3399',default,default); 
insert into goods values(0,'y400n 14.0英寸笔记本电脑','笔记本','联想','4999',default,default);
insert into goods values(0,'g150th 15.6英寸游戏本','游戏本','雷神','8499',default,default); 
insert into goods values(0,'x550cc 15.6英寸笔记本','笔记本','华硕','2799',default,default); 
insert into goods values(0,'x240 超极本','超级本','联想','4880',default,default); 
insert into goods values(0,'u330p 13.3英寸超极本','超级本','联想','4299',default,default); 
insert into goods values(0,'svp13226scb 触控超极本','超级本','索尼','7999',default,default); 
insert into goods values(0,'ipad mini 7.9英寸平板电脑','平板电脑','苹果','1998',default,default);
insert into goods values(0,'ipad air 9.7英寸平板电脑','平板电脑','苹果','3388',default,default); 
insert into goods values(0,'ipad mini 配备 retina 显示屏','平板电脑','苹果','2788',default,default); 
insert into goods values(0,'ideacentre c340 20英寸一体电脑 ','台式机','联想','3499',default,default); 
insert into goods values(0,'vostro 3800-r1206 台式电脑','台式机','戴尔','2899',default,default); 
insert into goods values(0,'imac me086ch/a 21.5英寸一体电脑','台式机','苹果','9188',default,default); 
insert into goods values(0,'at7-7414lp 台式电脑 linux )','台式机','宏碁','3699',default,default); 
insert into goods values(0,'z220sff f4f06pa工作站','服务器/工作站','惠普','4288',default,default); 
insert into goods values(0,'poweredge ii服务器','服务器/工作站','戴尔','5388',default,default); 
insert into goods values(0,'mac pro专业级台式电脑','服务器/工作站','苹果','28888',default,default); 
insert into goods values(0,'hmz-t3w 头戴显示设备','笔记本配件','索尼','6999',default,default); 
insert into goods values(0,'商务双肩背包','笔记本配件','索尼','99',default,default); 
insert into goods values(0,'x3250 m4机架式服务器','服务器/工作站','ibm','6888',default,default); 
insert into goods values(0,'商务双肩背包','笔记本配件','索尼','99',default,default);

打印

Query OK, 1 row affected (0.01 sec) 
                                    
Query OK, 1 row affected (0.00 sec) 
                                    
Query OK, 1 row affected (0.00 sec) 
                                    
Query OK, 1 row affected (0.00 sec) 
                                    
Query OK, 1 row affected (0.00 sec) 
                                    
Query OK, 1 row affected (0.00 sec) 
                                    
Query OK, 1 row affected (0.00 sec) 
                                    
Query OK, 1 row affected (0.00 sec) 
                                    
Query OK, 1 row affected (0.00 sec) 
                                    
Query OK, 1 row affected (0.00 sec) 
                                    
Query OK, 1 row affected (0.00 sec) 
                                    
Query OK, 1 row affected (0.00 sec) 
                                    
Query OK, 1 row affected (0.00 sec) 
                                    
Query OK, 1 row affected (0.00 sec) 
                                    
Query OK, 1 row affected (0.00 sec) 
                                    
Query OK, 1 row affected (0.00 sec) 
                                    
Query OK, 1 row affected (0.00 sec) 
                                    
Query OK, 1 row affected (0.00 sec) 
                                    
Query OK, 1 row affected (0.00 sec) 
                                    
Query OK, 1 row affected (0.00 sec) 
                                    
Query OK, 1 row affected (0.00 sec) 

数据表大致如下

+----+---------------------------------------+---------------------+------------+-----------+---------+-----
+                                                                                                           
| id | name                                  | cate_name           | brand_name | price     | is_show | is_s
|                                                                                                           
+----+---------------------------------------+---------------------+------------+-----------+---------+-----
+                                                                                                           
|  1 | r510vc 15.6英寸笔记本                 | 笔记本              | 华硕       |  3399.000 |       1 |          0    
|                                                                                                           
|  2 | y400n 14.0英寸笔记本电脑              | 笔记本              | 联想       |  4999.000 |       1 |          0      
|                                                                                                           
|  3 | g150th 15.6英寸游戏本                 | 游戏本              | 雷神       |  8499.000 |       1 |          0    
|                                                                                                           
|  4 | x550cc 15.6英寸笔记本                 | 笔记本              | 华硕       |  2799.000 |       1 |          0    
|                                                                                                           
|  5 | x240 超极本                           | 超级本              | 联想       |  4880.000 |       1 |          0  
|                                                                                                           
|  6 | u330p 13.3英寸超极本                  | 超级本              | 联想       |  4299.000 |       1 |          0    
|                                                                                                           
|  7 | svp13226scb 触控超极本                | 超级本              | 索尼       |  7999.000 |       1 |          0    
|                                                                                                           
|  8 | ipad mini 7.9英寸平板电脑             | 平板电脑            | 苹果       |  1998.000 |       1 |          0      
|                                                                                                           
|  9 | ipad air 9.7英寸平板电脑              | 平板电脑            | 苹果       |  3388.000 |       1 |          0      
|                                                                                                           
| 10 | ipad mini 配备 retina 显示屏          | 平板电脑            | 苹果       |  2788.000 |       1 |          0     
...                                                                                                 
+----+---------------------------------------+---------------------+------------+-----------+---------+-----
+                                                                                                           
21 rows in set (0.00 sec)                                                                                   
                                                                                                            

2.数据表拆分

数据表拆分是一种思想,将大表拆分成很多小表,可以增加复用、提高效率。

创建 “商品分类” 表

--创建种类表
create table goods_cates(
    id int unsigned primary key auto_increment not null,
    name varchar(40) not null
);

打印

Query OK, 0 rows affected (0.01 sec)
--将种类插入种类表
insert into goods_cates (name) select cate_name from goods group by cate_name;

打印

Query OK, 7 rows affected (0.01 sec)
Records: 7  Duplicates: 0  Warnings: 0

将查询的数据插入新表不需要values字段,否则会报错。

--修改goods表
update goods as g inner join goods_cates as c on g.cate_name = c.name set g.cate_name = c.id;
select * from goods;

打印

Query OK, 0 rows affected (0.01 sec)
Rows matched: 21  Changed: 0  Warnings: 0

此时,goods表为

+----+---------------------------------------+-----------+------------+-----------+---------+------------+ 
| id | name                                  | cate_name | brand_name | price     | is_show | is_saleoff | 
+----+---------------------------------------+-----------+------------+-----------+---------+------------+ 
|  1 | r510vc 15.6英寸笔记本                 | 5         | 华硕       |  3399.000 |       1 |          0 |        
|  2 | y400n 14.0英寸笔记本电脑              | 5         | 联想       |  4999.000 |       1 |          0 |          
|  3 | g150th 15.6英寸游戏本                 | 4         | 雷神       |  8499.000 |       1 |          0 |        
|  4 | x550cc 15.6英寸笔记本                 | 5         | 华硕       |  2799.000 |       1 |          0 |        
|  5 | x240 超极本                           | 7         | 联想       |  4880.000 |       1 |          0 |      
|  6 | u330p 13.3英寸超极本                  | 7         | 联想       |  4299.000 |       1 |          0 |        
|  7 | svp13226scb 触控超极本                | 7         | 索尼       |  7999.000 |       1 |          0 |        
|  8 | ipad mini 7.9英寸平板电脑             | 2         | 苹果       |  1998.000 |       1 |          0 |         
|  9 | ipad air 9.7英寸平板电脑              | 2         | 苹果       |  3388.000 |       1 |          0 |         
| 10 | ipad mini 配备 retina 显示屏          | 2         | 苹果       |  2788.000 |       1 |          0 |        
...
+----+---------------------------------------+-----------+------------+-----------+---------+------------+ 
21 rows in set (0.00 sec)                                                                                  

3.Python操作MySQL

Python-MySQL安装

在Windows操作系统上安装:
Python3:pip install pymysql
Python2:pip install MySQLdb
Linux(Ubuntu)安装:https://www.jianshu.com/p/d84cdb5e6273

操作步骤

  • 开始
  • 创建connection
  • 获取cursor
  • 执行查询、执行命令、获取数据、处理数据
  • 关闭cursor
  • 关闭connection
  • 结束

和文件操作类似。
如图
在这里插入图片描述
(1)Connection 对象
用于建立与数据库的连接
创建对象:调用connect() 方法。

conn=connect(参数列表)
参数host:连接的mysql主机,如果本机是'localhost'
参数port:连接的mysql主机的端口,默认是3306
参数database:数据库的名称
参数user:连接的用户名
参数password:连接的密码
参数charset:通信采用的编码方式,推荐使用utf8

根据导入库的方式,具体可分为两种连接方式
方式一

import pymysql
con = pymysql.connect(host = 'localhost',port=3306,database='jingdong',user='root',password = 'root',charset = 'utf8')

方式二

from pymysql import *
conn = connect(host = 'localhost',port=3306,database='jingdong',user='root',password = 'root',charset = 'utf8')

对象的方法:

  • commit()提交;
  • cursor()返回Cursor对象,用于执行sql语句并获得结果;
  • close()关闭连接。

(2)Cursor对象
用于执行sql语句,经常使用的语句为select、insert、update、delete
获取Cursor对象:调用Connection对象的cursor()方法。

cur = conn.cursor()

对象的方法

  • execute(operation [, parameters ])执行语句,返回受影响的行数,主要用于执行insert、update、delete语句,也可以执行create、alter、drop等语句;
  • fetchone()执行查询语句时,获取查询结果集的第一个行数据,返回一个元组;
  • fetchmany(n)执行查询语句时,获取查询结果集的n行数据,一行构成一个元组,再将这些元组装入一个元组返回;
  • fetchall()执行查询时,获取结果集的所有行,一行构成一个元组,再将这些元组装入一个元组返回;
  • close()关闭 先关闭游标,在关闭链接。

使用python连接数据库并代码实现查询数据库中的数据示例:

from pymysql import *

#连接数据库
conn = connect(host='127.0.0.1',port=3306,db='jingdong',user='root',passwd='root',charset='utf8')

#获取游标对象
cur = conn.cursor()

#执行SQL语句,获取查询结果的记录数
r = cur.execute('select * from goods;')
print(r)

#得到数据
#获取一条数据
print(cur.fetchone())
print(cur.fetchone())
print(cur.fetchone())
#获取多条数据
print(cur.fetchmany(3))
#获取全部数据,是指游标之后的全部,而不一定是整个表的所有数据
print(cur.fetchall())
print(cur.fetchone())

#关闭游标对象
cur.close()

#关闭连接
conn.close()

打印结果为

21
(1, 'r510vc 15.6英寸笔记本', '5', '华硕', Decimal('3399.000'), 1, 0)
(2, 'y400n 14.0英寸笔记本电脑', '5', '联想', Decimal('4999.000'), 1, 0)
(3, 'g150th 15.6英寸游戏本', '4', '雷神', Decimal('8499.000'), 1, 0)
((4, 'x550cc 15.6英寸笔记本', '5', '华硕', Decimal('2799.000'), 1, 0), (5, 'x240 超极本', '7', '联想', Decimal('4880.000'), 1, 0), (6, 'u330p 13.3英寸超极本', '7', '联想', Decimal('4299.000'), 1, 0))
((7, 'svp13226scb 触控超极本', '7', '索尼', Decimal('7999.000'), 1, 0), (8, 'ipad mini 7.9英寸平板电脑', '2', '苹果', Decimal('1998.000'), 1, 0), (9, 'ipad air 9.7英寸平板电脑', '2', '苹果', Decimal('3388.000'), 1, 0), (10, 'ipad mini 配备 retina 显示屏', '2', '苹果', Decimal('2788.000'), 1, 0), (11, 'ideacentre c340 20英寸一体电脑 ', '1', '联想', Decimal('3499.000'), 1, 0), (12, 'vostro 3800-r1206 台式电脑', '1', '戴尔', Decimal('2899.000'), 1, 0), (13, 'imac me086ch/a 21.5英寸一体电脑', '1', '苹果', Decimal('9188.000'), 1, 0), (14, 'at7-7414lp 台式电脑 linux )', '1', '宏碁', Decimal('3699.000'), 1, 0), (15, 'z220sff f4f06pa工作站', '3', '惠普', Decimal('4288.000'), 1, 0), (16, 'poweredge ii服务器', '3', '戴尔', Decimal('5388.000'), 1, 0), (17, 'mac pro专业级台式电脑', '3', '苹果', Decimal('28888.000'), 1, 0), (18, 'hmz-t3w 头戴显示设备', '6', '索尼', Decimal('6999.000'), 1, 0), (19, '商务双肩背包', '6', '索尼', Decimal('99.000'), 1, 0), (20, 'x3250 m4机架式服务器', '3', 'ibm', Decimal('6888.000'), 1, 0), (21, '商务双肩背包', '6', '索尼', Decimal('99.000'), 1, 0))
None

在执行cur.fetchall()后游标到数据最后位置,已查询完毕,此时再cur.fetchone()会返回None,要想再次查询再执行一次r = cur.execute('select * from goods;')即可。
在查询完毕后,要先关闭游标,再关闭连接。
在连接数据库时,一般要异常处理,如上边代码可修改为

from pymysql import *

try:
    #连接数据库
    conn = connect(host='127.0.0.1',port=3306,db='jingdong',user='root',passwd='root',charset='utf8')

    #获取游标对象
    cur = conn.cursor()

    #执行SQL语句,获取查询结果的记录数
    r = cur.execute('select * from goods;')
    print(r)

    #得到数据
    #获取一条数据
    print(cur.fetchone())
    print(cur.fetchone())
    print(cur.fetchone())
    #获取多条数据
    print(cur.fetchmany(3))
    #获取全部数据,是指游标之后的全部,而不一定是整个表的所有数据
    print(cur.fetchall())
    print(cur.fetchone())

    #关闭游标对象
    cur.close()

    #关闭连接
    conn.close()

except Exception as e:
    print("Error %d:%s"%(e.args[0],e.args[1]))

查询结果与之前相同。
省市区数据脚本链接:
https://pan.baidu.com/s/1IkODeq4N_drQYWiysUuKjA
提取码: p39a。
小编那么拼,赞一个再撤!
公众号二维码
大家也可以关注我的公众号:Python极客社区,在我的公众号里,经常会分享很多Python的文章,而且也分享了很多工具、学习资源等。另外回复“电子书”还可以获取十本我精心收集的Python电子书。

发布了51 篇原创文章 · 获赞 184 · 访问量 3万+

猜你喜欢

转载自blog.csdn.net/CUFEECR/article/details/103426964
今日推荐