Lorsque je travaillais, la base de données utilisée dans l'environnement de test n'était pas cohérente avec la base de données de l'environnement de production lorsque la base de données de notre environnement de test a terminé le test et était prête à être mise à jour vers la base de données de production. environnement, nous devions préparer un script de mise à jour, si vous oubliez accidentellement de l'écrire, vous oublierez ce qui a été modifié et ce qui a été ajouté. C'est vraiment un casse-tête. J'ai donc essayé d'utiliser Python pour générer automatiquement des scripts de mise à jour afin d'éviter que ma mauvaise mémoire n'oublie des choses.
Les principales opérations sont les suivantes :
1. Ajoutez la méthode suivante au basedao.py d'origine, afin que les données de la base de données puissent être facilement obtenu pour les tests. La comparaison entre la base de données et la base de données de production a jeté les bases.
1 def select_database_struts(self): 2 ''' 3 查找当前连接配置中的数据库结构以字典集合 4 ''' 5 sql = '''SELECT COLUMN_NAME, IS_NULLABLE, COLUMN_TYPE, COLUMN_KEY, COLUMN_COMMENT 6 FROM information_schema.`COLUMNS` 7 WHERE TABLE_SCHEMA="%s" AND TABLE_NAME="{0}" '''%(self.__database) 8 struts = {} 9 for k in self.__primaryKey_dict.keys():10 self.__cursor.execute(sql.format(k))11 results = self.__cursor.fetchall()12 struts[k] = {}13 for result in results:14 struts[k][result[0]] = {}15 struts[k][result[0]]["COLUMN_NAME"] = result[0]16 struts[k][result[0]]["IS_NULLABLE"] = result[1]17 struts[k][result[0]]["COLUMN_TYPE"] = result[2]18 struts[k][result[0]]["COLUMN_KEY"] = result[3]19 struts[k][result[0]]["COLUMN_COMMENT"] = result[4]20 return self.__config, struts
2. Écrivez un script Python comparatif
1 ''' 2 数据库迁移脚本, 目前支持一下几种功能: 3 1.生成旧数据库中没有的数据库表执行 SQL 脚本(支持是否带表数据),生成的 SQL 脚本在 temp 目录下(表名.sql)。 4 2.生成添加列 SQL 脚本,生成的 SQL 脚本统一放在 temp 目录下的 depoyed.sql 中。 5 3.生成修改列属性 SQL 脚本,生成的 SQL 脚本统一放在 temp 目录下的 depoyed.sql 中。 6 4.生成删除列 SQL 脚本,生成的 SQL 脚本统一放在 temp 目录下的 depoyed.sql 中。 7 ''' 8 import json, os, sys 9 from basedao import BaseDao 10 11 temp_path = sys.path[0] + "/temp" 12 if not os.path.exists(temp_path): 13 os.mkdir(temp_path) 14 15 def main(old, new, has_data=False): 16 ''' 17 @old 旧数据库(目标数据库) 18 @new 最新的数据库(源数据库) 19 @has_data 是否生成结构+数据的sql脚本 20 ''' 21 clear_temp() # 先清理 temp 目录 22 old_config, old_struts = old 23 new_config, new_struts = new 24 for new_table, new_fields in new_struts.items(): 25 if old_struts.get(new_table) is None: 26 gc_sql(new_config["user"], new_config["password"], new_config["database"], new_table, has_data) 27 else: 28 cmp_table(old_struts[new_table], new_struts[new_table], new_table) 29 30 def cmp_table(old, new, table): 31 ''' 32 对比表结构生成 sql 33 ''' 34 old_fields = old 35 new_fields = new 36 37 sql_add_column = "ALTER TABLE `{TABLE}` ADD COLUMN `{COLUMN_NAME}` {COLUMN_TYPE} COMMENT '{COLUMN_COMMENT}';\n" 38 sql_change_column = "ALTER TABLE `{TABLE}` CHANGE `{COLUMN_NAME}` `{COLUMN_NAME}` {COLUMN_TYPE} COMMENT '{COLUMN_COMMENT}';\n" 39 sql_del_column = "ALTER TABLE `{TABLE}` DROP {COLUMN_NAME};" 40 41 if old_fields != new_fields: 42 f = open(sys.path[0] + "/temp/deploy.sql", "a", encoding="utf8") 43 content = "" 44 for new_field, new_field_dict in new_fields.items(): 45 old_filed_dict = old_fields.get(new_field) 46 if old_filed_dict is None: 47 # 生成添加列 sql 48 content += sql_add_column.format(TABLE=table, **new_field_dict) 49 else: 50 # 生成修改列 sql 51 if old_filed_dict != new_field_dict: 52 content += sql_change_column.format(TABLE=table, **new_field_dict) 53 pass 54 # 生成删除列 sql 55 for old_field, old_field_dict in old_fields.items(): 56 if new_fields.get(old_field) is None: 57 content += sql_del_column.format(TABLE=table, COLUMN_NAME=old_field) 58 59 f.write(content) 60 f.close() 61 62 def gc_sql(user, pwd, db, table, has_data): 63 ''' 64 生成 sql 文件 65 ''' 66 if has_data: 67 sys_order = "mysqldump -u%s -p%s %s %s > %s/%s.sql"%(user, pwd, db, table, temp_path, table) 68 else: 69 sys_order = "mysqldump -u%s -p%s -d %s %s > %s/%s.sql"%(user, pwd, db, table, temp_path, table) 70 os.system(sys_order) 71 72 def clear_temp(): 73 ''' 74 每次执行的时候调用这个,先清理下temp目录下面的旧文件 75 ''' 76 if os.path.exists(temp_path): 77 files = os.listdir(temp_path) 78 for file in files: 79 f = os.path.join(temp_path, file) 80 if os.path.isfile(f): 81 os.remove(f) 82 print("临时文件目录清理完成") 83 84 if __name__ == "__main__": 85 test1_config = { 86 "user" : "root", 87 "password" : "root", 88 "database" : "test1", 89 } 90 test2_config = { 91 "user" : "root", 92 "password" : "root", 93 "database" : "test2", 94 } 95 96 test1_dao = BaseDao(**test1_config) 97 test1_struts = test1_dao.select_database_struts() 98 99 test2_dao = BaseDao(**test2_config)100 test2_struts = test2_dao.select_database_struts()101 102 main(test2_struts, test1_struts)
Actuellement, ne prend en charge que la génération de 4 types de scripts SQL.
Si vous souhaitez apprendre et discuter de Python ensemble, vous pouvez rejoindre le groupe QQ : 626787819. Si vous avez des commentaires ou des suggestions, vous pouvez m'envoyer un e-mail : 410093793@qq.com.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!