MySQL 5.7 之前的版本在某些方面对存储过程的支持可能有限,通过 Python 脚本调用 SQL 文件是一种有效的方法来自动化数据库任务和提高运维效率。具体操作如下:
# python 执行sql脚本
def execute_sql_script(mysql_params, script_name):
# 使用 with 语句自动管理连接和游标的打开与关闭
try:
# 连接到数据库
with pymysql.connect(host=mysql_params.get('ip'),
user=mysql_params.get('username'),
port=mysql_params.get('port'),
password=mysql_params.get('passwd'),
database=mysql_params.get('database'),
cursorclass=pymysql.cursors.DictCursor) as connection:
with connection.cursor() as cursor:
# 读取 SQL 脚本文件
with open(script_name, 'r', encoding='utf-8') as file:
sql_script = file.read()
# 如果 SQL 脚本包含多条语句,可以使用 cursor.executemany(),但通常对于脚本文件,需要分割语句
# 这里我们假设脚本中的语句以分号结束(这可能需要额外的逻辑来正确处理包含分号但不应分割的情况)
statements = sql_script.split(';')
for statement in statements:
stripped = statement.strip()
if stripped: # 忽略空语句
try:
cursor.execute(stripped)
connection.commit() # 如果需要,提交更改
print(f"成功执行 SQL ") # 截断输出以避免过长
except pymysql.Error as e:
print(f"执行 SQL 语句时出错: {stripped[:100]}... 错误信息: {e}")
except Exception as e:
print(f"执行脚本 {script_name} 时发生错误: {e}")
调用方式如下:
if __name__=="__main__":
import datetime
from dateutil.relativedelta import relativedelta
now_time = datetime.datetime.now()
## 数据库链接信息
mysql_params_read = {'ip' : ip,
'port': 端口,
'username':用户名,
'passwd':密码,
'charset':'utf8',
'database': 数据库
}
execute_sql_script(mysql_params_read, '路径/文件名.sql')