Python 2.7中如何将SQL*Plus输出转换为二维元组
解决SQL*Plus输出转二维元组的问题
我太懂这种痛苦了——SQLPlus默认的格式化输出简直是处理数据的噩梦!不过咱们可以通过调整SQLPlus的输出配置,再配合简单的字符串处理,完美转换成你想要的二维元组格式。
第一步:先让SQL*Plus输出结构化数据
首先修改你的SQL命令,添加几个SQL*Plus的环境设置,把输出改成用分隔符分隔的格式,彻底摆脱那些乱七八糟的对齐线和换行:
sqlCommand = """SET ECHO OFF SET FEEDBACK OFF SET HEAD ON SET COLSEP '|' SET LINESIZE 2000 SET TRIMSPOOL ON SET TRIMOUT ON SET UNDERLINE OFF select PERSONID, PAYROLLNUMBER, EMPLOYEEPREFIX, LASTNAME, FIRSTNAME, MI, ACTIVE, UN_ID from <database-name-removed> where payrollnumber in (1111); EXIT; """
给你解释下这些设置的作用:
SET ECHO OFF:不显示执行的命令本身SET FEEDBACK OFF:去掉"X rows selected"这类没用的提示SET HEAD ON:保留表头行SET COLSEP '|':用竖线作为列分隔符,你可以换成任何不会出现在数据里的特殊符号(比如^或者|||)SET LINESIZE 2000:设置足够宽的行宽,避免列内容被强制换行SET TRIMSPOOL ON/SET TRIMOUT ON:自动去掉字段前后的空格SET UNDERLINE OFF:直接干掉表头下面那条烦人的分隔线
第二步:编写输出解析函数
接下来修改你的查询函数,再新增一个解析输出的函数,把SQL*Plus返回的字符串转换成目标格式:
from subprocess import Popen, PIPE def runSqlQuery(sqlCommand, connectString): # 添加text=True,直接返回字符串而非字节流,省得手动解码 session = Popen(['sqlplus', '-S', connectString], stdin=PIPE, stdout=PIPE, stderr=PIPE, text=True) stdout, stderr = session.communicate(input=sqlCommand) return stdout, stderr def parse_sqlplus_output(output): # 按行分割,过滤掉空行和无效行 lines = [line.strip() for line in output.split('\n') if line.strip()] if not lines: return () # 空结果返回空元组 # 解析表头:分割后去掉每个列名的多余空格 headers = [col.strip() for col in lines[0].split('|')] # 解析数据行:分割后把空字段转成空字符串 data_rows = [] for line in lines[1:]: row = [col.strip() if col.strip() else '' for col in line.split('|')] data_rows.append(row) # 组合成二维元组返回 return tuple([headers] + data_rows)
第三步:调用示例
现在你可以这样使用这套工具:
username = "你的用户名" password = "你的密码" connectString = f"{username}/{password}@SERVER" # 这里用上面修改后的sqlCommand queryResult, errorMessage = runSqlQuery(sqlCommand, connectString) # 先检查错误 if errorMessage: print(f"执行出错:{errorMessage}") else: result_tuple = parse_sqlplus_output(queryResult) print(result_tuple)
运行后你会得到完全符合预期的结果:
(['PERSONID', 'PAYROLLNUMBER', 'EMPLOYEEPREFIX', 'LASTNAME', 'FIRSTNAME', 'MI', 'ACTIVE', 'UN_ID'], ['11111', '99999', '', 'NEWMAN', 'ALFRED', '', '1', ''])
额外小提示
- 如果你的数据里可能出现
|,记得换成更特殊的分隔符,比如### - 这个方案支持多行数据返回,不管查出来几条记录都能正确解析
- 一定要处理
errorMessage,SQL语法错误或者权限问题都会在这里返回提示
内容的提问来源于stack exchange,提问作者TronixA
相关产品推荐
相关产品推荐

