【发布时间】: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