运用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

我们可以使用表重命名的方法,把表重命名到新的数据库之下。基本逻辑如下:

  1. 创建新数据库
  2. 获取旧数据库下所有的表名
  3. 把表重命名到新的数据库名下
  4. 删除旧数据库

下面使用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)

以上就是运用Python快速的对MySQL数据库进行重命名的详细内容,更多关于python 重命名MySQL数据库的资料请关注我们其它相关文章!

(0)

相关推荐

  • Python中tkinter+MySQL实现增删改查

    一.设置主窗口 # -*- coding: utf-8 -*- import tkinter from tkinter import ttk import pymysql # 导入消息对话框子模块 import tkinter.messagebox # 创建主窗口 root = tkinter.Tk() root.title('告警查询') # 设置窗口大小 root.minsize(500,500) tabControl = ttk.Notebook(root) tab1 = ttk.Fram

  • 用python开发一款操作MySQL的小工具

    项目地址 https://github.com/lishukan/directsql 安装 pip3 install directsql 导入 directsql 目前只提供三个外部类 __all__=["SqlGenerator","MysqlConnection","MysqlPool"] 导入方式 from directsql.sqlgenerator import SqlGenerator #该类用于生成sql语句 #下面是一个池化连接对

  • 教你怎么用Python操作MySql数据库

    一.关于Python操作数据库的概述 Python所有的数据库接口程序都在一定程度上遵守 Python DB-API 规范. DB-API定义了一系列必须的对象和数据库存取方式,以便为各种底层数据库系统和多种多样的数据库接口程序提供一致的访问接口.由于DB-API 为不同的数据库提供了一致的访问接口, 在不同的数据库之间移植代码成为一件轻松的事情. 在Python中如果要连接数据库,不管是MySQL.SQL Server.PostgreSQL亦或是SQLite,使用时都是采用游标的方式. 二.一

  • MySQL中使用SQL语句对字段进行重命名

    MySQL中,如何使用SQL语句来对表中某一个字段进行重命名呢?我们将使用alter table 这一SQL语句. 重命名字段的语法为:alter table <表名> change <字段名> <字段新名称> <字段的类型>. 现在我们来尝试把test表中的t_name字段重命名为t_name_new字段. 1.首先查看一下当前test表的结构 mysql> describe test; +------------+-------------+---

  • Python使用sql语句对mysql数据库多条件模糊查询的思路详解

    def find_worldByName(c_name,continent): print(c_name) print(continent) sql = " SELECT * FROM world WHERE 1=1 " if(c_name!=None): sql=sql+"AND ( c_name LIKE '%"+c_name+"%' )" if(continent!=None): sql=sql+" AND ( continent

  • MySQL数据库重命名的快速且安全方法(3种)

    MySQL数据库重命名的方法 Innodb引擎的表如何改数据库名,MyISAM引擎又该如何操作. 如果表是MyISAM引擎可以直接去到数据库目录mv重命名文件夹就可以. Innodb完全不行,会提示相关表不存在. 第一种方法:rename database 弃用了 RENAME database old_db_name TO new_db_name 这个是5.1.7到5.1.23版本可以用的,但是官方不推荐,会有丢失数据的危险 第二种方法:mysqldump 备份 1.创建需要改成新名的数据库.

  • mysql事件之修改事件(ALTER EVENT)、禁用事件(DISABLE)、启用事件(ENABLE)、事件重命名及数据库事件迁移操作详解

    本文实例讲述了mysql事件之修改事件(ALTER EVENT).禁用事件(DISABLE).启用事件(ENABLE).事件重命名及数据库事件迁移操作.分享给大家供大家参考,具体如下: 我们要知道,MySQL允许我们更改现有事件的各种属性.如果我们要更改现有事件,可以使用ALTER EVENT语句,如下所示: ALTER EVENT event_name ON SCHEDULE schedule ON COMPLETION [NOT] PRESERVE RENAME TO new_event_n

  • Python聊天室带界面实现的示例代码(tkinter,Mysql,Treading,socket)

    一.前言 我用的是面向对象写的,把界面功能模块封装成类,然后在客户端创建对象然后进行调用.好处就是方便我们维护代码以及把相应的信息封装起来,每一个实例都是各不相同的. 所有的界面按钮处理事件都在客户端,在创建界面对象是会把客户端的处理事件函数作为创建对象的参数,之后再按钮上绑定这个函数,当点击按钮时便会回调函数 二.登录界面实现 登录界面模块chat_login_panel.py from tkinter import * # 导入模块,用户创建GUI界面 # 登陆界面类 class Login

  • Python操作MySQL数据库的简单步骤分享

    前言 现在Python越来越被大众所使用,特别是进入AI人工智能时代,对编程要求更加高效根据快捷,所以Python也经常成为人工智和大数据编程的重要语音.既然是编程语言就多多少少会需求对数据进行操作,这一篇我们带大家使用python对mysql进行的操作. 别的不说,直接上代码 MySQL 建表 建表的时候,遇到一些坑,没有解决,如修改 MySQL 的默认引擎,default-storage-engine=InnoDB;执行报错 ...无奈 use mybatistable; drop tabl

  • 详解MYSQL中重命名procedure的一种方法

    最近有用到对存储过程(procedure)重命名的功能,在网上找了一下资料都没有讲到在mysql中是如何实现的,当然可以删掉再重建,但是应该有别的方法,在"mysql"这个数据库(自带)中找了一下,发现两张表:func.proc,发现func表是空的,proc表记录了有关procedure和function有关的信息. 尝试对proc表进行更新,重命名成功了! 总结 以上所述是小编给大家介绍的MYSQL中重命名procedure的一种方法,希望对大家有所帮助,如果大家有任何疑问请给我留

  • MySQL 重命名表的操作方法及注意事项

    1.重命名表方法 使用 RENAME TABLE 语句或 ALTER TABLE 语句都可以对表进行重命名,基本语法如下: # RENAME TABLE 语法: RENAME TABLE     tbl_name TO new_tbl_name     [, tbl_name2 TO new_tbl_name2] ...      # ALTER TABLE 语法: ALTER TABLE old_table RENAME new_table; # 具体示例: mysql> show table

  • mysql数据库重命名语句分享

    复制代码 代码如下: CREATE DATABASE `ct` DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;            RENAME TABLE `51cola`.`commentmeta`                  TO `ct`.`commentmeta`;            RENAME TABLE `51cola`.`comments`                  TO `ct`.`comments`

  • Python基础之操作MySQL数据库

    一.数据库操作 1.1 安装PyMySQL pip install PyMySQL 1.2 连接数据库 python连接test数据库 import pymysql host = 'localhost' # 主机地址 username = 'root' # 数据库用户名 password = '' # 数据库密码 db_name = 'test' # 数据库名称 # 创建connect对象 connect = pymysql.connect(host=host, user=username, p

随机推荐