1.背景:

最近公司项目的用户中心模块经常出现线上问题,测试人员需要将线上真实数据导入到测试环境中去复现Bug。公司有3套测试环境,来回切换并校验数据比较麻烦,于是就有了如下的数据库同步神器。

2.界面:

3.源代码:

# -*- coding: utf-8 -*-
"""
@date:  2022/01/16 22:00
@author: Anker
@python:v3.6
"""
import json
import tkinter as tk
import tkinter.filedialog
import tkinter.messagebox
import pymysql as pymysql
from tkinter import END
from pymysql.cursors import DictCursor# 线上数据库
online_connect = "erdshggadkjhg2wrtyuic.sfgh.aliyuncs.com"
online_user = "Anker"
online_password = "123456"
online_port = "3306"
online_db_name = "user_center"
online_table = "uuc_business_user"# 测试数据库
test_connect = "bm-cp134dfhdh5e7uho.mysql.rds.aliyuncs.com"
test_user = "root"
test_port = "3306"
test_password = "Vr9ybte9hQJMghjkljh"
test_table = "uuc_business_user"# 创建一个窗口
window = tk.Tk()
window.title("数据库同步工具")
window.geometry('600x600')# 将new_user_data变量初始化
new_user_data = Nonedef data_synchronization():# 定义一个全局变量new_user_dataglobal new_user_data# 每次触发操作之前,清空多行文本框的内容text.delete("1.0", "end")# 定义两个变量name和phone,用来获取用户在文本框输入的内容name = entry1.get()phone = entry2.get()# 连接线上数据库数据库conn_online_sql = pymysql.connect(host=online_connect, user=online_user, cursorclass=DictCursor,password=online_password, database=online_db_name)curs_online = conn_online_sql.cursor()# 通过字典去读取不同的测试环境db_config = radio.get()config = {"0": "0", "test1环境": "user_center_ding", "test2环境": "user_center_ding_test2", "test3环境": "test3"}test_db_name = config[db_config]try:if not (entry1.get() and entry2.get()):tk.messagebox.showinfo(title="提示", message="用户姓名、用户手机为必填项!")elif radio.get() == "0":tk.messagebox.showinfo(title="提示", message="请选择数据库")elif radio.get() == "test3环境":tk.messagebox.showinfo(title="提示", message="目前没有该测试数据库")else:# 连接测试数据库数据库"conn_test2_sql = pymysql.connect(host=test_connect, user=test_user, password=test_password,database=test_db_name)curs2 = conn_test2_sql.cursor()# 读取线上数据库的用户信息read_online_sql = f'''select * from `{online_db_name}`.`{online_table}` where name = "{name}" and phone = "{phone}" '''# 读取测试数据库的用户信息read_test2_sql = f'''select * from `{test_db_name}`.`{test_table}` where name = "{name}" and phone = "{phone}" '''# 执行sql查询,查询线上数据库,将查询出来的结果保存在online_user_data中curs_online.execute(read_online_sql)online_user_data = curs_online.fetchone()print("线上数据库该用户数据为:" + '\n' + str(online_user_data) + '\n')# 判断线上数据库是否有该用户if not online_user_data:text.insert("insert", "线上数据库没有该用户!" + '\n')else:# 执行下面这句后data为{"content": "x", "created_time": "2019-06-19 13:28:30"},是str类型data = json.dumps(online_user_data, default=str, ensure_ascii=False)# 把data转换为字典类型data_result = json.loads(data)print("转换为dict类型后的数据为:", '\n', data_result, '\n')# 把data再次转为json类型json_result = json.dumps(data_result)print("转换为json类型后的数据为:" + '\n' + json_result + '\n')# 获取返回字典data_result值的所有value的列表new_user_data = tuple(data_result.values())print(new_user_data)# 执行sql查询,查询测试数据库,将查询出来的结果保存在test_user_data中curs2.execute(read_test2_sql)test2_user_data = curs2.fetchone()# 提交数据至线上数据库conn_online_sql.commit()# 判断测试数据库是否有该用户if test2_user_data:text.insert("insert", "测试数据库已存在该用户数据!" + '\n')# 如果线上数据库有该用户,测试数据库没有该用户,则执行同步操作if online_user_data and (not test2_user_data):try:# 插入的SQL语句insert_sql = f'''insert into `{test_db_name}`.`{test_table}` VALUES {new_user_data}'''# 执行SQL,向测试数据库中插入数据curs2.execute(insert_sql)print(insert_sql)text.insert("insert", "数据同步成功!" + '\n')except IOError:text.insert("insert", "数据同步失败!" + '\n')conn_test2_sql.commit()curs_online.close()curs2.close()except IOError:print("数据插入失败")conn_online_sql.rollback()tkinter.filedialog.Directory()conn_online_sql.close()# 清空按钮函数:用来清空输入文本框中的内容
def clear():entry1.delete(0, END)  # 清空Entry文本框中的内容entry2.delete(0, END)  # 清空Entry文本框中的内容text.delete("1.0", "end")  # 清空text多行文本框中的内容radio.set("0")  # 清空Radiobutton标签选项框def selection():text.delete("1.0", "end")choose = str(radio.get())text.insert("insert", "您选择的是:" + choose + '\n')# 创建一个标签
tk.Label(window, text="线上用户姓名:").place(x=10, y=50)
tk.Label(window, text="线上用户手机:").place(x=10, y=120)
# 创建一个Entry文本框:用来输入一行文本字符串
entry1 = tk.Entry(window, bd=3, width=62, highlightcolor='red')
entry1.place(x=120, y=50)
entry2 = tk.Entry(window, bd=3, width=62, highlightcolor='green')
entry2.place(x=120, y=120)
# 创建一个可以输入多行文字的文本框
text = tk.Text(window, height=20, width=75, bg='white', highlightcolor='blue', highlightthickness=1)
text.place(x=35, y=240)
# 创建两个按钮:选择文件夹、退出窗口
tk.Button(window, text='开始同步', bg='grey', fg='white', command=data_synchronization).place(x=130, y=520)
tk.Button(window, text='清空', bg='grey', fg='white', command=clear).place(x=290, y=520)
tk.Button(window, text='退出', bg='grey', fg='white', command=window.quit).place(x=430, y=520)radio = tk.StringVar()
radio.set("0")
tk.Label(window, text='请选择数据库:', bg='green', fg='white', width=12).place(x=10, y=180)
# 创建3个radiobutton选项
radio1 = tk.Radiobutton(window, text='test1环境', variable=radio, command=selection, value="test1环境")
radio1.place(x=140, y=180)
radio2 = tk.Radiobutton(window, text='test2环境', variable=radio, command=selection, value="test2环境")
radio2.place(x=290, y=180)
radio3 = tk.Radiobutton(window, text='test3环境', variable=radio, command=selection, value="test3环境")
radio3.place(x=440, y=180)# 主循环
window.mainloop()

