def execute(db_util, directory): logger.info('start importing db schema ...') cmd_template = ''.join([ 'mysql -h', db_util.host, ' -P', db_util.port, ' -u', db_util.user, ' -p', db_util.password, ' --default-character-set=utf8', ' ', db_util.database, ' < {}' ]) baseline_home = os.sep.join([directory, 'baseline']) cmd = cmd_template.format(os.sep.join([baseline_home, 'schema.sql'])) if not common.execute_cmd(cmd): logger.warn('found error, abort ... ') return logger.info('start importing dictionary data ...') with open(os.sep.join([baseline_home, 'dictionary', 'dictionary.txt']), 'r') as dictionary_list: for dictionary in dictionary_list.read().splitlines(): if common.is_skipped_line(dictionary): continue cmd = cmd_template.format( os.sep.join([baseline_home, 'dictionary', dictionary + '.sql'])) logger.info('importing dictionary data [%s]', dictionary) if not common.execute_cmd(cmd): logger.info('found error, abort ... ') return logger.info(common.adjust_message('import dictionary data completely'))
def execute_cmd(cmd): p = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE) std_output, error_output = p.communicate() logger.info("start run cmd:" + cmd) if has_error(error_output): logger.info("error: " + error_output.decode("utf8")) return False return True
def execute(db_util, script_home, version): logger.info('start updating ...') logger.info('script home: %s', script_home) logger.info('dbInfo:host=[%s],dbName=[%s],user=[%s]', db_util.host, db_util.port, db_util.user) logger.info('get versions to be updated') version_list = [] if version is None: for t_version_no in os.listdir(script_home): if not os.path.isdir(os.sep.join([script_home, t_version_no])): continue add_version_no(version_list, t_version_no) else: add_version_no(version_list, version) logger.info('version to be updated: %s', version_list) for version_no in version_list: if not exec_version(script_home, db_util, version_no): break db_util.close() logger.info('Database has been updated.')
def exec_version(script_home, db_util, version_no, db_data=None): logger.info('start updating [%s] ...', version_no) version_directory = os.sep.join([script_home, version_no]) script_path = os.sep.join([version_directory, 'script.txt']) logger.info(script_path) if os.path.exists(script_path): # no script.txt, skip db_list = [] if db_data and version_no in db_data: db_list = db_data[version_no] else: temp_list = db_util.query( 'select script from script_history where version = %s', [version_no]) for i in temp_list: db_list.append(i[0]) logger.info('read script.txt in [%s]', script_path) line = open(script_path, 'r') sql_list = line.read().splitlines() logger.info('script.txt has %s sql files', len(sql_list)) for sql_file_name in sql_list: if sql_file_name[0] == '#': continue sql_file = os.sep.join([version_directory, sql_file_name]) if sql_file_name in db_list: logger.info( 'The script file [%s] was executed before, just ignore it!', sql_file) else: logger.info('start running script file [%s] ...', sql_file) cmd = 'mysql ' + \ '-h' + db_util.host + \ ' -P' + db_util.port + \ ' -u' + db_util.user + \ ' -p' + db_util.password + \ ' ' + db_util.database +\ ' < ' + sql_file if common.execute_cmd(cmd): sql = 'insert into script_history(version, script, create_time) values(%s, %s, now())' db_util.execute_sql(sql, [version_no, sql_file_name]) else: # todo ask user whether execute other scripts return False else: logger.info('Did not find script.txt in directory [%s].', script_path) return True
def execute(db_util, script_home): baseline_home = os.sep.join([script_home, 'baseline']) check_output_path(baseline_home) logger.info('start dumping database schema ...') create_schema_cmd = ''.join([ 'mysqldump --skip-add-drop-table -d -h', db_util.host, ' -P', db_util.port, ' -u', db_util.user, ' -p', db_util.password, ' ', db_util.database, ' > ', os.sep.join([baseline_home, 'schema.sql']) ]) if not common.execute_cmd(create_schema_cmd): logger.info('found error during dumping, abort...') return logger.info('...........start dumping dictionary data...................') cmd_template = ''.join(['mysqldump -t --extended-insert --complete-insert -h', db_util.host, ' -P', db_util.port, ' -u', db_util.user, ' -p', db_util.password, ' ', db_util.database, ' {} > {}']) with open(os.sep.join([baseline_home, 'dictionary', 'dictionary.txt']), 'r') as dictionary_list: for dictionary in dictionary_list.read().splitlines(): if common.is_skipped_line(dictionary): continue cmd = cmd_template.format(dictionary, os.sep.join([baseline_home, 'dictionary', dictionary + '.sql'])) logger.info(cmd) if not common.execute_cmd(cmd): logger.info('found error during dumping, abort...') return logger.info('...........dump dictionary data finished...........')