首页 > 编程问答 >如何从HANA数据库读取ODQDATA blob字段?

如何从HANA数据库读取ODQDATA blob字段?

时间:2024-07-27 12:50:57浏览次数:6  
标签:python gzip binary-data sap-erp odp

如何使用 gzip basXml 作为 python 格式反编译 SAP ERP 中的 blob 字段?就我而言,我想从 ODQDATA 表中读取字段“xdata”。

我尝试使用 gzip 和 zlib 解压该对象,但没有成功(BadGzipFile:不是 gzip 压缩文件)。 我自己也没有更多的想法了。

    import zlib
    import gzip
    import base64
    
    jdbcHostname = "xxx"
    jdbcPort = "xx"
    jdbcUrl = f"jdbc:sap://{jdbcHostname}:{jdbcPort}"
    
    jdbcUsername = "xx"
    jdbcPassword = "xx"
    
    query="SELECT * FROM SAPHANADB.ODQDATA LIMIT 1"
    
    df = spark.read \
            .format("jdbc") \
            .option("url", jdbcUrl) \
            .option("query", query) \
            .option("driver", "com.sap.db.jdbc.Driver") \
            .option("user", jdbcUsername) \
            .option("password", jdbcPassword) \
            .load()
    
    #for row in df.collect():
    for row in df.collect():
        blob_data = row["XDATA"]
        data = gzip.decompress blob_data)

你遇到的问题是,SAP HANA 中的 ODQDATA 表中的 XDATA 字段并非简单的 gzip 压缩数据。它实际上包含一个结构化的数据包,其中包含额外的元数据和可能经过不同压缩算法压缩的有效负载。

以下是读取 ODQDATA 表中 XDATA 字段并解压 basXML 内容的 Python 代码示例:

import struct
import zlib
import base64

import pyhdb

# 连接到 HANA 数据库
connection = pyhdb.connect(
    host="your_hana_host",
    port=3xx15,
    user="your_hana_user",
    password="your_hana_password"
)

# 查询 ODQDATA 表
cursor = connection.cursor()
cursor.execute("SELECT XDATA FROM SAPHANADB.ODQDATA LIMIT 1")
row = cursor.fetchone()

# 获取 XDATA 字段的原始字节
xdata = row[0]

# 解析 XDATA 结构
header_size = struct.unpack('>I', xdata[0:4])[0]
header = xdata[4:header_size + 4].decode('utf-8').split('\x00')
data_offset = header_size + 4
compressed_data_length = struct.unpack('>I', xdata[data_offset:data_offset + 4])[0]
compressed_data = xdata[data_offset + 4:data_offset + 4 + compressed_data_length]

# 检查压缩算法
compression_type = int(header[4])

# 解压缩数据
if compression_type == 0:
    # 未压缩
    uncompressed_data = compressed_data
elif compression_type == 1:
    # ZLIB 压缩
    uncompressed_data = zlib.decompress(compressed_data)
else:
    raise ValueError("Unsupported compression type: {}".format(compression_type))

# 解码 basXML
basxml = base64.b64decode(uncompressed_data).decode('utf-8')

# 打印 basXML 内容
print(basxml)

# 关闭数据库连接
cursor.close()
connection.close()

代码解释:

  1. 连接到 HANA 数据库: 使用 pyhdb 库连接到 HANA 数据库。
  2. 查询 ODQDATA 表: 使用 SQL 查询语句从 ODQDATA 表中检索 XDATA 字段。
  3. 解析 XDATA 结构:
    • 读取前 4 个字节以获取标头大小。
    • 使用标头大小提取标头并使用空字符('\x00')拆分。
    • 读取压缩数据长度。
    • 使用数据偏移量和压缩数据长度提取压缩数据。
  4. 检查压缩算法: 从标头中获取压缩类型。
  5. 解压缩数据: 根据压缩类型,使用 zlib.decompress() 解压缩数据。
  6. 解码 basXML: 使用 base64.b64decode() 解码解压缩后的数据。
  7. 打印 basXML 内容: 打印解码后的 basXML 内容。
  8. 关闭数据库连接: 关闭数据库连接。

