当前位置: 首页 > news >正文

在没有客户端的客户环境下,如何用 Python 一键执行 MySQL 与达梦数据库 SQL

在客户现场做运维时,大家是不是经常会遇到这种尴尬场景:

  • 没有图形化的数据库客户端
  • 自带的数据库终端又超级难用

这时候,如果能有一个小巧的工具,直接在命令行里执行 SQL,是不是会方便很多?今天这篇文章,就带大家看看如何用 Python 脚本 + PyInstaller 打包成可执行文件,一键搞定 MySQL 和达梦(DM)数据库的 SQL 执行。


环境准备

首先你需要一个 Linux 环境,并且提前安装好 conda。本文示例在 x86 和 ARM 架构都测试过。

创建 Python 环境:

conda create -n exec-sql python=3.10
conda activate exec-sql

安装依赖(目前仅支持 MySQL 和 DM,如需扩展可自行修改):

pip install -i https://pypi.tuna.tsinghua.edu.cn/simple pymysql dmPython pyinstaller

Python 脚本实现

核心思路很简单:

  1. argparse 解析命令行参数
  2. 根据选择的数据库类型建立连接
  3. 支持执行 单条 SQLSQL 文件
  4. 打印结果

下面是完整的脚本(可直接使用):

# exec_sql.py
import argparse
import pymysql
import dmPython
import os
from pymysql import OperationalError as MySQLError
from dmPython import Error as DMErrordef exec_and_print(cursor, sql):cursor.execute(sql)if cursor.description:columns = [col[0] for col in cursor.description]rows = cursor.fetchall()print("执行结果:")print(" | ".join(columns))print("-" * 50)for row in rows:print(" | ".join(str(col) for col in row))else:print("SQL 执行成功,没有返回结果。")def execute_sql_from_file(cursor, sqlfile):if not os.path.exists(sqlfile):print(f"SQL 文件不存在: {sqlfile}")returnwith open(sqlfile, "r", encoding="utf-8") as f:sql_script = f.read()for stmt in sql_script.split(";"):stmt = stmt.strip()if stmt:print(f"执行文件中的 SQL: {stmt}")exec_and_print(cursor, stmt)def test_db_connection(db_type, host, port, dbname, user, password, sql=None, sqlfile=None):try:if db_type == "mysql":conn_params = {"host": host, "port": port, "user": user, "password": password, "connect_timeout": 5}if dbname:conn_params["database"] = dbnameconnection = pymysql.connect(**conn_params)print("成功连接到 MySQL 数据库!")elif db_type == "dm":connection = dmPython.connect(user=user, password=password, server=host, port=port)if dbname:cursor = connection.cursor()cursor.execute(f"set schema {dbname}")cursor.close()print("成功连接到 达梦(DM) 数据库!")else:raise ValueError("不支持的数据库类型")cursor = connection.cursor()if sql:print(f"执行 SQL: {sql}")exec_and_print(cursor, sql)if sqlfile:execute_sql_from_file(cursor, sqlfile)cursor.close()connection.close()except (MySQLError, DMError) as e:db_name = "MySQL" if db_type == "mysql" else "达梦(DM)"print(f"无法连接到 {db_name} 数据库。错误信息:", e)if __name__ == "__main__":parser = argparse.ArgumentParser(description="测试 MySQL 或 达梦(DM) 数据库连接并执行 SQL")subparsers = parser.add_subparsers(dest="db_type", required=True, help="选择数据库类型:mysql 或 dm")# MySQLmysql_parser = subparsers.add_parser("mysql", help="测试 MySQL 连接并执行 SQL")mysql_parser.add_argument("--host", required=True)mysql_parser.add_argument("--port", type=int, default=3306)mysql_parser.add_argument("--dbname")mysql_parser.add_argument("--user", required=True)mysql_parser.add_argument("--password", required=True)mysql_parser.add_argument("--sql")mysql_parser.add_argument("--sqlfile")# DMdm_parser = subparsers.add_parser("dm", help="测试 达梦(DM) 连接并执行 SQL")dm_parser.add_argument("--host", required=True)dm_parser.add_argument("--port", type=int, default=5236)dm_parser.add_argument("--dbname")dm_parser.add_argument("--user", required=True)dm_parser.add_argument("--password", required=True)dm_parser.add_argument("--sql")dm_parser.add_argument("--sqlfile")args = parser.parse_args()test_db_connection(args.db_type, args.host, args.port, args.dbname, args.user, args.password, args.sql, args.sqlfile)

