使用Python从PostgreSQL的bytea字段读取压缩包得到无效归档问题求助
问题排查与解决步骤
第一步:先确认存储的源数据合法性
存入压缩包前,先将待写入数据库的二进制流落地为本地zip文件,测试是否可正常解压。同时在PostgreSQL中执行如下命令查询该字段的字节长度,和原压缩包文件大小做对比:SELECT octet_length(ansiblezip) FROM library WHERE id = 对应记录ID;如果长度不一致,说明写入数据库的逻辑就存在数据丢失/损坏问题,优先排查写入流程。
第二步:修复SQL查询逻辑的安全与正确性问题
你当前使用的字符串拼接SQL方式存在SQL注入风险,且如果projectId包含特殊字符会导致SQL执行异常,甚至查询到错误数据,必须改为参数化查询:def getAnsibleByLibrary(projectId): con = psycopg2.connect( database="xyz", user="user", password="pwd", host="localhost", port="5432", ) print("Database opened successfully") cur = con.cursor() # 改用参数化查询,不要手动拼接SQL query = "SELECT ansiblezip FROM library WHERE library.id = (SELECT libraryid from project WHERE project.id = %s)" cur.execute(query, (projectId,)) rows = cur.fetchall() repository = rows[0][0] con.close() # 先检查zip文件头是否正确,正常zip开头十六进制为504b0304 print("文件头十六进制:", repository.hex()[:8]) # 转成bytes再写入,避免环境适配问题 with open("zippedOne.zip", "wb") as f: f.write(bytes(repository))第三步:验证读取内容的格式
执行上述代码后查看打印的文件头:- 如果不是
504b0304,说明你存入bytea字段的内容不是原生zip二进制,大概率是写入前做了base64编码或者其他转码操作,读取后需要做对应的解码操作才能得到正确的压缩包内容。 - 如果文件头正确,比对生成的
zippedOne.zip大小和数据库中查询的octet_length数值,二者一致的情况下压缩包必然可正常解压,如果还是报错可尝试更换解压工具验证。
- 如果不是
内容的提问来源于stack exchange,提问作者Gianluca
相关产品推荐
相关产品推荐

