经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 数据库/运维 » MySQL » 查看文章
Python实现mysql数据库中的SQL文件生成和导入
来源:jb51  时间:2022/6/6 15:45:32  对本文有异议

1、将mysql数据导出到SQL文件中(数据库存在的情况)

主要需要修改数据库的相关信息,端口号、用户名、密码等

其中数据库得存在,不然会报错 :

  1. #!/usr/bin/env python
  2. # -*- coding: utf-8 -*-
  3. # @description:导出数据库文件sql
  4. import os
  5. class InitSql(object):
  6. ?? ?sql_file = "A.sql"
  7. ?
  8. ?? ?def import_server_db(self):
  9. ?? ??? ?mysqldump_commad_dict = {'dumpcommad': 'mysqldump ', 'server': 'localhost', 'user': 'root',
  10. ?? ??? ? ? ? ? ? ? ? ? ? ? ? ? ? 'password': 'root', 'port': 3306, 'db': 'studentmanagersystem'}
  11. ?? ??? ?# mysqldump 命令
  12. ?? ??? ?sqlfromat = "mysqldump --column-statistics=0 -h%s -u%s -p%s -P%s %s > %s"
  13. ?? ??? ?# 生成相应的sql语句
  14. ?? ??? ?sql = (sqlfromat % (mysqldump_commad_dict['server'],
  15. ?? ??? ? ? ? ? ? ? ? ? ? ? ?mysqldump_commad_dict['user'],
  16. ?? ??? ? ? ? ? ? ? ? ? ? ? ?mysqldump_commad_dict['password'],
  17. ?? ??? ? ? ? ? ? ? ? ? ? ? ?mysqldump_commad_dict['port'],
  18. ?? ??? ? ? ? ? ? ? ? ? ? ? ?mysqldump_commad_dict['db'],
  19. ?? ??? ? ? ? ? ? ? ? ? ? ? ?self.sql_file))
  20. ?? ??? ?print("执行的导出数据库的sql:" + sql)
  21. ?? ??? ?result = os.system(sql)
  22. ?? ??? ?return result
  23. if __name__ == '__main__':
  24. ?? ?initSql = InitSql()
  25. ?? ?initSql.import_server_db()

