為了做數據對象的版本控制,需要將MySQL數據庫中的表結構導出成文件進行版本化管理,試寫了一下,可以完整導出數據庫中的表結構信息
# -*- coding: utf-8 -*- import os import pymysql class DBTool: conn = None cursor = None def __init__(self,conn_dict): self.conn = pymysql.connect(host=conn_dict['host'], port=conn_dict['port'], user=conn_dict['user'], passwd=conn_dict['password'], db=conn_dict['db'], charset=conn_dict['charset']) self.cursor = self.conn.cursor() def execute_query(self, sql_string): try: cursor=self.cursor cursor.execute(sql_string) list = cursor.fetchall() cursor.close() self.conn.close() return list except pymysql.Error as e: print("mysql execute error:", e) raise def execute_noquery(self, sql_string): try: cursor = self.cursor cursor.execute(sql_string) self.conn.commit() self.cursor.close() self.conn.close() except pymysql.Error as e: print("mysql execute error:", e) raise def main(): conn_dict = {'host': '127.0.0.1', 'port': 3306, 'user': '******', 'password': '******', 'db': 'test', 'charset': 'utf8'} conn = DBTool(conn_dict) sql_gettables = "select table_name from information_schema.`TABLES` WHERE TABLE_SCHEMA = 'databas_name';" list = conn.execute_query(sql_gettables) # 文件目標路徑,如果不存在,新建一個 mysql_file_path = 'D:\mysqlscript' if not os.path.exists(mysql_file_path): os.mkdir(mysql_file_path) mysqldump_commad_dict = {'dumpcommad': 'mysqldump --no-data ', 'server': '127.0.0.1', 'user': '******', 'password': '******', 'port': 3306, 'db': 'databse_name'} if list: for row in list: print(row[0]) # 切換到新建的文件夾中 os.chdir(mysql_file_path) #表名 dbtable = row[0] #文件名 exportfile = row[0] + '.sql' # mysqldump 命令 sqlfromat = "%s -h%s -u%s -p%s -P%s %s %s >%s" # 生成相應的sql語句 sql = (sqlfromat % (mysqldump_commad_dict['dumpcommad'], mysqldump_commad_dict['server'], mysqldump_commad_dict['user'], mysqldump_commad_dict['password'], mysqldump_commad_dict['port'], mysqldump_commad_dict['db'], dbtable, exportfile)) print(sql) result = os.system(sql) if result: print('export ok') else: print('export fail') if __name__ == '__main__': main()
建庫測試
create database test_database charset utf8mb4 collate utf8mb4_bin; use test_database; create table table_a ( id int auto_increment not null, name varchar(100) unique, create_date datetime, primary key pk_id(id), index idx_create_date(create_date) ); insert into table_a(name,create_date) values ('aaaaaa',now()); insert into table_a(name,create_date) values ('bbbbbb',now()); create table table_b ( id int auto_increment not null, name varchar(100) unique, create_date datetime, primary key pk_id(id), index idx_create_date(create_date) ); insert into table_b(name,create_date) values ('aaaaaa',now()); insert into table_b(name,create_date) values ('bbbbbb',now());
執行的時候會提示一個警告,但是不影響最終的結果
mysqldump: [Warning] Using a password on the command line interface can be insecure.
導出建表語句會根據表的數據情況編號自增列,這是mysqldump的問題而不是導出的問題,如果有必要可以需求做相應的修改
去掉mysqldump導出表結構中備注信息
import os filepath = "D:\\mysqlscript" # 切換到新建的文件夾中 os.chdir(filepath) pathDir = os.listdir(filepath) for file in pathDir: lines = open(file, "r") content = "use ***;" content = content + "\n" for line in lines: print(line) if not (str(line).startswith("--") or str(line).startswith("/*") ): if(line!="\n" and str(line).startswith(") ENGINE")): content = content +"\n"+ ")" else: content = content + line #將提煉后的內容重新寫入文件 print(content) fp = open(file, 'w') fp.write(content) fp.close()