ISEE小语
“宴笑友朋多,患难知交寡。” ——蒲松龄
回顾上篇
Python实现MySql数据库导出表结构和数据功能-实例
ISEE小栈,公众号:ISEE小栈Python实现MySql数据库导出表结构和数据功能-实例
开始本篇
继上篇分享的【导出数据库的表结构和数据功能实现】,本篇分享自动创建数据库和自动导入SQL文件,也是对上篇结尾的补充。
创建数据库和导入SQL的操作,咱们经常使用的方式也是在工具中直接创建和导入,如在Navicat中[新建数据库],在新建的数据库中[运行SQL文件],操作简单也方便。
本次实际运用的场景是将上篇分享中的database.sql文件,导入到新创建的数据库中,将导出和导入的自动化形成一个完整的闭环。
此次实现自动创建和导入的功能是针对上篇的database.sql文件,当初导出的时候就具有特殊性和定制性,不同的SQL文件有可能需要有些特殊地处理(比如文件编码格式等)。有借用到自己数据库的同学,如果有不成功的情况,那就需要根据实际情况在这基础上稍作优化。
环境:
Pycharm
Python 3.9.18
安装:
pip install mysql-connector-python==8.1.0
pip install PyMySQL==1.1.0
导入:
import mysql.connector
import datetime
本次很简单,只分为两部分:
第一部分 自动创建数据库
第二部分 导入SQL文件
在实现以上两个部分前,要先连接MySql,和上篇导出区别的地方是,本次没有数据库,所以只是连接通MySql即可
连接MySql:
# 创建到MySQL的连接
db_config = {
'host': '127.0.0.1',
'user': 'root',
'password': '123456',
'port': 3306
}
# 连接MySql
cnx = mysql.connector.connect(**db_config)
cursor = cnx.cursor()
print(cursor)
结果:
说明已经连接成功~!
那么接下来就开始……
第一部分
自动创建数据库
创建数据库是首要前提
确定数据库的名称,尽量避免与其他数据库重名。
# 定义数据库名称
db_name = 'self_test_aa'
(左右滑动查看完整代码)
以防万一重名,做一个判断重名并删除的操作
# 检查数据库是否已存在
cursor.execute("SHOW DATABASES LIKE %s", (db_name,))
if cursor.fetchone() is not None:
# 数据库已存在,则删除
drop_db = f"DROP DATABASE IF EXISTS {db_name};"
cursor.execute(drop_db)
(左右滑动查看完整代码)
最后执行创建
# 创建新的数据库
cursor.execute('CREATE DATABASE {db_name} CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci'.format(db_name=db_name))
(左右滑动查看完整代码)
第二部分
导入SQL文件
首先,切到新创建的数据库下面
cursor.execute(f"USE {db_name}")
(左右滑动查看完整代码)
然后,导入SQL文件
换个直白的说法,就是把SQL文件中内容读出来,再执行到MySql中
# 导入SQL文件
with open('database.sql', 'r', encoding='utf-8') as f:
sql_statements = f.read().split(';')
for sql_statement in sql_statements:
if sql_statement.strip():
cursor.execute(sql_statement)
while cursor.nextset():
pass
cnx.commit()
(左右滑动查看完整代码)
最后,关闭连接
# 关闭连接
cursor.close()
cnx.close()
(左右滑动查看完整代码)
总结
阅读本篇,建议先看一下上篇分享,毕竟本次使用的'database.sql'是上篇输出的。在实践中,也是和上篇一起使用的。
源码:
# -*- coding: utf-8 -*-
import mysql.connector
# 创建到MySQL的连接
db_config = {
'host': '127.0.0.1',
'user': 'root',
'password': '123456',
'port': 3306
}
# 连接MySql
cnx = mysql.connector.connect(**db_config)
cursor = cnx.cursor()
# 定义数据库名称
db_name = 'self_test_aa'
# 检查数据库是否已存在
cursor.execute("SHOW DATABASES LIKE %s", (db_name,))
if cursor.fetchone() is not None:
# 数据库已存在,则删除
drop_db = f"DROP DATABASE IF EXISTS {db_name};"
cursor.execute(drop_db)
# 创建新的数据库
cursor.execute('CREATE DATABASE {db_name} CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci'.format(db_name=db_name))
# 切到新创建的数据库下面
cursor.execute(f"USE {db_name};")
# 导入SQL文件
with open('database.sql', 'r', encoding='utf-8') as f:
sqls = f.read().split(';')
for sql in sqls:
if sql.strip():
cursor.execute(sql)
while cursor.nextset():
pass
cnx.commit()
# 记住关闭连接
cursor.close()
cnx.close()
(左右滑动查看完整代码)
有兴趣的同学,可试之~!
寄语:世间三美,明月,清风,眼前……
看到这儿的朋友帮点个“赞”和“在看”,谢谢支持~!
文章就分享到这儿,喜欢就点个赞吧!