Psycopg2 Json

背景

团队大规模的使用 AWS 后果断无法忍受其多层次全方位多体位的计费算法!

所以,对结构化非关系型文本数据,自然的要进行归并:

分析

挖掘了一下 AWS 的现行数据储存服务:

参考:

折腾

问题来了, 怎么进行检验思路呢!?

青云

刚好 青云 发布了 Pg 的支持

创建 路由器 创建 私有网络 连接 私有网络<->路由器 创建 数据库 绑定 私有网络 申请 公网IP 配置 路由器 端口转发 数据库内部网络端口

BINGO!

$ psql -h 公网IP -U root postgres

就完成了远程接入!

小技巧:

先初始化测试表:

zoomq=# CREATE TABLE json_test (
      id serial primary key,
      data jsonb
    );

zoomq=# \d json_test
                         Table "public.json_test"
 Column |  Type   |                       Modifiers
--------+---------+--------------------------------------------------------
 id     | integer | not null default nextval('json_test_id_seq'::regclass)
 data   | json    |
Indexes:
    "json_test_pkey" PRIMARY KEY, btree (id)

zoomq=# INSERT INTO json_test (data) VALUES 
      ('{}'),
      ('{"a": 1}'),
      ('{"a": 2, "b": ["c", "d"]}'),
      ('{"a": 1, "b": {"c": "d", "e": true}}'),
      ('{"b": 2}');

zoomq=# SELECT * FROM json_test;
 id |                                data
----+---------------------------------------------------------------------
  1 | {}
  2 | {"a": 1}
  3 | {"a": 2, "b": ["c", "d"]}
  4 | {"a": 1, "b": {"c": "d", "e": true}}
  5 | {"b": 2}
(5 rows)

可以看到,可以很好的支持各种情况

psycopg2

当然的,作为一头 Pythoneer 肯定先用 py 来检验规划的 而针对 PostgreSQL, Psycopg 2 是绝对的首选模块.

import psycopg2
import psycopg2.extras

conn = psycopg2.connect("dbname=zoomq")
cur = conn.cursor()
cur.execute("SELECT * FROM json_test;")
data = cur.fetchall()
conn.commit()
print data

_sql = '''INSERT INTO json_test (data) VALUES('
        {"name":"张三"
            ,"age":18
            ,"birthday":"2013-03-03"
        }
    ');'''
cur.execute(_sql)
cur.execute("SELECT * FROM json_test WHERE data ->> 'age' = '18';")
data = cur.fetchone()

conn.commit()
print data, type(data), data[1]['name']

# from psycopg2.extras.Jsonで辞書型を変換
cur.execute(u"INSERT INTO json_test(data) VALUES (%s)",
    [psycopg2.extras.Json({'age': 11
        , 'name':'是也乎'
        , "birthday":"2013-11-11"
        })
    ])
cur.execute("SELECT * FROM json_test WHERE data ->> 'age' = '11';")
data = cur.fetchone()

conn.commit()
print data, type(data), data[1]['name']

cur.close()
conn.close()
return None

执行后的 psql 查询结果

150212-test.png

可以看到 Pg 容忍了各种意外空格的 JSON 文本, 并依然能正确的返回为 Py 的数据对象!

TODO

参考:

是也乎

在这一快速验证过程中,相关的体验:

export DYLD_LIBRARY_PATH=/Applications/Postgres.app/Contents/Versions/9.3/lib:$DYLD_LIBRARY_PATH

否则, import psycopg2 是要失败的...

PS:

修订


Author: Zoom.Quiet /mail / gittip / github