[データベース学習] - Python は mysql データベース SQL ファイルの生成とインポートを実装します

目次

1. mysql データを SQL ファイルにエクスポートします (データベースが存在する場合)

2. 既存の SQL ファイル データをデータベースにインポートします (前提条件はデータベースが存在することです)。 

 3. Navicat を使用して SQL ファイルをエクスポートし、SQL ファイルをインポートします。

1) データベースから SQL ファイルをエクスポート

2) SQL ファイルをデータベースにインポートする 


1. mysql データを SQL ファイルにエクスポートします (データベースが存在する場合)

主に、ポート番号、ユーザー名、パスワードなどのデータベースの関連情報を変更する必要があります。

データベースが存在する必要があります。存在しない場合はエラーが報告されます 

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time    : 2022/5/29 13:06
# @Author  : @linlianqin
# @Site    : 
# @File    : exportSqlFile.py
# @Software: PyCharm
# @description:导出数据库文件sql

import os

class InitSql(object):
	sql_file = "A.sql"

	def import_server_db(self):
		mysqldump_commad_dict = {'dumpcommad': 'mysqldump ', 'server': 'localhost', 'user': 'root',
		                         'password': 'root', 'port': 3306, 'db': 'studentmanagersystem'}
		# mysqldump 命令
		sqlfromat = "mysqldump --column-statistics=0 -h%s -u%s -p%s -P%s %s > %s"
		# 生成相应的sql语句
		sql = (sqlfromat % (mysqldump_commad_dict['server'],
		                    mysqldump_commad_dict['user'],
		                    mysqldump_commad_dict['password'],
		                    mysqldump_commad_dict['port'],
		                    mysqldump_commad_dict['db'],
		                    self.sql_file))
		print("执行的导出数据库的sql:" + sql)
		result = os.system(sql)
		return result


if __name__ == '__main__':
	initSql = InitSql()
	initSql.import_server_db()

生成される SQL ファイルは次のとおりです。

-- MySQL ダンプ 10.13 ディストリビュート 8.0.29、Win64 (x86_64) 用
-- 
-- ホスト: localhost データベース:studentmanagersystem 
-- ----------------------- ----------------------------- 
-- サーバー バージョン 8.0.29 

/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT * /; 
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */; 
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */; 
/*!50503 セット名 utf8mb4 */; 
/*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */; 
/*!40103 SET TIME_ZONE='+00:00' */; 
/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */; 
/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */; 

-- 
-- テーブル `studenttable` のテーブル構造
-- 

