如何从python使用postgresql作为键值存储?

时间:2018-07-16 22:11:07

标签: python postgresql sqlalchemy psycopg2 key-value-store

我需要将我的键/值存储区从gdbm转换为postgresql

看来我将不得不替换

import dbm.gnu

def get_value(db, key):
    return json.loads(db[key])

db = dbm.gnu.open(...)
v = get_value(db, "foo")

使用

import sqlalchemy
from sqlalchemy import Column, Text
from sqlalchemy.dialects.postgresql import JSONB

db = sqlalchemy.create_engine("...")
engine = db.connect()
meta = sqlalchemy.MetaData(engine)

id_col = Column('id', Text, primary_key=True)
data_col = Column('data', JSONB)
sqlalchemy.Table("my_table", meta, id_col, data_col)

meta.create_all()

# populate the table with 40M "id"-->JSON records
engine.execute(
    my_table.update(),
    id="foo",
    data={"a":3, "b":17, "c":[2,6,0]})

my_table = sqlalchemy.table("my_table", id_col, data_col)

def get_value(db, key):
    res = engine.execute(db.select().where(db.c.id == key)).fetchall()
    assert len(res) == 1
    return res[0][1]

v = get_value(my_table)

这看起来有些吓人(特别是如果我添加echo并查看所有SQL 为这些简单的键值操作生成的。)

有更好的方法吗?

PS。我也可以直接使用psycopg而不是sqlalchemy,但这会让我写SQL 我自己;-(

1 个答案:

答案 0 :(得分:0)

您不得将postgresql用作键值存储。

键值存储(在极少数情况下除外)围绕基于键组合的架构进行构建,该键组合将数据布置在多维空间中,而多维空间可能会或可能不会直接映射SQL表的概念。换句话说,键值存储中存在一个数据库抽象。

没有足够的信息说,只需将键值存储替换为2列表即可。如果这样做,您很可能会陷入两全其美的境地。