代码之家  ›  专栏  ›  技术社区  ›  sds Niraj Rajbhandari

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

  •  0
  • sds Niraj Rajbhandari  · 技术社区  · 7 年前

    我需要从 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 为这些简单的键值操作生成)。

    有更好的办法吗?

    另外,我也可以用 psycopg 而不是 sqlalchemy 直接,但那会让我编写sql 我自己 ;。-(

    1 回复  |  直到 7 年前
        1
  •  0
  •   amirouche    7 年前

    不能将PostgreSQL用作键值存储。

    键值存储区(在少数情况下除外)是围绕基于键组合的模式构建的,键组合将数据布局在多维空间中,多维空间可能直接映射SQL表的概念,也可能不直接映射SQL表的概念。否则,有一个数据库抽象存在于键值存储中。

    没有足够的信息可以说明,只需用一个2列表替换键值存储。如果你那样做,你将最有可能以两个世界中最糟糕的结局而告终。