利用python解决mysql视图导入导出依赖的问题


Posted in Python onDecember 17, 2017

视图

视图是一个虚拟表(非真实存在),其本质是根据SQL语句获取动态的数据集,并为其命名,用户使用时只需使用名称即可获取结果集,并可以将其当作表来使用。

创建视图

创建一个名称为v1的视图,其功能就是查询color表中的所有数据

CREATE VIEW v1 AS SELECT * FROM color;

查看视图

使用视图时,将其当作表进行操作即可,由于视图是虚拟表,所以无法使用其对真实表进行创建、更新和删除操作,仅能做查询用。

select * from v1; -- 等于执行SELECT * FROM color

输出结果

+-----+--------+
| nid | title |
+-----+--------+
| 1 | red |
| 2 | yellow |
+-----+--------+
2 rows in set (0.00 sec)

修改视图

ALTER VIEW v1 AS SELECT * FROM color WHERE nid = 1;

删除视图

DROP VIEW v1;

引用

navicat是mysql可视化工具中最棒的,但是,在处理视图的导入导出方面,它是按照视图名称的字母顺序来处理的,若视图存在依赖,在导入过程中就会报错。这个问题一直困绕我,一度因为我使用docker来部署mysql而绕过了这个问题。最近不得不直面这个问题,因此,写了一个小工具来解决它。

整体思路

在mysql很容易查出所有视图和其定义,因此可以写一个视图导出工具,存储时对各视图的保存位置进行调整,处理好它们之间的依赖关系,被依赖的放前面,这样就解决了导入时的依赖问题。

获取视图信息

运行以下查询语句,就能获得该数据库中所有视图的信息。

select * from information_schema.VIEWS where TABLE_SCHEMA = DatabaseName

查询结果字段说明:

  • TABLE_NAME : 数所库中视图名称
  • VIEW_DEFINITION : 视图的定义代码,只有查询语句部分
  • DEFINER : 视图定义(建立)者名称
  • SECURITY : 安全级别

总之,所有视图的信息都在这个表中保存,我要完成任务,只需要TABLE_NAME和VIEW_DEFINITION就可以了。

算法描述

  • 将查询结果放到dict中,视图名称为key;视图定义为value;
  • 编写处理依赖关系的函数process_rely,输入参数中的rely_old为保存所有视图名称的数组;返回参数为按依赖关系调整顺序后的视图名称数组。之所以这样做,是一开始考虑到,依赖关系复杂时,可能一次迭代处理不好,需要递归调用或多次调用。

process_rely函数算法描述:

    第一层循环,从rely_old中取一个视图名称

        第二层循环,从dict中取出一个键值

            若键值被第一层元素的定义所依赖

                若键值还不在结果数组中

                    若第一层元素不在结果数组中

                        追加键值到结果数组中

                    第一层元素在结果数组中

                        将键值插入到第一层元素前

                键值在结果数组中

                    第一层元素在结果数组中

                        查找各自在结果数组中的位置

                        若第一层元素在键值的后

                            将键值移动到第一层元素前

        第二层循环结束时,若第一层元素还不在结果集中

            将第一层元素追加到结果集中

    返回结果集

上面的说明,是按python代码模式给出的。很幸运,算法一次就能将复杂的依赖关系处理好了。我在编写的过程中,刚开始依赖算法不完善时,通过多次迭代也能处理好复杂的依赖关系。因此,坚定了必胜的信心,完成了这个任务。

完整代码

import pymysql
conn = pymysql.connect(host='172.17.0.1', port=3306, user='root',
      passwd='123456', db='database', charset='utf8mb4')
def process_rely(parmas={}, rely_old=[]):
 _rely = []
 _keys = list(parmas.keys())
 for k in rely_old:
  for bl in _keys:
   if str(parmas[k]).find(bl) > -1:
    if bl not in _rely:
     if k not in _rely:
      _rely.append(bl)
     else:
      i = _rely.index(k)
      _rely.insert(i, bl)
    else:
     if k in _rely:
      i = _rely.index(k)
      j = _rely.index(bl)
      if i < j:
       del _rely[j]
       _rely.insert(i, bl)
  if k not in _rely:
   _rely.append(k)
 return _rely
cur = conn.cursor()
cur.execute('select TABLE_NAME, VIEW_DEFINITION from information_schema.VIEWS where TABLE_SCHEMA = %s ', 'database')
rs = cur.fetchall()
cur.close()
conn.close()
ps = {}
for al in rs:
 ps['`' + al[0] + '`'] = al[1]
rely = process_rely(ps, list(ps.keys()))
# rely = process_rely(ps, rely1)
file_object = open('view.sql', 'w')
for al in rely:
 file_object.write('DROP VIEW IF EXISTS ' + al + ';\n')
 file_object.write('CREATE ALGORITHM=UNDEFINED DEFINER=`root`@`%` SQL SECURITY DEFINER VIEW ' + al +
      ' AS ' + ps[al] + ';\n\n')
