【问题标题】:SQLALCHEMY: getting row ID from value inside key/value pairSQLALCHEMY:从键/值对中的值获取行 ID
【发布时间】:2017-03-23 17:12:59
【问题描述】:

我必须访问一个非常混乱的 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'

我可以获取所有具有“名称”条目的行,然后在 python 中循环查找“约翰”:

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

但我宁愿让数据库将其全部弄清楚并返回“PK”。有什么想法吗?

【问题讨论】:

  • 如果这些列是数组类型,你应该取消嵌套 em 并比较两列
  • {'John', 'Eng', '31'} 既不是文本[],也不是 JSON - 它只是一个文本 - 对吧?...
  • PGadmin 说他们是 text[]
  • 然后我猜数据填充错误 - a_val[1] 不是 John,而是 'John'... 无论如何 - 你可以使用 unnest,我在答案中发布了示例
  • 我从不相信注释代码的其他人那里继承了这个烂摊子,并且认为变量名是一种稀缺资源,应该尽可能多地重用......有很多错误。

标签: python postgresql sqlalchemy key-value


【解决方案1】:

如果将列转换为数组,则可以查询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)

【讨论】:

    猜你喜欢
    • 2020-08-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-10
    • 1970-01-01
    • 2015-02-13
    • 1970-01-01
    • 2019-07-23
    相关资源
    最近更新 更多