[pgrx开发postgresql数据库扩展]6.返回序列的函数编写(1)单值序列

上篇文章是中规中矩的标准计算函数,就算不用pgrx,也是可以正常理解的,所以基本上没有什么对于pgrx框架有关系的东西(唯一有关系的东西,应该就是Rust的时间类型与pgrx的时间类型的计算了)。

这篇文章会讲一个pgrx对于postgresql或者说对于任何数据库扩展来说都比较有用的开发内容:返回序列以及表的函数的编写。

针对上篇文章,用了一个概念,就是:单值输入与单值输出,那么相对来说,这篇文章描写的就是单值输入与多值输出。

所谓的多值输出,就是可以输出超过一行的函数。

如下所示,这个Python函数,就是单值输入,多值输出的例子:我们输入1个整数,然后函数根据我们输入的整数,去生成一个list。

例如我们输入的是5,得到的结果就是[0,1,2,3,4]。

def generate_list(x:int):
    return [i for i in range(0,x)]

在本系列的第一篇文章里面,大家可能还记得我给出来的这样一个效果:

那么在pgrx里面,如何来实现呢?

pgrx对于这种集合类型的支持,有很多种,例如Vec、range这些个类型都是支持的,但是对于数据库来说,这种返回超过一行序列的方法被称之为srf,即:Set Returning Functions。

在Postgresql里面,本身就内置了很多srf,例如generate_series()这个就是最著名的内置srf。

而在pgrx里面,如果要实现srf,需要包装的类型分别是:

  • SetOfIterator
  • TableIterator

注意:这两个类型是pgrx 0.7.0之后版本才推出的,如果你看的旧版本的介绍,发现是没有这两个类型的。

首先我们来看如何使用SetOfIterator来实现一个生成自定义序列的srf:

表示rust风格的代码,是这样写的:

#[pg_extern]
fn my_generate_series(start:i64,
                    end:i64,
                    step:i64)->SetOfIterator<
'static, i64
>{
    SetOfIterator::new((start..=end).step_by(step as usize).into_iter())
}

不过这种写法编程,对于没有接触过函数式编程的同学感觉非常痛苦,所以我们写成传统的过程化编程风格:

#[pg_extern] fn my_generate_series2(start:i64,end:i64,step:i64) ->SetOfIterator<'static, i64>{ //初始化一个集合 let mut series:Vec<i64> = vec![]; //迭代从start - end的所有数值 for x in start..=end{ //如果有setp,则满足条件在放入集合中 if x % step ==0{ series.push(x); } } //把生成的集合,放入SetOfIterator 包装类型中,返回出来 SetOfIterator::new(series) }

我们可以来看看两种不同的写法,实际上结果是一样的:

生成50000个数值,效率也是差不多的:

不过对于写过函数式编程的同学来说,第一种写法更加简洁明了……起码对于我来说,我还是喜欢第一种写法的:

下面我们来看一个小案例:

第一个是定制一个我们自己的UUID函数:

做数据库设计的时候,最头疼的问题之一是如何设计一个有意义、高性能其能保证在一定程度上不会冲突的ID。 其中一种方案就是用UUID:UUID 是 通用唯一识别码(Universally Unique Identifier)的缩写,他可以保证生成在时间和空间上的唯一编码。

虽然从PG13的版本开始,就已经提供了uuid的生成函数,但是它只能生成UUID V4版本的序列:

常用的自增 ID 缺乏随机性,且会暴露数据细节(黑客可以通过 id 的规律爬到大量数据);UUID v4 是基于随机数的,具备足够随机性,但其最大的问题就是无法排序。

而最新的UUID 7版本,已经支持了排序和大小比较,所以我们想在postgresql里面使用UUID V7版本,怎么做呢?

首先在cargo里面把需要的包导入进来:

uuid7 = "0.6.2"

然后编写一个方法:

#[pg_extern]
fn my_uuid7() -> String {
    uuid7::uuid7().to_string()
}

然后可以阔以了:

下面我们来看看效果:

生成出来的表是这样的:

做一个查询:

简单得让人难以置信……真是太残暴了……

下面来做一个数据分析中常用的操作:抽样。

例如上面那个表,我做了20万条数据数据进去,现在需要对它进行随机抽样,而且要求抽样满足各种分布,例如正态分布、均匀分布或者泊松分布以及伯努利分布……

如果仅仅是做随机抽样,那么SQL原生提供的RAND()函数就可以搞定了:

注意前面那么一堆代码,是我给这个表加了个行号,用来标识信息,否则uuid更本看不出效果来,ORDER BY random()的意思就是随机排序。