参数说明

参数名是否必填说明默认值示例值
--host数据库主机名或 IP-192.168.1.13
--port数据库端口3306 / 523633066
--dbnameMySQL 库名 / DM Schema-testdb
--user用户名-root / SYSDBA
--password密码-123456
--sql要执行的 SQL-"show databases"
--sqlfileSQL 文件路径-./init.sql

⚠️ 注意事项:

  • --sql--sqlfile 不能同时用。
  • 在 DM 数据库中,--dbname 代表 Schema 名。
  • 在 MySQL 中,--dbname 可选,不写时可以直接查询全局数据。

示例用法

# 查询 MySQL 所有数据库
python exec_sql.py mysql --host 192.168.1.13 --port 33066 --user root --password 123456 --sql "show databases"# 执行 SQL 文件
python exec_sql.py mysql --host 127.0.0.1 --port 3306 --dbname testdb --user root --password 123456 --sqlfile ./init.sql# 查询达梦数据库表
python exec_sql.py dm --host 192.168.11.72 --port 5236 --dbname datamask_web --user SYSDBA --password SYSDBA --sql "select * from job_jdbc_datasource"# 执行达梦 SQL 文件
python exec_sql.py dm --host 192.168.11.72 --port 5236 --dbname DATAMASK_WEB --user SYSDBA --password SYSDBA --sqlfile ./init.sql

打包成可执行文件

安装 staticx,把 glibc 链接库也打包进去,避免环境差异:

pip install -i https://pypi.tuna.tsinghua.edu.cn/simple staticx
sudo apt-get install patchelf musl-tools -y

打包:

pyinstaller -F exec_sql.py
staticx dist/exec_sql dist/exec_sql_static

这时 dist/exec_sql_static 就是最终的可执行文件。


验证效果

运行:

./exec_sql_static mysql --host 192.168.1.13 --port 33066 --user root --password 123456 --sql "show databases"

只要能正常打印数据库列表,就说明工具搞定啦


总结

通过这样一个小工具,我们可以:

  • 无需图形化客户端
  • 跨平台(x86 / ARM)
  • 一键执行 SQL 或 SQL 文件

非常适合在客户环境下的应急运维场景!

http://www.dtcms.com/a/342306.html

相关文章:

  • 【开源项目】边浏览边学外语:开源工具 Read Frog 如何用 AI 重构语言学习
  • Java实战:深度解析SQL中的表与字段信息(支持子查询、连接查询)
  • 粗粮厂的基于flink的汽车实时数仓解决方案
  • Elasticsearch Ruby 客户端elasticsearch / elasticsearch-api
  • 小程序UI(自定义Navbar)
  • 【TrOCR】用Transformer和torch库实现TrOCR模型
  • yggjs_rlayout 科技风主题布局使用教程
  • StarRocks不能启动 ,StarRocksFe节点不能启动问题 处理
  • macos使用FFmpeg与SDL解码并播放H.265视频
  • 【TrOCR】模型预训练权重各个文件说明
  • 从800米到2000米:耐达讯自动化Profibus转光纤如何让软启动器效率翻倍?
  • 表达式(CSP-J 2021-Expr)题目详解
  • Django的生命周期
  • 如何在DHTMLX Scheduler中实现带拖拽的任务待办区(Backlog)
  • 非常飘逸的 Qt 菜单控件
  • logger级别及大小
  • 如何安装和配置W3 Total Cache以提升WordPress网站性能
  • C++设计模式--策略模式与观察者模式
  • 小红书AI落地与前端开发技术全解析(From AI)
  • Python 正则表达式(更长的正则表达式示例)
  • 【基础排序】CF - 赌场游戏Playing in a Casino
  • 机器学习4
  • 精算中的提升曲线(Lift Curve)与机器学习中的差别
  • 网络打印机安装操作指南
  • 健康常识查询系统|基于java和小程序的健康常识查询系统设计与实现(源码+数据库+文档)
  • CentOS7安装部署PostgreSQL
  • 《PostgreSQL内核学习:slot_deform_heap_tuple 的分支消除与特化路径优化》
  • ES_文档
  • 2025-08-21 Python进阶6——迭代器生成器与with
  • Python项目开发- 动态设置工作目录与模块搜索路径