Elixir Ecto: 范围数据类型

PostgreSQL 9.2 以来, 可以用特定的操作符和函数存储和查询一个值的范围. 这是一个非常不错的特性, 比如在电子商务应用程序方面, 可以用一个字段 price_range 来替代 min_price, max_price 表示一个价格范围.

在Ecto中使用范围数据类型

价格范围的表示方法如下

[0, 45.67] 
[30.04, 98.50]
[100, 500]

我们可以用范围操作符来查询一个值的范围

2.5 <@ numrange(1.50,7)

Postgresql 支持如下范围类型

  • int4range 整数方位

  • int8range — 大整数范围

  • numrange — 十进制数字范围(浮点)

  • tsrange — 不带时区的时间戳范围

  • tstzrange — 带时区的时间戳范围

  • daterange — 日期范围

Ecto 本身为了兼容各个数据库, 并没有支持Postgresql 特有的Range数据类型, 但Ecto为我们提供了一个自定义数据类型的方法. 下面我们创建一个 NumRange 类型, 底层用了Postgrex适配器的%Postgrex.Range{}结构

defmodule App.NumRange do  @behaviour Ecto.Typedef type, do: :numrangedef cast([lower, upper]) do{:ok, [lower, upper]}enddef cast(_), do: :errordef load(%Postgrex.Range{lower: lower, upper: nil}) do{lower, _} = lower |> to_float{:ok, [lower, nil]}enddef load(%Postgrex.Range{lower: lower, upper: upper}) do{lower, _} = lower |> to_float{upper, _} = upper |> to_float{:ok, [lower, upper]}enddef dump([lower, upper]) do{:ok, %Postgrex.Range{lower: lower, upper: upper, upper_inclusive: false}}enddef dump(_), do: :errordefp to_float(value) dovalue |> Decimal.to_string |> Float.parseend
end 

在模型和迁移脚本中中使用这个自定义数据类型

模型

defmodule App.Product do  use App.Web, :modelschema "products" dofield :price_range, App.NumRangetimestampsend
end  

迁移脚本

defmodule App.Repo.Migrations.Product do  use Ecto.Migrationdef change docreate table(:products) doadd :price_range, :numrangetimestampsendend
end  

范围查询

defmodule App.ProductQuery do  import Ecto.Queryalias App.{Repo, Product}def within_price_range(price) doquery =from p in Product,where: fragment("?::numeric <@ ?", ^price, p.price_range)query |> Repo.allend
end  

关于方位边界的问题, 和数学中的范围符号是一样的:

  • [ 包括下边界

  • ( 不包括下边界

  • ] 包括上边界

  • ) 不包括上边界

例子

# 创建表
create table products(id int, price_range numrange);
# 插入数据
INSERT INTO products VALUES(1, '[10.0, 100.0]')
INSERT INTO products VALUES(1, '[200.0, 300.0]')
INSERT INTO products VALUES(1, '[400.0, 500.0]')
INSERT INTO products VALUES(1, '[600.0, 700.0]')
# 查询
SELECT * FROM products;
+------+--------------------------------------------------------+
|   id | price_range                                            |
|------+--------------------------------------------------------|
|    1 | NumericRange(Decimal('10.0'), Decimal('100.0'), '[]')  |
|    1 | NumericRange(Decimal('200.0'), Decimal('300.0'), '[]') |
|    1 | NumericRange(Decimal('400.0'), Decimal('500.0'), '[]') |
|    1 | NumericRange(Decimal('600.0'), Decimal('700.0'), '[]') |
+------+--------------------------------------------------------+
# 过滤
SELECT * FROM products WHERE price_range::numrange @> 99.0
+------+-------------------------------------------------------+
|   id | price_range                                           |
|------+-------------------------------------------------------|
|    1 | NumericRange(Decimal('10.0'), Decimal('100.0'), '[]') |
+------+-------------------------------------------------------+

参考资料

  • 关于 Postgresql 的范围数据类型, 参考 范围类型

  • Postgresql 范围操作符

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/293351.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

我们能复活恐龙吗?

全世界只有3.14 % 的人关注了爆炸吧知识鲁迅曾经说过&#xff1a;“不会画漫画的段子手不是好英语老师”咳咳~ 图图君就是这样一位专注知识科普的双语漫画家长按二维码带你去图图君家串串门儿我们到底能不能复活恐龙&#xff1f;长按二维码关注回复“恐龙”寻找答案吧在这里你不…

思考的技术与艺术

总的来说 1.人类的思维充满着各种各样的捷径&#xff0c;每一条捷径都是一把双刃剑。一方面&#xff0c;它降低了大脑的认知复杂性&#xff08;笼统的看一个问题要比细致的分析简单得多&#xff09;&#xff0c;有助于迅速做出绝大部分时候都正确的判断&#xff1b;但另一方面…

周期串问题(一)

题目: 题目一[周期串问题] 如果一个字符串可以由某个长度为k的字符串重复多次得到,我们说该串以k为周期。例如,abcabcabcabc以3为周期(注意,它也可以6和12为周期,结果取最小周期3) 代码如下: #include <iostream> #include <string> using namespace std;…

eks volumn s3_威客电竞 深渊联赛S3欧洲区总决赛,Secret成就八连冠

威客电竞&#xff0c;亚洲领先的专业电竞赛事预测平台。DOTA PIT深渊联赛线上赛第三赛季经过为期一周的激烈比赛&#xff0c;Secret战队在11支参赛队伍中一路杀进总决赛&#xff0c;与VP.P战队展开巅峰对决。最终Secret战队3:0完胜VP.P战队斩获DOTA PIT S3欧洲区冠军&#xff0…

ANE打包心得