如果要做正态分布(高斯)的话,postgresql也提供了一个扩展模块:tabfunc中的normal_rand 函数:

安装好这个扩展之后,可以看见有如下函数:

例如我们可以用这个函数生成10个均值为10万,标准差为1万的数值:

然后可以用于抽样:

但是其他的分布,SQL就比较麻烦了,所以我们针对此需求,来编写一个伯努利抽样的扩展,代码如下:

  1. 直接导入Rust的随机数工具包rand(Rust的随机数包)和rand_distr(这个包用来生成泊松分布抽样),写在工程的cargo.toml配置文件里面:

  1. 编写扩展函数,代码如下:
use rand_distr::{Poisson};
#[pg_extern]
fn my_generate_possion(lambda:f64,cnt:i64) -> SetOfIterator<'static,i64>{
    let poi = Poisson::new(lambda).unwrap();
    let v = poi.sample(&mut rand::thread_rng());

    SetOfIterator::new((0..cnt).into_iter()
    .map(move |x| poi.sample(&mut rand::thread_rng()) as i64))
}

编译运行,

测试结果如下:

现在我们配合这个函数做一个泊松抽样:

打完收工

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

MySQL优化二索引使用

1、索引分类 类型解释全局索引(FULLTEXT)全局索引&#xff0c;目前只有 MyISAM 引擎支持全局索引&#xff0c;它的出现是为了解决针对文本的模糊查询效率较低的问题&#xff0c;并且只限于 CHAR、VARCHAR 和 TEXT 列哈希索引(HASH)哈希索引是 MySQL 中用到的唯一 key-value 键…

Scala学习(四)

文章目录 1.闭包2.函数式编程递归和尾递归2.1递归2.2 尾递归 3.控制抽象3.1 值调用3.2 名调用 4.惰性函数 1.闭包 如果一个函数&#xff0c;访问到了它的外部(局部)变量的值&#xff0c;那么这个函数和它所处的环境称之为闭包 //闭包练习def sumX(x:Int){def sumY(y:Int):Int{…

【JUC】浅析ConcurrentLinkedQueue

【JUC】浅析ConcurrentLinkedQueue 文章目录 【JUC】浅析ConcurrentLinkedQueue一、前言二、ConcurrentLinkedQueue的结构三、入队列3.1、入队列的过程3.2、定位尾节点3.3、设置入队节点为尾节点3.4、HOPS的设计意图 四、出队列 一、前言 在并发编程中&#xff0c;有时候需要使…

Python——基于YOLOV8的车牌识别(源码+教程)

目录 一、前言 二 、完成效果 三、 项目包 四、运行项目 &#xff08;教程&#xff09; 一、前言 YOLOv8LPRNet车牌定位与识别https://www.bilibili.com/video/BV1vk4y1E7MZ/ 最近做了有一个车牌识别的小需求&#xff0c;今天完成了&#xff0c;在此记录和分享 首先&#x…

linux修改程序的配置文件

修改指定文件中的数&#xff0c;例如创建一个文件如图 把6修改成7 修改完成 代码如下&#xff1a; #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #include <stdio.h> #include <unistd.h> #include <string.h> #incl…

7.设计模式之责任链模式

前言 责任链&#xff0c;即将能够处理同一类请求的对象连成一条链&#xff0c;所提交的请求沿着链传递&#xff0c; 链上的对象逐个判断是否有能力处理该请求&#xff0c;如果能则处理&#xff0c;如果不能则传递给链上的下一个对象。为了避免请求发送者与多个请求处理者耦合在…

地狱级的字节跳动面试,6年测开的我被按在地上摩擦.....

前几天我朋友跟我吐苦水&#xff0c;这波面试又把他打击到了&#xff0c;做了快6年软件测试员。。。为了进大厂&#xff0c;也花了很多时间和精力在面试准备上&#xff0c;也刷了很多题。但题刷多了之后有点怀疑人生&#xff0c;不知道刷的这些题在之后的工作中能不能用到&…

SpringBoot+myBatis(plus)+MySQL+VUE最基础简易的前后端全栈demo制作

网站全栈制作&#xff1a; 一&#xff1a;后端 为了跟公司后端更好的扯皮&#xff08;不是&#xff09;&#xff0c;本人决定学一下java语言的后端接口书写。 项目制作&#xff1a;后端采用SpringBootmyBatis(plus)mysql&#xff08;IDE为IDEA软件&#xff09;。前端采用Vue…

