使用PostgREST的RestAPI操作之 类型转JSON对象 | 嵌入视图
将类型转换为自定义JSON对象
使用PostgREST时,您可能已经注意到,当您期望使用JSON对象或数组时,某些PostgreSQL类型会转换为JSON字符串。例如,让我们看看范围类型的情况。
-- example taken from https://www.postgresql.org/docs/11/rangetypes.html#RANGETYPES-EXAMPLES
create table reservations (room int
, during tsrange
);insert intoreservations
values(1108, tsrange('2010-01-01 14:30', '2010-01-01 15:30'));
在这里,我们有一个名为列中的tsrange
类型,我们想通过PostgREST把它作为JSON。
curl "http://localhost:3000/reservations"
结果:
[{"room":1108,"during":"[\"2010-01-01 14:30:00\",\"2010-01-01 15:30:00\")"}
]
该期间的值可能不是你想要的格式。我们得到一个JSON字符串,因为默认情况下PostgreSQL通过使用其text
表示形式将类型转换为JSON 。我们可以通过创建CAST将此表示形式更改为自定义JSON对象。
要做到这一点,首先我们将定义将进行转换的功能tsrange
来json
。
create or replace function tsrange_to_json(tsrange) returns json as $$select json_build_object('lower', lower($1), 'upper', upper($1), 'lower_inc', lower_inc($1), 'upper_inc', upper_inc($1));
$$ language sql;
使用此功能,我们将创建CAST。
create cast (tsrange as json) with function tsrange_to_json(tsrange) as assignment;
然后我们将执行请求并转换列。
curl "http://localhost:3000/reservations?select=room,during::json"
现在的结果是:
[{"room":1108,"during":{"lower" : "2010-01-01T14:30:00","upper" : "2010-01-01T15:30:00","lower_inc" : true,"upper_inc" : false}}
]
您可以使用相同的想法为不同类型的用户创建自定义CAST。
注意
如果您不想为内置类型修改CAST,则可以选择 为自己的类型创建自定义类型,tsrange
然后添加自己的CAST。
create type mytsrange as range (subtype = timestamp, subtype_diff = tsrange_subdiff);-- define column types and casting function analoguously to the above example
-- ...create cast (mytsrange as json) with function mytsrange_to_json(mytsrange) as assignment;
从另一个模式嵌入表
假设您在模式中有一个人表,public
并且该模式是通过PostgREST的db-schema公开的。
create table public.people(id int primary key , full_name text );
而你要嵌入的人用表的细节表在另一个名为架构private
。
create schema if not exists private;-- For simplicity's sake the table is devoid of constraints/domains on email, phone, etc. create table private.details(id int primary key references public.people , email text , phone text , birthday date , occupation text , company text );-- other database objects in this schema -- ... -- ...
要解决此问题,您可以在架构中创建详细信息视图public
。我们将其称为public_details。
create view public.public_details as selectid, occupation, company fromprivate.details;
由于PostgREST支持嵌入视图,因此可以使用public_details嵌入人员。
让我们插入一些数据进行测试:
insert intopublic.people values(1, 'John Doe'), (2, 'Jane Doe');insert intoprivate.details values(1, 'jhon@fake.com', '772-323-5433', '1990-02-01', 'Transportation attendant', 'Body Fate'),(2, 'jane@fake.com', '480-474-6571', '1980-04-21', 'Geotechnical engineer', 'Earthworks Garden Kare');
重要
确保PostgREST的模式缓存是最新的。请参阅架构重载。
现在,发出以下请求:
curl "http://localhost:3000/people?select=full_name,public_details(occupation,company)"
结果应为:
[{"full_name":"John Doe","public_details":[{"occupation":"Transportation attendant","company":"Body Fate"}]},{"full_name":"Jane Doe","public_details":[{"occupation":"Geotechnical engineer","company":"Earthworks Garden Kare"}]} ]
使用PostgREST的RestAPI操作之 类型转JSON对象 | 嵌入视图相关推荐
- 使用PostgREST的RestAPI操作PostgreSQL数据库教程
使用PostgREST的RestAPI操作PostgreSQL数据库教程 表和视图 公开的架构中的所有视图和表均可被查询的活动数据库角色访问,并且可供活动数据库角色访问.它们暴露在一级深度路线中.例如 ...
- 使用PostgREST的RestAPI操作之相关软件生态系统
使用PostgREST的RestAPI操作之相关软件生态系统 示例应用程序 tatut / postgrest-ui -PostgREST的ClojureScript UI组件 priyank-pur ...
- 使用PostgREST的RestAPI操作之管理与优化
使用PostgREST的RestAPI操作之管理与优化 硬化PostgREST PostgREST是构建RESTful API的快速方法.它的默认行为非常适合开发中的脚手架.只要您采取预防措施,当需 ...
- 使用PostgREST的RestAPI操作之安装教程
使用PostgREST的RestAPI操作之安装教程 二进制版本 [ 从发行页面下载 ] 该发行页面具有针对Mac OS X,Windows和多个Linux发行版的预编译二进制文件.解压缩tarbal ...
- 使用PostgREST的RestAPI操作之角色系统教程
角色系统概述 PostgREST旨在使数据库始终处于API安全性的中心.所有授权都是通过数据库角色和权限进行的.PostgREST的工作是对请求进行身份验证(即验证客户端是否是他们所说的身份),然后让 ...
- Redis常用命令之操作Hash类型
场景 Centos中Redis的下载编译与安装(超详细): https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/103967334 Re ...
- Oracle使用ini启动,python操作ini类型配置文件的实例教程
一.ini文件介绍 INI文件格式是某些平台或软件上的配置文件的非正式标准,以节(section)和键(key)构成,常用于微软Windows操作系统中.这种配置文件的文件扩展名多为INI 二.ini ...
- python字典的常用方法_python操作字典类型的常用方法(推荐)
has_key()方法可以检查字典中是否含有指定的键,如果有则返回True,否则就返回False. 语法格式: dictionary_name.has_key(key) dict1 = {'01':' ...
- Linux——权限|shell运行原理——外壳程序|Linux权限的概念|对人操作|角色和文件操作|文件类型访问权限|修改权限ugo+-|8进制|修改权限|更改文件的拥有
目录 shell运行原理--外壳程序 Linux权限的概念 对人操作 角色和文件操作 文件类型
最新文章
- 华为八爪鱼自动驾驶云
- ue4 运行禁用鼠标_[UE4] VS code使用LuaPanda断点调试
- Qt自定义对话框中边框阴影实现
- [笑]每个人都有脑袋脱线的时候……
- DCL 管理权限 mysql
- C++语言string类介绍和示例
- jQuery ajax 使用
- 国家多部委发布13份“十四五”规划,115项重大工程​
- Tbase 源码 (八)
- Android判断是否可以使用外网
- RPC开发系列九:优雅启动
- 健脾和胃,养生食疗——山药枸杞鲫鱼汤了解一下
- FIRST 和 FOLLOW求解
- CC建模重建项目总是失败的原因
- 返回多字段并用数组分割方式展示
- UT/UTC/GMT的区别和联系
- 深入浅出 Greasemonkey
- 物联网专业教学大纲(四年制)
- 无需剪切即可压缩视频中的任意一部分,压缩完毕再剪切
- Python Qt UI设计