1 ane中的p12证书是fb或者flashide中生成的&#xff08;例如air工程生成的p12&#xff09;&#xff0c;不是苹果账号的p12 2 打包bat中的 -platform 要和 extension.xml中的platform节点相对应 3 -C iPhone-ARM . 末尾的点要记得写 4 这就是个坑爹货啊&#xff01;转载于:…

初探IdentityServer4(客户端模式)

Oatuth2协议的客户端模式介绍Client Credentials Grant &#xff08;客户端模式&#xff09;是Oauth2.0协议中&#xff0c;四种模式自建单的一种。它由两部分构成&#xff0c;客户端和认证服务器。认证服务器确认客户端无误后返回一个token&#xff0c;客户端请求带着token访问…

2596 售货员的难题

2596 售货员的难题 时间限制: 1 s空间限制: 32000 KB题目等级 : 钻石 Diamond题解题目描述 Description某乡有n个村庄(1<n<&#xff1d;15)&#xff0c;有一个售货员&#xff0c;他要到各个村庄去售货&#xff0c;各村庄之间的路程s(0<s<1000)是已知的&#xff0c;…

研究表明:胸部大小其实早已.....

1 这样就能不战而胜了&#xff08;素材源于网络&#xff0c;侵删&#xff09;▼2 说好的情比金坚呢&#xff1f;▼3 整挺好&#xff0c;锅都不用洗了&#xff08;via.豆瓣撕破伤口、&#xff09;▼4 就是这么自信▼5 什么丝袜这么厉害▼6 好家伙&#xff0c;请问还需要女婿…

Java学习笔记之 IO包 字节流

IO包最重要的五个类和一个接口 File/OutputStream/InputStream(字节流)/Writer/Reader(字符流) 一个接口&#xff1a;Serializable File类&#xff1a; 字节流&#xff1a; OutputStream与InputStream是抽象类 OutputStream是整个IO包中&#xff0c;字节输出流的最大类 Fi…

周期串问题(二)

题目&#xff1a; 题目一[周期串问题] 如果一个字符串可以由某个长度为k的字符串重复多次得到&#xff0c;我们说该串以k为周期。例如&#xff0c;abcabcabcabc以3为周期&#xff08;注意&#xff0c;它也可以6和12为周期,结果取最小周期3&#xff09; 代码如下&#xff1a; …

bootstrap bootstraptable 固定列_1个Excel公式按条件自定义格式显示固定电话号码

点击右上角“关注”&#xff0c;每天免费获取干货教程前面写了很多篇关于数据查询、数据统计、数据分析、公式排错的教程&#xff0c;今天换一个口味&#xff0c;写个关于自定义格式显示数据的教程。因为工作中很多时候都需要按照指定的要求将数据源整理成固定的格式&#xff0…

记一次引入Elasticsearch的系统架构实战

前言我曾经面试安踏的技术岗&#xff0c;当时面试官问了我一个问题&#xff1a;如果你想使用某个新技术但是领导不愿意&#xff0c;你怎么办&#xff1f;对于该问题我相信大家就算没有面试被问到过&#xff0c;现实工作中同事之间的合作也会遇到。 因此从我的角度重新去回答这…

rsync 安装使用详解

RSYNC软件介绍&#xff1a; rsync是类unix系统下的数据镜像备份工具&#xff0c;从软件的命名上就可以看出来了——remote sync。它的特性如下&#xff1a;可以镜像保存整个目录树和文件系统。可以很容易做到保持原来文件的权限、时间、软硬链接等等。无须特殊权限即可安装。优…

【 Tomcat 】tomcat8.0 调优配置

2019独角兽企业重金招聘Python工程师标准>>> 1、优化内核及TCP连接&#xff1a; fs.file-max 655350  # 系统文件描述符总量 net.ipv4.ip_local_port_range 1024 65535  # 打开端口范围 net.ipv4.tcp_max_tw_buckets 2000  # 设置tcp连接时TIME_WAIT个数 n…

[转]ORACLE 异常错误处理

本文转自&#xff1a;http://www.cnblogs.com/soundcode/archive/2012/01/10/2318385.html 本篇主要内容如下&#xff1a; 5.1 异常处理概念 5.1.1 预定义的异常处理 5.1.2 非预定义的异常处理 5.1.3 用户自定义的异常处理 5.1.4 用户定义的异常处理 5.2 异常错误传播 5.2.1 在…

java.io.StreamCorruptedException: invalid type code: AC解决办法

.java.io.StreamCorruptedException: invalid type code: AC解决办法问题描述&#xff1a; 在向一个文件写入可序列化对象时&#xff0c;每次只想向文件的末尾添加一个可序列化的对象&#xff0c;于是使用了FileOutputStream&#xff08;文件名&#xff0c;true&#xff09;间接…

abb机器人指令手册_第1519课 ABB机器人初级教程

每一位读者都是我分享的动力&#xff0c;感谢大家关注&#xff01;第15课 系统输入输出与IO信号的关联第16课 示教器可编程按钮的使用第17课 什么是程序数据第18课 程序数据的类型与分类第19课 创建程序数据第15课第16课第17课第18课第19课每一位读者都是我分享的动力&#xff…

Java学习笔记之 IO包 字符流

字符流&#xff1a;Writer/Reader(字符流) 通过子类FileWriter和FileReader实现父类实例化 package iotest; import java.io.File; import java.io.Writer; import java.io.Reader; import java.io.FileWriter; import java.io.FileReader; public class OutputStreamDemo2 { p…

ci框架(二)

自定义SQL语句 当提供的API满足不了我们对SQL语句的要求的时候&#xff0c;我们通常是自己来写SQL语句&#xff0c;CI也提供了比较强大了&#xff0c;能够满足我们需求的一般的sql的API。 $res$…