Python数据库同步神器(一键同步)相关推荐

  1. MySQL数据库同步神器 - Gravity - 比Datax好用

    MySQL数据库同步神器 - Gravity 原始地址:https://github.com/moiot/gravity 同步地址:  https://gitee.com/yunwisdoms/gra ...

  2. python数据库迁移命令_创建和进行数据库迁移,同步数据库

    模型(model)建好后,django可以根据这个模型(model)在数据库中创建一张数据表格. Django自带一个数据库迁移(migration)系统来跟踪对模型(models)的修改,然后同步到 ...

  3. python 数据库同步_python实现不同数据库间数据同步功能

    功能描述 数据库间数据同步方式很多,在上篇博文中有总结.本文是用py程序实现数据同步. a数据库中有几十张表,要汇聚到b数据库中,且表结构一致,需要准实时的进行数据同步,用工具实现时对其控制有限且配置 ...

  4. 多相机一键同步拍摄PythonC++

    多摄像头一键同步拍摄 最近有朋友咨询如何实现多摄像头一键同步拍照功能的方案问题,帮着实现了一下,包括Python和C++两个版本,实现思路和大家分享一下- 功能需求 在电脑上实现单/多个摄像头(UVC ...

  5. 阿里开源数据同步神器DataX异构数据源间数据同步同步MySQL与HDFS相互实战

    Datax 实战使用 继上一篇 阿里开源数据同步神器DataX异构数据源间数据同步基础介绍与快速入门之后的实战篇 1.MySQL-To-HDFS 环境 & 准备说明: 描述: 为了快速搭建测试 ...

  6. mysql获取最好成绩对应数据的其他项_开源数据同步神器——canal

    前言 如今大型的IT系统中,都会使用分布式的方式,同时会有非常多的中间件,如redis.消息队列.大数据存储等,但是实际核心的数据存储依然是存储在数据库,作为使用最广泛的数据库,如何将mysql的数据 ...

  7. 开源数据同步神器——canal

    前言 如今大型的IT系统中,都会使用分布式的方式,同时会有非常多的中间件,如redis.消息队列.大数据存储等,但是实际核心的数据存储依然是存储在数据库,作为使用最广泛的数据库,如何将mysql的数据 ...

  8. 脚本同步mysql数据_windows下数据库文件使用脚本同步到linux下的mysql数据库中

    1.背景 windows server 2008 下 每天会有 *.sql数据文件 需要上传到linux 中的mysql数据库中 而运维人员是在 windows server 下使用 xshell 连 ...

  9. 一键同步Elasticsearch,DataWorks数据集成同步解决方案上线!

    简介:企业的实时数据除了存储在大数据引擎中,还有很多非结构化的日志数据,通过阿里云的Elasticsearch,用全托管的方式提供低成本的冷热存储方案,轻松助力企业搭建统一的云上全观测运维监控平台,实 ...

  10. MySQL数据库实现双向自动同步

    下载网站:www.SyncNavigator.CN  客服QQ1793040 ---------------------------------------------------------- 关于 ...

最新文章

  1. SIFT特征提取算法总结
  2. 刘伟:什么是智能人机交互?
  3. python生成激活码
  4. codevs 1085 数字游戏 dp或者暴搜
  5. conda环境下如何升级python?
  6. AI:几张图理清人工智能与机器学习、知识发现、数据挖掘、统计学、模式识别、神经计算学、数据库之间的暧昧关系
  7. 【CodeForces - 294B】Shaass and Bookshelf(枚举,贪心,思维,组内贪心组间dp)
  8. 排序:快速排序与归并排序
  9. DBA的宿命(困兽之斗)
  10. CSS word-wrap强制换行截断长字符串
  11. 406.根据身高重建队列(JavaScript)
  12. 0c-38-ARC快速入门
  13. 教你如何获得win7候选发布版序列号及下载
  14. Delphi 2010 新增功能之: 手势编程[5] - 关于自定义手势
  15. 云服务器安装不了声卡,驱动精灵怎么安装声卡 声卡驱动安装方法
  16. 大数据架构与技术——(一)大数据概述
  17. 改变iOS searchBar中textField的背景颜色
  18. 深度学习-8.实践方法论
  19. gels imagej 图片处理_ImageJ在荧光照片分析中的应用介绍
  20. android限制app运行时间限制,android app 限制app使用时间

热门文章

  1. juniper防火墙基于路由的IPsec ***配置
  2. 电子计算机off键是什么意思,off键是什么意思
  3. python开方 运算符_[转载] Python中的算数运算符
  4. python3 collections模块 tree_python3上的ete3模块无法导入TreeStyle、faces、AttrFace、NodeSty...
  5. VScode comment translate 无法使用问题
  6. 济南职工医保统筹的一些了解
  7. python中除法带小数点_python 除法保留两位小数点的方法
  8. 智能指针的标准之争:Boost vs. Loki (转)
  9. 地图学类毕业论文文献包含哪些?
  10. STIPC-003_编程挑战系列赛第三场(柯柯的期末祝福) _F.小柯来放水