将类型转换为自定义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对象。

要做到这一点,首先我们将定义将进行转换的功能tsrangejson

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对象 | 嵌入视图相关推荐

  1. 使用PostgREST的RestAPI操作PostgreSQL数据库教程

    使用PostgREST的RestAPI操作PostgreSQL数据库教程 表和视图 公开的架构中的所有视图和表均可被查询的活动数据库角色访问,并且可供活动数据库角色访问.它们暴露在一级深度路线中.例如 ...

  2. 使用PostgREST的RestAPI操作之相关软件生态系统

    使用PostgREST的RestAPI操作之相关软件生态系统 示例应用程序 tatut / postgrest-ui -PostgREST的ClojureScript UI组件 priyank-pur ...

  3. 使用PostgREST的RestAPI操作之管理与优化

    使用PostgREST的RestAPI操作之管理与优化 硬化PostgREST  PostgREST是构建RESTful API的快速方法.它的默认行为非常适合开发中的脚手架.只要您采取预防措施,当需 ...

  4. 使用PostgREST的RestAPI操作之安装教程

    使用PostgREST的RestAPI操作之安装教程 二进制版本 [ 从发行页面下载 ] 该发行页面具有针对Mac OS X,Windows和多个Linux发行版的预编译二进制文件.解压缩tarbal ...

  5. 使用PostgREST的RestAPI操作之角色系统教程

    角色系统概述 PostgREST旨在使数据库始终处于API安全性的中心.所有授权都是通过数据库角色和权限进行的.PostgREST的工作是对请求进行身份验证(即验证客户端是否是他们所说的身份),然后让 ...

  6. Redis常用命令之操作Hash类型

    场景 Centos中Redis的下载编译与安装(超详细): https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/103967334 Re ...

  7. Oracle使用ini启动,python操作ini类型配置文件的实例教程

    一.ini文件介绍 INI文件格式是某些平台或软件上的配置文件的非正式标准,以节(section)和键(key)构成,常用于微软Windows操作系统中.这种配置文件的文件扩展名多为INI 二.ini ...

  8. python字典的常用方法_python操作字典类型的常用方法(推荐)

    has_key()方法可以检查字典中是否含有指定的键,如果有则返回True,否则就返回False. 语法格式: dictionary_name.has_key(key) dict1 = {'01':' ...

  9. Linux——权限|shell运行原理——外壳程序|Linux权限的概念|对人操作|角色和文件操作|文件类型访问权限|修改权限ugo+-|8进制|修改权限|更改文件的拥有

    目录 shell运行原理--外壳程序 Linux权限的概念 对人操作 角色和文件操作 文件类型

最新文章

  1. 华为八爪鱼自动驾驶云
  2. ue4 运行禁用鼠标_[UE4] VS code使用LuaPanda断点调试
  3. Qt自定义对话框中边框阴影实现
  4. [笑]每个人都有脑袋脱线的时候……
  5. DCL 管理权限 mysql
  6. C++语言string类介绍和示例
  7. jQuery ajax 使用
  8. 国家多部委发布13份“十四五”规划,115项重大工程​
  9. Tbase 源码 (八)
  10. Android判断是否可以使用外网
  11. RPC开发系列九:优雅启动
  12. 健脾和胃,养生食疗——山药枸杞鲫鱼汤了解一下
  13. FIRST 和 FOLLOW求解
  14. CC建模重建项目总是失败的原因
  15. 返回多字段并用数组分割方式展示
  16. UT/UTC/GMT的区别和联系
  17. 深入浅出 Greasemonkey
  18. 物联网专业教学大纲(四年制)
  19. 无需剪切即可压缩视频中的任意一部分,压缩完毕再剪切
  20. Python Qt UI设计

热门文章

  1. 连连看外挂消去算法分析
  2. jQuery常用技巧大放送
  3. 什么是响应式Web设计?怎样进行?
  4. Image Warp插件实现图片点击扩大渐隐效果
  5. 剑指offer 09.用两个栈实现队列
  6. NSGA2算法及其代码
  7. nginx fastcgi php-fpm的关系梳理
  8. LeetCode 637. Average of Levels in Binary Tree
  9. LeetCode 413. Arithmetic Slices
  10. Linux远程管理协议(RFB、RDP、Telnet和SSH)