运用Python快速的对MySQL数据库进行重命名
作者:一撸程猿 发布时间:2024-01-17 22:36:25
标签:python,重命名,MySQL
目录
常规思路
更快捷的方法
使用方法
对数据库的表进行重命名可以使用以下原生sql:
RENAME TABLE old_table TO new_table;
窘境:但是MySQL并没有直接支持对数据库进行重命名
那么如何运用Python快速的对现有的数据库进行重命名呢?
比如项目初期,对数据库的命名(db_ridingroad)没有规划好,
然后在下面创建了大量的表和写入了大量的数据,现在需要对数据库的名字进行重命名为(db_news_website)
常规思路
下面的方法步骤较为繁琐
-- 数据库备份
mysqldump –u [UserName] –p[Password] –R [DB_Name] > [DB_Name].sql
-- 创建新数据库
create database [New_DB_Name];
-- 把备份的数据导入到新数据库
mysql –u [UserName] –p[Password] [New_DB_Name] < [DB_Name].sql
-- 删除旧数据库
drop database [DB_Name];
更快捷的方法
只需要执行下面这条命令即可
python rename_database.py old_db_name new_db_name
我们可以使用表重命名的方法,把表重命名到新的数据库之下。基本逻辑如下:
创建新数据库
获取旧数据库下所有的表名
把表重命名到新的数据库名下
删除旧数据库
下面使用Python代码去实现,主要代码(完整代码见文末):
def rename_db(old_name, new_name):
"""
数据库重命名
:param old_name: 原来的数据库名
:param new_name: 新数据库名
:return: 成功返回True, 失败返回False
"""
# 获取所有的表名
sql = """SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE table_schema=%s"""
conn, cursor = context()
try:
# 创建新数据库名
cursor.execute('create database if not exists {}'.format(new_name))
cursor.execute(sql, (old_name, ))
results = cursor.fetchall()
# 获取表明,循环处理放到新的数据库名下
for r in results:
tb = r['TABLE_NAME']
rename_sql = """RENAME TABLE {}.{} to {}.{}""".format(old_name, tb, new_name, tb)
cursor.execute(rename_sql)
# 把旧数据库删掉
cursor.execute('drop database {}'.format(old_name))
except Exception as ex:
conn.rollback()
print("rename_db Exception: {},{}".format(sql, ex))
return False
else:
# 如果没有发生异常,则提交事务
conn.commit()
finally:
conn.close()
return True
使用方法
1.安装PyMySQL
pip install PyMySQL
2.修改脚本中关于数据库账号配置信息部分
MYSQL_HOST = '127.0.0.1'
MYSQL_PORT = 3306
MYSQL_USER = 'ridingroad'
MYSQL_PASSWORD = 'xxxxyyyy'
MYSQL_DATABASE = 'db_ridingroad'
3.切换到脚本所在目录,执行以下命令即可(数据无价,请先mysqldump备份)
python rename_database.py old_db_name new_db_name
完整代码如下:
import sys
import pymysql
MYSQL_HOST = '127.0.0.1'
MYSQL_PORT = 3306
MYSQL_USER = 'ridingroad'
MYSQL_PASSWORD = 'xxxxyyyy'
MYSQL_DATABASE = 'db_ridingroad'
MYSQL_CHARSET = 'utf8'
def context(is_dict_cursor=True, database=MYSQL_DATABASE):
"""
创建数据库连接, 数据以字典结构返回
:param is_dict_cursor: 是否返回字典结构的数据
:param database: 默认连接的数据库
:return: 返回一个连接和一个浮标
"""
try:
config = {
'host': MYSQL_HOST,
'port': MYSQL_PORT,
'user': MYSQL_USER,
'password': MYSQL_PASSWORD,
'database': database,
'charset': MYSQL_CHARSET,
}
conn = pymysql.connect(**config)
if is_dict_cursor:
cursor = conn.cursor(cursor=pymysql.cursors.DictCursor)
else:
cursor = conn.cursor()
return conn, cursor
except Exception as ex:
print("connect database failed, {},{}".format(400, ex))
raise Exception({'code': 400, 'msg': ex})
def rename_db(old_name, new_name):
"""
数据库重命名
:param old_name: 原来的数据库名
:param new_name: 新数据库名
:return: 成功返回True, 失败返回False
"""
# 获取所有的表名
sql = """SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE table_schema=%s"""
conn, cursor = context()
try:
conn.begin()
# 创建新数据库名
cursor.execute('create database if not exists {}'.format(new_name))
cursor.execute(sql, (old_name, ))
results = cursor.fetchall()
# 获取表明,循环处理放到新的数据库名下
for r in results:
tb = r['TABLE_NAME']
rename_sql = """RENAME TABLE {}.{} to {}.{}""".format(old_name, tb, new_name, tb)
cursor.execute(rename_sql)
# 把旧数据库删掉
cursor.execute('drop database {}'.format(old_name))
except Exception as ex:
conn.rollback()
print("rename_db Exception: {},{}".format(sql, ex))
return False
else:
# 如果没有发生异常,则提交事务
conn.commit()
finally:
conn.close()
return True
if __name__ == '__main__':
old_db = sys.argv[1]
new_db = sys.argv[2]
rename_db(old_name=old_db, new_name=new_db)
来源:https://juejin.cn/post/6970630548822130695