file_object.close()

小结

思路要清晰,代码要一步步的向最终目标靠近,积跬步以至千里。在做这个工具时,一开始觉得很麻烦,依赖关系若是深层次的,可能一次处理不好,正因为采用的迭代的思想,最后才完成了一次迭代解决问题的完美结局。

好了,以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对三水点靠木的支持。

Python 相关文章推荐
零基础写python爬虫之urllib2中的两个重要概念:Openers和Handlers
Nov 05 Python
使用C语言来扩展Python程序和Zope服务器的教程
Apr 14 Python
Python文件右键找不到IDLE打开项解决办法
Jun 08 Python
Python打包可执行文件的方法详解
Sep 19 Python
Python3如何解决字符编码问题详解
Apr 23 Python
Python实现PS滤镜的万花筒效果示例
Jan 23 Python
Python lambda函数基本用法实例分析
Mar 16 Python
python实现超简单的视频对象提取功能
Jun 04 Python
python3使用flask编写注册post接口的方法
Dec 28 Python
Python面向对象程序设计示例小结
Jan 30 Python
python3模拟实现xshell远程执行liunx命令的方法
Jul 12 Python
python爬虫项目设置一个中断重连的程序的实现
Jul 26 Python
python 3.5实现检测路由器流量并写入txt的方法实例
Dec 17 #Python
python中闭包Closure函数作为返回值的方法示例
Dec 17 #Python
django模板语法学习之include示例详解
Dec 17 #Python
详解python string类型 bytes类型 bytearray类型
Dec 16 #Python
python使用os.listdir和os.walk获得文件的路径的方法
Dec 16 #Python
python读取与写入csv格式文件的示例代码
Dec 16 #Python
浅谈用VSCode写python的正确姿势
Dec 16 #Python
You might like
《OVERLORD》手游英文版即将上线 手机上也能扮演骨王
2020/04/09 日漫
php中get_headers函数的作用及用法的详细介绍
2013/04/27 PHP
Thinkphp使用mongodb数据库实现多条件查询方法
2014/06/26 PHP
php实现建立多层级目录的方法
2014/07/19 PHP
PHP自带函数给数字或字符串自动补齐位数
2014/07/29 PHP
PHP中UNIX时间戳和日期间的转换与计算实例
2014/11/19 PHP
让ie6也支持websocket采用flash封装实现
2013/02/18 Javascript
浅析javascript的return语句
2015/12/15 Javascript
Vue学习之路之登录注册实例代码
2017/07/06 Javascript
原生JS上传大文件显示进度条 php上传文件代码
2020/03/27 Javascript
axios取消请求的实践记录分享
2018/09/26 Javascript
VUE+Element UI实现简单的表格行内编辑效果的示例的代码
2018/10/31 Javascript
[52:31]VP vs Serenity 2018国际邀请赛小组赛BO2 第二场 8.16
2018/08/17 DOTA
在GitHub Pages上使用Pelican搭建博客的教程
2015/04/25 Python
python操作mongodb根据_id查询数据的实现方法
2015/05/20 Python
python编程测试电脑开启最大线程数实例代码
2018/02/09 Python
Python多线程原理与用法实例剖析
2019/01/22 Python
OpenCV+Python识别车牌和字符分割的实现
2019/01/31 Python
详解将Pandas中的DataFrame类型转换成Numpy中array类型的三种方法
2019/07/06 Python
python matplotlib饼状图参数及用法解析
2019/11/04 Python
在OpenCV里使用Camshift算法的实现
2019/11/22 Python
python dataframe NaN处理方式
2019/12/26 Python
Python3 Click模块的使用方法详解
2020/02/12 Python
python字典的值可以修改吗
2020/06/29 Python
html5 乒乓球(碰撞检测)实例二
2013/07/25 HTML / CSS
VELTRA台湾:世界自由行专家
2017/08/15 全球购物
理肤泉美国官网:La Roche-Posay
2018/01/17 全球购物
切尔西足球俱乐部官方网上商店:Chelsea FC
2019/06/17 全球购物
巴西本土电商平台:Americanas
2020/06/21 全球购物
小学端午节活动方案
2014/03/13 职场文书
党政领导班子民主生活会整改措施
2014/09/18 职场文书
交警正风肃纪剖析材料
2014/10/29 职场文书
2015年技术工作总结范文
2015/04/20 职场文书
Python基础之条件语句详解
2021/06/16 Python
Python Flask搭建yolov3目标检测系统详解流程
2021/11/07 Python
Windows Server 2012 R2 磁盘分区教程
2022/04/29 Servers