python生成bat脚本,并且执行bat脚本
需求
关键词:python,sqllite,bat,进程
最近有一个需求,需要用python读取一个txt文件里的sql语句,用sqllite去执行,执行之前先备份一次sqllite数据库到临时目录。然后sql执行成功则删除临时文件,sql执行失败则使用备份的sqllite去覆盖掉当前错误的sqllite数据库。
关键点
- 生成临时目录。使用python的tempfile库
- 复制文件,使用python的shutil库
- 从文本中读取sql,使用open方法:
-
f = open(file_name, 'r') sql = f.read()
- 生成bat文件,也使用open方法。模式选择w
- bat命令中的暂停使用@ping -n 5 127.1 >nul 2>nul
- bat命令中的删除使用“del 路径”
- bat命令中的复制使用“copy 源文件 目标文件”
- bat命令执行完后,等待用户手动关闭使用pause,自动关闭使用exit
部分代码
# -*- coding: UTF-8 -*-
# 命名方式为表名_操作_字段
import os
import tempfile
import connectDB
from controller import fileController
curosrdiction = connectDB.curosr_diction
database_back_folder = ""
def exec_sql(sqltext):
'''
执行sql,成功返回true
:param sqltext: sql语句
:return:
'''
result = curosrdiction.executescript(sqltext)
curosrdiction.commit()
return result
def backup_database():
'''
备份数据库
:return:
'''
global database_back_folder
database_back_folder = tempfile.mkdtemp()
fileController.copy_file_to_folder('resource/sqllite.db', database_back_folder)
write_bat()
def restore_database():
'''
恢复数据库
:return:
'''
curosrdiction.close()
fileController.copy_file(srcfile=database_back_folder + "\\sqllite.db", dstfile='resource/sqllite.db')
def read_sql_from_text(file_name):
'''
从文本文件中读取sql并且执行,执行失败,就把原来的数据库覆盖回来
:param file_name:
:return:
'''
f = open(file_name, 'r')
sql = f.read()
if not exec_sql(sql):
run_bat()
def write_bat():
sql_database_path = os.getcwd() + "\\resource\\sqllite.db"
sql_database_path_shm = os.getcwd() + "\\resource\\sqllite.db-shm"
sql_database_path_wal = os.getcwd() + "\\resource\\sqllite.db-wal"
bat_name = 'copy.bat'
s1 = '''@echo off
@ping -n 5 127.1 >nul 2>nul
echo delete database...
del ''' + sql_database_path + '''
del ''' + sql_database_path_shm + '''
del ''' + sql_database_path_wal + '''
echo restore database...
@ping -n 5 127.1 >nul 2>nul
copy ''' + database_back_folder + "\\sqllite.db " + sql_database_path + '''
echo restore finish
pause'''
f = open(bat_name, 'w')
f.write(s1)
f.close()
def run_bat():
'''
运行bat
:return:
'''
os.system('start copy.bat')
def update_sql():
'''
开始更新数据库的主入口
:return:
'''
backup_database()
read_sql_from_text("resource/download/1.2.3_sql.txt")