开源之夏
项目经验分享
2023 #05
# 项目基本信息
https://summer-ospp.ac.cn/org/prodetail/23c9e0545
1. 项目描述
2. 项目实现思路
首先需要进行数据库连接配置文件设置,确保配置文件的可管理性和易扩展性,将配置文件放置在一个统一的位置,以确保用户可以正确连接到数据库,随后通过执行系统命令连接到 openGauss 数据库并执行 SQL 命令。它接受一个 SQL 命令作为参数,构建完整的命令,并使用 Python 的 subprocess 模块执行并返回执行命令的结果。
def execute_database_command(command):
"""
连接到OpenGauss数据库并执行命令.
:param command: string, SQL命令
:return:
string, 执行命令的结果
"""
# 构建连接命令
connect_command = f'gsql -d {database} -p {port}'
# 构建完整命令
full_command = f'{connect_command} -c "{command};"'
# 执行命令并获得输出
output = subprocess.getoutput(full_command)
return output
随后梳理常用的运维和优化功能,如参数修改、性能查看、故障处理等分类,整理相关的命令或 SQL 语句,需要深入了解数据库管理的常见任务和需求,并通过合适的资源整理出相关的命令或 SQL 语句。按照要求实现相关功能,如查看对象大小、创建快照、查看长 SQL、查看数据库负载等。
def all_tables_def(show_help=False):
"""
查看所有表的定义语句, 并通过prettyTable格式化输出.
:param show_help: boolean, 是否显示帮助信息
:return:
若show_help为true,返回命令帮助
"""
if show_help:
return "\n"+ "命令说明:".rjust(30)+"查看所有表的定义语句"
command = f"SELECT pg_get_tabledef(c.oid) " \
f"FROM pg_catalog.pg_class c " \
f"WHERE c.relkind='r' AND c.relname NOT LIKE 'pg_%' AND c.relname NOT LIKE 'sql_%' " \
f"ORDER BY c.relname;"
output = execute_database_command(command)
pretty_print(output)
接下来通过 prettytable 模块对命令执行的输出进行格式化处理,提高输出结果的可读性和可视化程度,将文本数据以表格的形式呈现,使数据更加清晰和易于理解。
def pretty_print(str):
"""
使用prettytable格式化输出结果.
:param str: string, 执行命令获取的结果
:return:
string,输出结果
"""
rows = []
for line in str.splitlines():
if "|" in line:
line = "dummy_clo | " + line
rows.append([val.strip() for val in line.split("|")[1:]])
if len(rows) == 0:
print("\033[31m" + str + "\033[0m")
return
table = PrettyTable()
i = 1
for row in rows:
if i == 1:
row = [s.upper() for s in row]
table.field_names = row
else:
table.add_row(row)
i = i + 1
table.align = "l" #设置左对齐
print(table)
最后考虑错误处理和容错机制。例如,当用户使用未定义的标识符或配置错误的 SQL 时,系统应该给出相应的错误提示,避免执行不正确的 SQL 语句或命令。
--参与开源社区--
--收获与寄语--
本文分享自微信公众号 - openGauss(openGauss)。
如有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。