生成的sql文件如下所示:

  1. -- MySQL dump 10.13 ?Distrib 8.0.29, for Win64 (x86_64)
  2. --
  3. -- Host: localhost ? ?Database: studentmanagersystem
  4. -- ------------------------------------------------------
  5. -- Server version ?8.0.29
  6.  
  7. /*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
  8. /*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
  9. /*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
  10. /*!50503 SET NAMES utf8mb4 */;
  11. /*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */;
  12. /*!40103 SET TIME_ZONE='+00:00' */;
  13. /*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;
  14. /*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
  15. /*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
  16. /*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;
  17.  
  18. --
  19. -- Table structure for table `studenttable`
  20. --
  21.  
  22. DROP TABLE IF EXISTS `studenttable`;
  23. /*!40101 SET @saved_cs_client ? ? = @@character_set_client */;
  24. /*!50503 SET character_set_client = utf8mb4 */;
  25. CREATE TABLE `studenttable` (
  26. ? `number` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL,
  27. ? `name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL,
  28. ? `sex` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL,
  29. ? `classes` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL,
  30. ? `floor` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL,
  31. ? `room` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL,
  32. ? `tel` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL,
  33. ? `money` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL,
  34. ? PRIMARY KEY (`number`) USING BTREE
  35. ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci ROW_FORMAT=DYNAMIC;
  36. /*!40101 SET character_set_client = @saved_cs_client */;
  37.  
  38. --
  39. -- Dumping data for table `studenttable`
  40. --
  41.  
  42. LOCK TABLES `studenttable` WRITE;
  43. /*!40000 ALTER TABLE `studenttable` DISABLE KEYS */;
  44. INSERT INTO `studenttable` VALUES ('2201','刘同学','男','1班','A1','101','1112','30'),('2202','张同学','男','2班','A2','211','1121','13'),('2203','管同学','女','2班','A3','121','1122','11'),('2204','管同学','女','2班','A3','121','1122','11'),('2205','刘同学','女','2班','A3','121','1122','11'),('2206','张同学','男','2班','A2','211','1121','13'),('2208','杨同学','男','1班','A1','101','1112','30'),('2209','蔡同学','男','1班','A1','101','1112','30');
  45. /*!40000 ALTER TABLE `studenttable` ENABLE KEYS */;
  46. UNLOCK TABLES;
  47. /*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */;
  48.  
  49. /*!40101 SET SQL_MODE=@OLD_SQL_MODE */;
  50. /*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */;
  51. /*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */;
  52. /*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
  53. /*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
  54. /*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;
  55. /*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */;
  56.  
  57. -- Dump completed on 2022-06-05 ?0:30:03

2、将现有的sql文件数据导入到数据库中(前提数据库存在) 

这里的话其实就是将SQL文件进行分割成一条条SQL语句,然后顺序执行即可

  1. import pymysql
  2. from pathlib import Path
  3. class ConnectMsql:
  4. ?? ?def __init__(self, host='localhost', port=3306, user='root',
  5. ?? ? ? ? ? ? ? ? password='root', database="studentmanagersystem", filename: str = "studenttable.sql"):
  6. ?? ??? ?"""
  7. ? ? ? ? :param host: ? ? ? ?域名
  8. ? ? ? ? :param port: ? ? ? ?端口
  9. ? ? ? ? :param user: ? ? ? ?用户名
  10. ? ? ? ? :param password: ? ?密码
  11. ? ? ? ? :param database: ? ?数据库名
  12. ? ? ? ? :param filename: ? ?文件名称
  13. ? ? ? ? """
  14. ?? ??? ?self._host: str = host
  15. ?? ??? ?self._port: int = port
  16. ?? ??? ?self._user: str = user
  17. ?? ??? ?self._password: str = password
  18. ?? ??? ?self._database: str = database
  19. ?? ??? ?self._file_path = Path(__file__).parent.joinpath(filename)
  20. ?
  21. ?? ?def _show_databases_and_create(self):
  22. ?? ??? ?"""
  23. ? ? ? ? 查询数据库是否存在,不存在则进行新建操作
  24. ? ? ? ? :return:
  25. ? ? ? ? """
  26. ?? ??? ?connection = pymysql.connect(host=self._host, port=self._port, user=self._user, password=self._password,
  27. ?? ??? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? cursorclass=pymysql.cursors.DictCursor)
  28. ?? ??? ?with connection:
  29. ?? ??? ??? ?with connection.cursor() as cursor:
  30. ?? ??? ??? ??? ?cursor.execute('show databases;')
  31. ?? ??? ??? ??? ?result = cursor.fetchall()
  32. ?? ??? ??? ??? ?results = self._database not in tuple(x["Database"] for x in result)
  33. ?
  34. ?? ??? ?if results:
  35. ?? ??? ??? ?with connection.cursor() as cursor:
  36. ?? ??? ??? ??? ?cursor.execute(f'create database {self._database};')
  37. ?? ??? ??? ?with connection.cursor() as cursor:
  38. ?? ??? ??? ??? ?cursor.execute('show databases;')
  39. ?? ??? ??? ??? ?result = cursor.fetchall()
  40. ?? ??? ??? ??? ?results = self._database in tuple(x["Database"] for x in result)
  41. ?? ??? ??? ?return results if results else result
  42. ?? ??? ?else:
  43. ?? ??? ??? ?return True
  44. ?
  45. ?? ?def _export_databases_data(self):
  46. ?? ??? ?"""
  47. ? ? ? ? 读取.sql文件,解析处理后,执行sql语句
  48. ? ? ? ? :return:
  49. ? ? ? ? """
  50. ?? ??? ?if self._show_databases_and_create() is True:
  51. ?? ??? ??? ?connection = pymysql.connect(host=self._host, port=self._port, user=self._user, password=self._password,
  52. ?? ??? ??? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? database=self._database, charset='utf8')
  53. ?? ??? ??? ?# 读取sql文件,并提取出sql语句
  54. ?? ??? ??? ?results, results_list = "", []
  55. ?? ??? ??? ?with open(self._file_path, mode="r+", encoding="utf-8") as r:
  56. ?? ??? ??? ??? ?for sql in r.readlines():
  57. ?? ??? ??? ??? ??? ?# 去除数据中的“\n”和“\r”字符
  58. ?? ??? ??? ??? ??? ?sql = sql.replace("\n", "").replace("\r", "")
  59. ?? ??? ??? ??? ??? ?# 获取不是“--”开头且不是“--”结束的数据
  60. ?? ??? ??? ??? ??? ?if not sql.startswith("--") and not sql.endswith("--"):
  61. ?? ??? ??? ??? ??? ??? ?# 获取不是“--”的数据
  62. ?? ??? ??? ??? ??? ??? ?if not sql.startswith("--"):
  63. ?? ??? ??? ??? ??? ??? ??? ?results = results + sql
  64. ?
  65. ?? ??? ??? ??? ?# 根据“;”分割数据,处理后插入列表中
  66. ?? ??? ??? ??? ?for i in results.split(";"):
  67. ?? ??? ??? ??? ??? ?if i.startswith("/*"):
  68. ?? ??? ??? ??? ??? ??? ?results_list.append(i.split("*/")[1] + ";")
  69. ?? ??? ??? ??? ??? ??? ?# print(i.split("*/")[1] + ";")
  70. ?? ??? ??? ??? ??? ?else:
  71. ?? ??? ??? ??? ??? ??? ?results_list.append(i + ";")
  72. ?? ??? ??? ??? ??? ??? ?# print(i + ";")
  73. ?? ??? ??? ?# 执行sql语句
  74. ?? ??? ??? ?with connection:
  75. ?? ??? ??? ??? ?with connection.cursor() as cursor:
  76. ?? ??? ??? ??? ??? ?# 循环获取sql语句
  77. ?? ??? ??? ??? ??? ?for x in results_list[:-1]:
  78. ?? ??? ??? ??? ??? ??? ?if x != ";":
  79. ?? ??? ??? ??? ??? ??? ??? ?print(x)
  80. ?? ??? ??? ??? ??? ??? ??? ?# 执行sql语句
  81. ?? ??? ??? ??? ??? ??? ??? ?cursor.execute(x)
  82. ?? ??? ??? ??? ??? ??? ??? ?# 提交事务
  83. ?? ??? ??? ??? ??? ??? ??? ?connection.commit()
  84. ?? ??? ??? ??? ??? ?else:
  85. ?? ??? ??? ??? ??? ??? ?return "sql全部语句执行成功 !"
  86. ?? ?@property
  87. ?? ?def sql_run(self):
  88. ?? ??? ?"""
  89. ?? ??? ?执行方法
  90. ?? ??? ?:return:
  91. ?? ??? ?"""
  92. ?? ??? ?return self._export_databases_data()
  93. if __name__ == '__main__':
  94. ?? ?res = ConnectMsql().sql_run
  95. ?? ?print(res)

利用Navicat软件可视化数据库,可以看到导入SQL文件成功

3、利用Navicat导出SQL文件和导入SQL文件

1)从数据库导出SQL文件

选择需要导出的数据表——右键——转储为SQL文件——数据和结构

这样就可以将数据表的结构和数据都一起保存在SQL文件中

2)导入SQL文件到数据库 

右键选中需要导入的数据库——运行SQL文件

点击开始后,即开始运行SQL文件,出现下述字样表明导入SQL文件成功

到此这篇关于Python实现mysql数据库中的SQL文件生成和导入的文章就介绍到这了,更多相关SQL文件生成内容请搜索w3xue以前的文章或继续浏览下面的相关文章希望大家以后多多支持w3xue!

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号