DROP TABLE IF EXISTS `studenttable`; 
/*!40101 SET @saved_cs_client = @@character_set_client */; 
/*!50503 SET 文字セットクライアント = utf8mb4 */; 
CREATE TABLE `studenttable` ( 
  `number` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL、
  `name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL、`sex` varchar(255) CHARACT ER セット utf8mb4 照合 utf8mb4_0900_ai_ci
  デフォルト NULL 、
  `classes` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL、
/*!40000 ALTER TABLE `studenttable` キーを無効にします */; 
  `floor` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL,
  `room` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL、
  `tel` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL、` 
  money` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci デフォルト NULL、
  主キー (`number `) BTREE の使用
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci ROW_FORMAT=DYNAMIC; 
/*!40101 SETcharacter_set_client = @saved_cs_client */; 

-- 
-- テーブル `studenttable` のデータをダンプしています
-- 

LOCK TABLES `studenttable` WRITE;'男','1班','A1','101','1112','30'); 
/*!40000 ALTER TABLE `studenttable` ENABLE KEYS */; 
テーブルのロックを解除します。
/*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */; 

/*!40101 SET SQL_MODE=@OLD_SQL_MODE */; 
/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */; 
/*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */; 
/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */; 40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */; /*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */; 40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */; /*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */; 
/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */; 
/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */; 

-- ダンプ完了: 2022-06-05 0:30:03

2. 既存の SQL ファイル データをデータベースにインポートします (前提条件はデータベースが存在することです)。 

ここで言っているのは、実際には SQL ファイルを SQL ステートメントに分割し、それらを順次実行することです。

import pymysql
from pathlib import Path

class ConnectMsql:

	def __init__(self, host='localhost', port=3306, user='root',
	             password='root', database="studentmanagersystem", filename: str = "studenttable.sql"):
		"""
        :param host:        域名
        :param port:        端口
        :param user:        用户名
        :param password:    密码
        :param database:    数据库名
        :param filename:    文件名称
        """

		self._host: str = host
		self._port: int = port
		self._user: str = user
		self._password: str = password
		self._database: str = database
		self._file_path = Path(__file__).parent.joinpath(filename)

	def _show_databases_and_create(self):
		"""
        查询数据库是否存在,不存在则进行新建操作
        :return:
        """
		connection = pymysql.connect(host=self._host, port=self._port, user=self._user, password=self._password,
		                             cursorclass=pymysql.cursors.DictCursor)
		with connection:
			with connection.cursor() as cursor:
				cursor.execute('show databases;')
				result = cursor.fetchall()
				results = self._database not in tuple(x["Database"] for x in result)

		if results:
			with connection.cursor() as cursor:
				cursor.execute(f'create database {self._database};')
			with connection.cursor() as cursor:
				cursor.execute('show databases;')
				result = cursor.fetchall()
				results = self._database in tuple(x["Database"] for x in result)
			return results if results else result
		else:
			return True

	def _export_databases_data(self):
		"""
        读取.sql文件,解析处理后,执行sql语句
        :return:
        """
		if self._show_databases_and_create() is True:
			connection = pymysql.connect(host=self._host, port=self._port, user=self._user, password=self._password,
			                             database=self._database, charset='utf8')
			# 读取sql文件,并提取出sql语句
			results, results_list = "", []
			with open(self._file_path, mode="r+", encoding="utf-8") as r:
				for sql in r.readlines():
					# 去除数据中的“\n”和“\r”字符
					sql = sql.replace("\n", "").replace("\r", "")
					# 获取不是“--”开头且不是“--”结束的数据
					if not sql.startswith("--") and not sql.endswith("--"):
						# 获取不是“--”的数据
						if not sql.startswith("--"):
							results = results + sql

				# 根据“;”分割数据,处理后插入列表中
				for i in results.split(";"):
					if i.startswith("/*"):
						results_list.append(i.split("*/")[1] + ";")
						# print(i.split("*/")[1] + ";")
					else:
						results_list.append(i + ";")
						# print(i + ";")

			# 执行sql语句
			with connection:
				with connection.cursor() as cursor:
					# 循环获取sql语句
					for x in results_list[:-1]:
						if x != ";":
							print(x)
							# 执行sql语句
							cursor.execute(x)
							# 提交事务
							connection.commit()
					else:
						return "sql全部语句执行成功 !"


	@property
	def sql_run(self):
		"""
		执行方法
		:return:
		"""
		return self._export_databases_data()


if __name__ == '__main__':
	res = ConnectMsql().sql_run
	print(res)

 Navicat ソフトウェアを使用してデータベースを視覚化すると、SQL ファイルが正常にインポートされたことがわかります。

 3. Navicat を使用して SQL ファイルをエクスポートし、SQL ファイルをインポートします。

1) データベースから SQL ファイルをエクスポート

エクスポートするデータテーブルを選択 - 右クリック - SQL ファイルにダンプ - データと構造

このようにして、データテーブルの構造とデータをまとめて SQL ファイルに保存できます。

2) SQL ファイルをデータベースにインポートする 

インポートするデータベースを右クリックし、SQL ファイルを実行します。

 「開始」をクリックすると、SQL ファイルの実行が開始され、SQL ファイルが正常にインポートされたことを示す次の文字が表示されます。

 

おすすめ

転載: blog.csdn.net/qq_45769063/article/details/125127706