gpt4 book ai didi

python - SQLAlchemy 通过 JSON 子字段加入

转载 作者:行者123 更新时间:2023-12-04 04:10:39 24 4
gpt4 key购买 nike

我有一个现有的 SQLAlchemy 模型,它应该与另一个模型有关系,但是遗憾的是,连接点有一个 JSON PostgreSQL 列的(子)字段。

所以让我们说一个表“类别”是:

id(bigint) | name(string)
-------------------------
5 | Comics

...第二个表“英雄”是:
id(bigint) | name(string) | info(JSON)
-------------------------------------------------------------
2 | Tranquility | {"category_id":5, "genre_id": 17}

我将如何在 python SQLAlchemy&PostgreSQL9.5 中加入 categoryhero通过 heroinfo["category_id"]得到以下结果?
id(bigint) | name(string) | category_name | info(JSON)
-------------------------------------------------------------
2 | Tranquility | Comics | {"category_id":5, "genre_id": 17}

根据这个答案,我知道在 PostgreSQL 本身中这样的事情是可能的

https://dba.stackexchange.com/a/83935 ( http://sqlfiddle.com/#!15/226c33/1 )

并且可能需要一些类型转换或绕过默认方式的技巧
sqlalchemy filter by json field 中所述

注:请注意,我无法更改数据库结构或模型的现有部分,而且我也不是在寻找我已经知道的双重查询绕过。

最佳答案

您可以使用 json_to_record创建一个内存表,然后加入。

https://www.postgresql.org/docs/9.4/functions-json.html

另一个问题已经回答了这个问题,但使用的是 json_to_recordset因为数据是一个对象列表
https://stackoverflow.com/a/31333794/3358570

这是您可以根据需要转换为 sqlalchemy 的 SQL,

SELECT hero.id as hero_id, hero.name as name, d.name as category_name, info
FROM hero,
json_to_record(hero.info) AS x(category_id int)
JOIN category d on d.id = category_id

这里 db fiddle 给你
https://www.db-fiddle.com/f/7ops4KXVDF6KpY5JZau7vG/1

另一种更简单的方法是在 join 中访问 JSON 值并输入 caste category_id
SELECT hero.id       AS hero_id,
hero.name AS hero_name,
category.name AS category_name,
category.id AS category_id,
hero.info AS hero_info
FROM hero
JOIN category ON category.id = CAST(hero.info ->> 'category_id' AS INTEGER)

等效的 scalchemy 将成为,
category_id = cast(Hero.info.op("->>")("category_id"), Integer)
query = (db.session.query(Hero.id, Hero.name, Category.name, Category.id, Hero.info)
.join(Category, Category.id == category_id))
data = query.all()

关于python - SQLAlchemy 通过 JSON 子字段加入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61794338/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com