macOS本地python环境/vscode/导入python包/设置python解释器

查看macbook本地是否有python环境 输入python或者python3&#xff0c;退出python环境使用exit()&#xff0c;别忘了括号 没有的话去官网安装https://www.python.org/ 2. 安装vscode 官网https://code.visualstudio.com/ 3. 安装插件 点击左边的“插件”按钮&#xff0c;安装…

wangzherongyao PMO

感谢【五一节】大家的相遇&#xff0c;总结下。 2023年05月02日&#xff0c;【第一组】组队开黑 我总结了下这天为什么打的那么好&#xff0c;首先赛季初段位在王者附近&#xff0c;大家心态重视程度也高&#xff0c;不轻敌&#xff0c;也不盲目&#xff0c;运营好兵线一步一步…

【需求响应】基于进化算法的住宅光伏电池系统需求响应研究(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

Selenium原理以及Python从零实现

Selenium简介 Selenium是一个用于Web应用程序自动化测试工具。Selenium测试直接运行在浏览器中&#xff0c;就像真正的用户在操作一样。支持的浏览器包括IE&#xff08;7, 8, 9, 10, 11&#xff09;&#xff0c;Mozilla Firefox&#xff0c;Safari&#xff0c;Google Chrome&a…

OpenCV教程——处理图像像素及图像掩膜

1.像素值 像素值是图像被数字化时由计算机赋予的值&#xff0c;代表了图像中某一小方块&#xff08;即【像素点】&#xff09;的平均亮度信息。 灰度图像通常用8位表示一个像素&#xff0c;这样总共有256个灰度等级&#xff08;像素值在0&#xff5e;255之间&#xff09;。 …

【VSLAM】ORB-SLAM3安装部署与运行

心口如一&#xff0c;犹不失为光明磊落丈夫之行也。——梁启超 文章目录 :smirk:1. ORB-SLAM3介绍:blush:2. 代码安装部署1. 安装ros与opencv2. 安装Pangolin作为可视化和用户界面3. 安装Eigen3一个开源线性库&#xff0c;可进行矩阵运算4. 安装ORB-SLAM3 :satisfied:3. 案例运…

架构-软件工程模块-1

概述 这一模块选择题的分值比较多&#xff0c;案例题和论文也有能用上的地方。主要知识点会特殊标注或说明。 软件开发生命周期 软件工程三要素&#xff1a;方法、工具、过程。不会直接考&#xff0c;但可帮助记忆理解。 传统软件生命周期方法学分为&#xff1a;&#xff08;选…

ChatGPT的强化学习部分介绍——PPO算法实战LunarLander-v2

PPO算法 近线策略优化算法&#xff08;Proximal Policy Optimization Algorithms&#xff09; 即属于AC框架下的算法&#xff0c;在采样策略梯度算法训练方法的同时&#xff0c;重复利用历史采样的数据进行网络参数更新&#xff0c;提升了策略梯度方法的学习效率。 PPO重要的突…

尚硅谷-宋红康-JVM上中下篇完整笔记-JVM中篇

一.Class文件结构 1.概述 1.1 字节码文件的跨平台性 所有的JVM全部遵守Java虚拟机规范:Java SE Specifications&#xff0c;也就是说所有的JV环境都是一样的&#xff0c;这样一来字节码文件可以在各种JVM上运行。 1.2 Java的前端编译器 想要让一个Java程序正确地运行在JVM中&am…

177_模型_Power BI 进销存6大日期维度期初与期末

177_模型_Power BI 进销存6大日期维度期初与期末 一、背景 在经销存报表设计中&#xff0c;经常会遇到的便是期初与期末。当然我们这里说期初与期末指的是期初库存与期末库存。 这里的期一般常见的会有&#xff1a;年月日。本案例将演示 6 大日期维度&#xff0c;分别是&…

勒索病毒“顽疾”,没有“特效药”吗?

基础设施瘫痪、企业和高校重要文件被加密、毕业论文瞬间秒没……这就是六年前的今天&#xff0c;WannaCry勒索攻击爆发时的真实场景。攻击导致150多个国家数百万台计算机受影响&#xff0c;也让勒索病毒首次被全世界广泛关注。 六年后&#xff0c;勒索攻击仍是全球最严重的网络…

Kali E:Unable to locate package错误解决

默认的新装的kali 可能都会遇到这个安装报错E: Unable to locate package httrack问题&#xff0c;今天我记录下彻底解决过程和效果。 Command httrack not found, but can be installed with: apt install httrack Do you want to install it? (N/y)y apt install httrack Re…