自动化执行 SQL 脚本解决方案

自动化执行 SQL 脚本解决方案

手动登录多个库和数据源执行 SQL 脚本非常繁琐,以下是解决此问题的几种自动化方案。


目标:让 SQL 脚本自动化执行

方案 1:使用 Python 脚本连接并执行 SQL

Python 可以通过数据库连接库(如 pyodbcpymysql)来自动化连接和执行 SQL 脚本。

Python 自动执行 SQL 脚本
python 复制代码
import pyodbc
import time

# 数据库连接配置
DATABASES = [
    {"name": "Database1", "dsn": "DSN1", "username": "user1", "password": "pass1"},
    {"name": "Database2", "dsn": "DSN2", "username": "user2", "password": "pass2"},
    # 按需添加更多数据库
]

# SQL 脚本文件路径
SQL_FILE_PATH = "upgrade_script.sql"

def execute_sql_script(connection, sql_file_path):
    with open(sql_file_path, "r") as file:
        sql_script = file.read()
        cursor = connection.cursor()
        for statement in sql_script.split(";"):  # 按分号拆分 SQL 语句
            if statement.strip():
                print(f"Executing: {statement.strip()[:50]}...")
                cursor.execute(statement)
        connection.commit()

def main():
    for db in DATABASES:
        try:
            print(f"Connecting to {db['name']}...")
            connection = pyodbc.connect(
                f"DSN={db['dsn']};UID={db['username']};PWD={db['password']}"
            )
            execute_sql_script(connection, SQL_FILE_PATH)
            print(f"Finished executing script on {db['name']}.")
        except Exception as e:
            print(f"Error on {db['name']}: {e}")
        finally:
            if connection:
                connection.close()
    print("All databases updated successfully!")

if __name__ == "__main__":
    start_time = time.time()
    main()
    print(f"Execution completed in {time.time() - start_time:.2f} seconds.")
配置说明
  1. 数据库连接
    • DSN 是数据库的 ODBC 数据源名称。如果未配置 DSN,可以直接用 hostport 替代。
    • 替换 usernamepassword 为对应的凭据。
  2. SQL 脚本路径
    • 将升级的 SQL 脚本保存为 upgrade_script.sql 文件。
  3. 数据库类型支持
    • 针对不同数据库(如 MySQL、PostgreSQL、SQL Server),使用合适的 Python 库:
      • MySQL : 使用 pymysqlmysql-connector-python
      • PostgreSQL : 使用 psycopg2
      • SQL Server : 使用 pyodbc

方案 2:批量执行 SQL 脚本(Shell 或批处理)

如果 Python 不是首选,可以使用 Shell 或批处理文件实现。

示例:使用 mysql 命令行工具
bash 复制代码
#!/bin/bash

# 数据库配置
DATABASES=(
  "Database1 -uuser1 -ppass1"
  "Database2 -uuser2 -ppass2"
)

# SQL 脚本路径
SQL_FILE="upgrade_script.sql"

# 遍历所有数据库并执行脚本
for db in "${DATABASES[@]}"; do
  echo "Executing script on $db..."
  mysql $db < $SQL_FILE
done

echo "All databases updated successfully!"

方案 3:数据库管理工具的自动化支持

许多数据库管理工具(如 Navicat、DBeaver、DataGrip)支持批量运行 SQL 脚本,具体操作如下:

  1. 将所有数据库连接添加到工具中。
  2. 打开 SQL 脚本窗口。
  3. 配置脚本运行顺序,一次性执行。

方案 4:分布式数据库管理工具

如果项目需求频繁升级,可以考虑引入分布式数据库管理工具,比如:

  • Flyway(数据库迁移工具)
  • Liquibase(版本控制和变更管理)
  • 这些工具可以让 SQL 脚本的执行更加标准化、版本化和自动化。

最终效果

通过上述方案,您可以实现以下目标:

  • 节约时间:减少手动登录和执行的频率。
  • 减少出错:避免重复手动输入可能带来的操作错误。
  • 提升效率:从 40 分钟缩短到几分钟即可完成。

相关推荐
小开不是小可爱3 分钟前
leetcode_454. 四数相加 II_java
java·数据结构·算法·leetcode
Koma-forever4 分钟前
java设计模式-原型模式
java·设计模式·原型模式
magic 24528 分钟前
MyBatis的缓存、逆向工程、使用PageHelper、使用PageHelper
java·spring·maven·mybatis
神经星星34 分钟前
【vLLM 学习】API 客户端
数据库·人工智能·机器学习
小光学长1 小时前
基于flask+vue框架的助贫公益募捐管理系统1i6pi(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。
数据库
XiaoLeisj1 小时前
【图书管理系统】深入解析基于 MyBatis 数据持久化操作:全栈开发图书管理系统:查询图书属性接口(注解实现)、修改图书属性接口(XML 实现)
xml·java·数据库·spring boot·sql·java-ee·mybatis
癞皮狗不赖皮1 小时前
WEB攻防-Java安全&JNDI&RMI&LDAP&五大不安全组件&RCE执行&不出网&不回显
java·jndi注入·rce代码执行
喵手1 小时前
开启多个线程,如果保证顺序执行,你知道有哪几种方式实现?
java·后端·java ee
Alt.92 小时前
SpringMVC基础一(SpringMVC运行原理)
数据库·spring·mvc
程序员JerrySUN2 小时前
设计模式 Day 6:深入讲透观察者模式(真实场景 + 回调机制 + 高级理解)
java·观察者模式·设计模式