【问题标题】:How to use postgresql as key-value store from python?如何使用 postgresql 作为 python 的键值存储?
【发布时间】:2018-12-24 12:40:43
【问题描述】:

我的键/值存储需要从 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 myself ;-(

【问题讨论】:

  • ORM 生成的 SQL 通常介于令人费解和彻头彻尾的可怕之间。如果您只是在纯键/值模式下使用 Postgres,我宁愿自己编写 SQL。或者只是不看 ORM 生成的代码 :)
  • JSON 对象是否共享一个公共架构?
  • 您没有使用 ORM。这些是所谓的核心构造:“SQLAlchemy 表达式语言提供了一个使用 Python 构造表示关系数据库结构和表达式的系统。这些构造被建模为尽可能接近底层数据库的那些构造,同时提供少量抽象数据库后端之间的各种实现差异。” Iow 你在某种程度上已经在自己编写 SQL。

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


【解决方案1】:

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

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

没有足够的信息可以说,只需将键值存储替换为 2 列表即可。如果你这样做,你很可能会以两全其美的结局告终。

【讨论】:

  • "您不能将 postgresql 用作键值存储。"除了,postgresql 有一个“hstore”数据类型,用于在单个 PostgreSQL 值中存储键/值对集,至少从 9.1 版开始,当前文档请参阅postgresql.org/docs/12/hstore.html
  • 就像我说的,没有足够的信息说用两列甚至 hstore 替换“gdbm”。 hstore 值能否处理比内存数据更大的数据?
猜你喜欢
  • 2018-04-24
  • 1970-01-01
  • 2022-08-16
  • 2021-11-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-05-27
相关资源
最近更新 更多