猜你喜欢
- 本文实例讲述了Python基于递归实现电话号码映射功能。分享给大家供大家参考,具体如下:问题电话按键上面的每个数字都对应着几个字母,如果按下
- 前言在前面的分享中,我们制作了一个天眼查 GUI 程序,今天我们在这个的基础上,继续开发新的功能,微博抓取工具,先来看下最终的效果整体的界面
- python-----从本地摄像头和网络摄像头截取图片 ,具体代码如下所示:import cv2# 获取本地摄像头# folder_path
- 阅读上一篇:W3C优质网页小贴士(三)明智地选择 URI没有什么比走到你最喜欢的商店门口,却发现店门紧闭,而且没有看见店面搬迁告示这种事情还
- 前言今天来聊一下PyTorch中的torch.nn.Parameter()这个函数,笔者第一次见的时候也是大概能理解函数的用途,但是具体实现
- 1、安装 vue-i18n依赖yarn add vue-i18n 或者 npm install vue-i18n --save-dev2、在
- 能够操控日期和时间对于大多数编程语言来说是基本的能力,Perl也不例外。但是在碰到与时间相关的更加复杂的处理时,Perl自带的功能常常就显得
- 最近在开发项目的过程中遇到一个问题,就是在插入一条记录的后要立即获取所在数据库中ID,而该ID是自增的,怎么做?在sql server 20
- 为了更好的理解邮件发送功能的实现,要先了解邮件发送系统的大致流程。首先 电子邮件之间的相互发送接受就像 邮局邮件发送
- 今天去辛集买箱包,下午挺晚才回来,又是恶心又是头痛。恶心是因为早上吃坏东西+晕车+回来时看到车祸现场,头痛大概是烈日和空调混合刺激而成。没有
- 前言既然在Pathlib库中提到了glob()函数,那么我们就专门用一篇内容讲解文件名的匹配。其实我们有专门的一个文件名匹配库就叫:glob
- 1、权限赋予 说明:mysql部署在服务器A上,内网上主机B通过客户端工具连接服务器A以进行数据库操作,需要服务器A赋予主机B操作mysql
- 本文实例讲述了原生JS实现Ajax通过GET方式与PHP进行交互操作。分享给大家供大家参考,具体如下:一、代码conn.php<?ph
- 要选择有助于使查询执行更快的列,应遵循如下规则(这里,“BLOB 类型”应该理解为即包含B L O
- Django是用python写的web开发框架,其特点是:1.重量级框架,内部封装了很多的功能组件,使开发变的简便快速,2.MVT模式:前后
- 枚举类Enum枚举类,在企业开发中用的比较多当我们需要定义常量时,一个办法是用大写的变量通过整数来定义,例如月份:# 当项目中需要使用12个
- vue配置文件vue.config.js配置前端代理将此代码片段命名为 vue.config.js,放在项目根目录即可仅需修改target属
- 每天换一个壁纸,每天好心情。# -*- coding: UTF-8 -*- from __future__ import unicode_l
- 前言:开发环境:python 3.8pycharm 2021.2 专业版代码实现:发送请求获取数据解析数据(筛选数据)保存数据连接数据库请求
- 前言滑块拼图验证码的失败难度在于每次图片上缺口位置不一样,需识别图片上拼图的缺口位置,使用python的OpenCV库来识别到环境准备pip