json - postgres 存储对 json 中字段的引用

标签 json postgresql reference

可以使用 json 数据类型在 postgres 中存储 json。查看本教程以获取介绍:http://www.postgresqltutorial.com/postgresql-json/

假设我将以下 json 存储在这样的字段中:

{
  "address": {
    "street1": "123 seasame st"
  }
}

我想要一个单独存储对 street 字段的引用。例如,我可能有另一个对象正在使用来自此 json 结构的数据,并希望存储对它获取数据的位置的引用。也许是这样的:

class Product():
    __tablename__ = 'Address'

    street_1 = Column(String)
    data_source = ?

现在我可以让 data_source 成为一个字符串并只存储像 address.street 这样的命名空间,但是如果我这样做了,postgres 不知道这意味着什么。在查询中使用它意味着解析字符串和其他低效的东西。 postgres 是否支持引用存储在 json 数据结构中的字段?

这个问题与JSON foreign keys in PostgreSQL有关, 但在这种情况下,我不一定想要 fk 关系。我只想创建一个引用,它不一定像 fk 那样强制执行。

更新:

为了更清楚,我想在另一个属性上引用 json 结构中某些内容的位置并将该引用存储在列中。在下面的代码中,Address.data_source 是对街道数据位置的引用(例如本例中的 address.street1)

class Address():
    __tablename__ = 'Address'

    street_1 = Column(String)
    sample_id = Column(Integer, ForeignKey('DataSample.uid'))

    data_source = ?

class DataSample():
    __tablename__ = 'DataSample'
    uid = Column(Integer, primary_key=True)
    data = Column(JSONB)


body = {
  "address": {
    "street1": "123 seasame st"
  }
}

datasample = DataSample(data=body)
address = Address(street_1=datasample.data['address']['street_1'], 
                  sample_id=datasample.uid,
                  data_source=?)

最佳答案

如前所述,问题是寻找一种方法来灵活地指定特定记录的 JSON 对象中的路径。键在普通列中处理。 JSONB 字段的约束是 not available ,并且不支持在 JSON 对象中指定路径。

我在 SQL Fiddle 中使用了以下内容使用 PostgreSQL 9.6:

CREATE TABLE datasample (
  id integer PRIMARY KEY,
  data jsonb
);
CREATE TABLE address (
  id integer PRIMARY KEY,
  street_1 text,
  sample_id integer REFERENCES datasample (id),
  data_source text
);
INSERT INTO datasample(id, data) 
VALUES (1, '{"address":{"street_1": "123 seasame st"}}');
INSERT INTO address(id,street_1, sample_id, data_source) 
VALUES (1,'123 seasame st',1,'datasample.data->''address''->>''street''');

街道地址的典型查找(需要检索 street_1)类似于:

SELECT datasample.data->'address'->>'street_1' 
FROM datasample 
WHERE id=1;

没有用于标识列的特殊 postgres 类型。字符串是最接近的可用字符串(或字符串数​​组,或包含字符串的对象,如果其中之一可以简化解析)并使用它来构建查询。在第一个代码块中,我将其存储为 查询的(转义)片段 - 'datasample.data->''address''->>''street'''。虽然更长,但它只需要检索和转义即可在新的自定义查询中使用。我没有找到在同一 SQL 语句中将字符串用作片段的方法,尽管可以将它与其他文本位组合以形成可以通过 EXECUTE 运行的完整语句.

关于json - postgres 存储对 json 中字段的引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56432955/

相关文章:

json - 消息通知产生 "This content can' t 被显示”

JavaScript 不喜欢 hashes.to_json?

Javascript json,检查所有键是否未定义 ('null' )并设置默认值

c++ - 当我返回其引用时,如果超出范围,静态 std::vector 将取消

java - 如何在Okhttp中通过传递对象来发出POST请求?

php - PHP 文件中 PostgreSQL/PostGIS 查询中的变量

sql - 数组sql中最近的一天

postgresql - 双重类型的琐碎订单 : performance crash

reference - 为什么我可以返回对局部文字的引用而不是变量?

java - 如何通过类型签名搜索 Java API 方法?