python - 如何使用 postgresql 作为 python 的键值存储?
问题描述
我需要为我的键/值存储从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 ;-(
解决方案
您不得将 postgresql 用作键值存储。
键值存储(在极少数情况下除外)是围绕基于键组合的模式构建的,该模式在多维空间中布局数据,可能会或可能不会直接映射 SQL 表的概念。否则说,有一个数据库抽象存在于键值存储中。
没有足够的信息可以说,只需将键值存储替换为 2 列表。如果你这样做,你很可能会以两全其美的结局告终。
推荐阅读
- flutter - Flutter - 如何更改自定义类小部件中的变量
- c# - 无法引用引用的项目
- sequelize.js - 将模型附加到 Sequelize 对象
- node.js - Nestjs中的套接字挂起用于使用minio客户端上传文件
- javafx - 表格视图在使用滚动条滚动时随机更新
- javascript - 在nodejs中通过蓝牙接收音乐
- php - PHP更新记录按钮未将信息传递到另一个页面
- npm - 无法使用 npm start 启动 react app 的本地开发服务器
- apache-spark - 为什么 Spark 部署不需要安装 Scala?
- arrays - 程序中的 C 内存泄漏