【问题标题】:How to read column in postgres DB of data type BYTEA and encoding of compressed json using PYTHON如何使用 PYTHON 读取数据类型 BYTEA 的 postgres DB 中的列和压缩 json 的编码
【发布时间】:2020-11-09 03:15:02
【问题描述】:

我在 postgres 数据库中有一个数据类型为 bytea 的列,编码是压缩的 JSON。如何读取此列的值并在 Python 中获取正确的 json?

【问题讨论】:

  • JSON是怎么压缩的?你是如何在 Python 中访问数据库的?
  • 我在 python 代码中使用 Psycopg2 访问 postgres 数据库。另外,我不确定,但我认为压缩的 json 基本上只是一个 gzipped json
  • 那么您需要确定正在使用什么压缩,否则您不会走得太远。你能找出数据是如何输入到列中的吗?
  • 当然。我刚找到它。它正在使用 java 中的 GZipOutputStream 进行压缩。不确定这是否有帮助。

标签: python json postgresql compression bytea


【解决方案1】:

我现在没有时间给出一个完整的工作示例。相反,我将提供一个大纲:

  1. 从数据库中读取列
   data = cur.fetchone()[0]
  1. 使用 Python gzip 模块。

json_data = gzip.decompress(data)

其中 json_data 是一个字节对象。

  1. 使用 Python json 模块读取 json_data。

更新。 示例:

create table js_compressed(js_fld bytea);

js_str = b'[{"one": 1, "two": 2}, {"three": 3, "four": 4}]'
js_cmp = gzip.compress(js_str)
con = psycopg2.connect("dbname=test user=aklaver host=localhost") 
cur = con.cursor()
cur.execute("insert into js_compressed(js_fld) values(%s)", (psycopg2.Binary(js_cmp,),))
cur.execute("select js_fld from js_compressed limit 1")
js_fld = cur.fetchone()[0]
dc_fld = gzip.decompress(js_fld).decode()
json.loads(dc_fld)
[{'one': 1, 'two': 2}, {'three': 3, 'four': 4}]

【讨论】:

    【解决方案2】:

    但是 gzip.compress 和 decompress 方法没有显示。可能是我的 gzip 模块的版本问题。无论如何,我可以使用以下方式解压:

    1. 将列转换并存储为字节数组:-

         payload = bytearray(row[0]) 
      
    2. 为了解压,使用下面的代码 sn -p :

         fileobj = cStringIO.StringIO(payload)
         gzf = gzip.GzipFile('dummy-name', 'rb', 9, fileobj)
         decomprJson = gzf.read()
      

    【讨论】:

    • gzip.compress/decompress 可从 Python 3.2+ 获得。
    猜你喜欢
    • 2018-10-04
    • 1970-01-01
    • 2021-02-24
    • 2017-06-05
    • 1970-01-01
    • 2010-09-28
    • 1970-01-01
    • 2018-02-08
    • 2019-02-21
    相关资源
    最近更新 更多