可以使用 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/