注意:

  • 这个代码示例假设 XDATA 字段使用 ZLIB 压缩。如果使用其他压缩算法,则需要修改代码以使用相应的解压缩方法。
  • 需要安装 pyhdb 库。可以使用 pip install pyhdb 命令安装。

希望这个代码示例可以帮助从 HANA 数据库的 ODQDATA 表中读取并解压 basXML 数据。

标签:python,gzip,binary-data,sap-erp,odp
From: 77417236

相关文章

  • crontab 运行 .sh 文件调用 python 脚本
    我有一个pythonselenium脚本,可以打开chrome并为我运行一些自动化任务。在crontab中直接调用python可以使用下面的行。:10.0是我运行echo$DISPLAY时得到的值。我使用的是Ubuntu22.04.4LTS5823**2DISPLAY=:10.0/usr/bin/python3/home/user/Script......
  • Pythonanywhere - ping:套接字:不允许操作
    请帮忙。我有一个Telegram机器人,当我从Bash控制台启动他时,它每60秒ping一次静态IP-它工作正常,但每天停止工作一次。我尝试使用“始终开启任务”,但在日志文件中收到“ping:套接字:不允许操作”。我有5美元帐户,我能做什么?从Bash控制台运行时我看到的内容:---17......
  • python+flask计算机毕业设计社区疫情防控物资调配平台(程序+开题+论文)
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容研究背景近年来,全球公共卫生事件的频发,尤其是新冠疫情的爆发,对社区治理与应急响应能力提出了前所未有的挑战。社区作为疫情防控的第一线,其物资调配......
  • python+flask计算机毕业设计四川工商学院疫情防控系统的设计与实现(程序+开题+论文)
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容研究背景在全球新冠疫情持续蔓延的背景下,高校作为人员密集、流动性大的特殊场所,其疫情防控工作显得尤为重要。四川工商学院作为一所集教学、科研、......
  • python+flask计算机毕业设计企业人事管理系统(程序+开题+论文)
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容研究背景随着企业规模的不断扩大与业务复杂度的提升,传统的人事管理方式已难以满足现代企业对高效、精准、自动化管理的需求。企业人事管理涉及员工......
  • python+flask计算机毕业设计外卖食品安全监管微信小程序(程序+开题+论文)
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容研究背景随着移动互联网技术的飞速发展,外卖行业作为“互联网+餐饮”的典范,近年来呈现出井喷式增长态势,极大地便利了人们的日常生活。然而,外卖食品......
  • python+flask计算机毕业设计楼盘销售系统(程序+开题+论文)
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容研究背景随着房地产市场的蓬勃发展,楼盘销售作为房地产行业的重要环节,其管理效率与服务质量直接影响到企业的市场竞争力和客户满意度。传统的楼盘销......
  • python+flask计算机毕业设计基于web的小区疫情防控信息管理系统(程序+开题+论文)
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容研究背景随着全球公共卫生事件的频发,特别是新冠疫情的持续影响,小区作为城市管理的基础单元,其疫情防控工作显得尤为重要。传统的小区管理方式在面对......
  • Python 3 使用 super() 函数时出现“类型错误:__init__() 获得多个参数值”
    我正在使用继承的Python3编写一个OOP程序,当我尝试像这样初始化子类时遇到标题错误:classParent:def__init__(self,var1,var2):self.var1=var1self.var2=var2#moremethodsthattosomestuffclassChild(Parent):a=1#aan......
  • 为什么我会收到 Python IOError: [Errno 13] 写入文件时权限被拒绝?
    我不明白我做错了什么。我正在运行一些测试并将结果写入文件。写入文件的代码部分如下(在名为Tester的类中):@staticmethoddefprintHeader(resultsFileName):ifnotos.path.isfile(resultsFileName):#Thefiledoesnotexist,thus#......