SQLALCHEMY:从键/值对中的值获取行ID

时间:2017-03-23 08:44:34

标签: python postgresql sqlalchemy key-value

我必须访问一个相当混乱的postgresql数据库。一个表有三列:

PK [PK]Bigint| a_key [PK] text[] | a_val text[]
1, {name, job, age}, {'John', 'Eng', '31'}
2, {job, ID}, {'IT', '1234'}
3, {ID, age, name, BFF}, {'4321', '22', 'Piet', 'John'}

我正在尝试在python中使用一些sqlalchemy来根据键/值对内的值找到行的主键:

RETURN PK where name == 'John'

我可以获取所有具有“name”条目的行,然后在python中执行循环以查找“John”:

obj = session.query(table).filter(table.c.a_key.any(u'name')).all()

但我宁愿让数据库把它全部弄清楚,只返回'PK'。有什么想法吗?

1 个答案:

答案 0 :(得分:0)

如果将列转换为数组,则可以查询unnest,如下所示:

t=# create table so28 (pk int,a_key text[],a_val int[]);
CREATE TABLE
t=# insert into so28 select ^C
t=# create table so29 (pk int,a_key text[],a_val text[]);                                                                          CREATE TABLE
t=# insert into so29 select 1,'{name, job, age}', $${'John', 'Eng', '31'}$$;
INSERT 0 1
t=# insert into so29 select 2,'{job, ID}', $${'IT', '1234'}$$;
INSERT 0 1
t=# insert into so29 select 3, '{ID, age, name, BFF}', $${'4321', '22', 'Piet', 'John'}$$;
INSERT 0 1
t=# with a as (select pk,unnest(a_key) k,unnest(a_val) v from so29)
select pk from a where k = 'name' and v = $$'John'$$;
 pk
----
  1
(1 row)