mysql通过udf发起get、post请求

mysql发起Http请求

最近一直在研究公司产品数据,免不了写SQL语句,过程中也遇到一些问题,在对mysql认知不全面的情况下,总认为需要编写程序才能获得一些想要的数据。

例如:我们的数据是需要通过 url 返回,并且需要存放在 mysql 数据库的特定表中,第一反应就是写个程序来实现,但是后来发现开发时间长,处理效率也慢,并且对以后更多的需求可能做不到完全通用,仔细查找资料后找到了 udf 以及 mysql_udf_http。

udf 最根本的开发语言便是C/C++了,又是我的老本行,当时此次解决问题的过程中,我发现对于初次接触 udf 以及未学习过C/C++的小伙伴来说,成本太高,并且开发周期较长,各种环境配置都很繁琐,因此最终选择了 go 语言来实现目的。

本文使用的代码来自于github (正所谓吃水不忘打井人)。
修改后代码下载mysql_udf_http

使用环境:官方docker(mysql8.0.17)

  • 配置go环境

    docker里面本身肯定是没有golang环境的,所以我们首先需要配置golang环境,其实也很简单,下面直接贴步骤。

	1、下载golang官方包
		wget https://dl.google.com/go/go1.10.3.linux-amd64.tar.gz
		
	2、解压缩
		tar -C /usr/local -zxvf go1.10.3.linux-amd64.tar.gz
		
	3、配置环境变量 **vim /etc/profile** //在末尾增加以下配置(注意路径为golang安装路径)
		export GOROOT=/usr/local/go     
		export PATH=$PATH:$GOROOT/bin
		
	4、使用以下命令来保存配置
		source /etc/profile
		
	5、验证(出现正确版本则证明安装成功)
		go version
  • 下载源码

    git clone https://github.com/RebirthLee/mysql_udf_http_golang.git udf
    
  • 使用步骤

    • 说明:原文作者给出了 shell 脚本来一键生成udf,有兴趣的可以看看上文中给出的连接,但是总感觉便捷的方式都是写给别人的,反正在我这里确实行不通,因此自己摸索了一套简单的方法,这里跟大家分享一下。

    • 1、文件介绍
      没有过多要说明的,如果不适用shell脚本一键安装的话,其实只需要了解 http.go 这一个文件就足够了。

    • 2、需要注意和修改的地方
      大家可以使用 vim 编辑器来修改 http.go
      (1)头部增加以下两行代码,第一行是 mysql 安装后的 include 目录,需要换成自己的;第二个是定义 my_bool 因为C语言、Go语言本身都没有 my_bool 类型,如果不定义,则会报错。
      在这里插入图片描述
      代码:

      // #cgo CFLAGS: -I/usr/include/mysql -DMYSQL_DYNAMIC_PLUGIN
      // typedef char my_bool;
      

    (2)原本以为这样编译好的函数就一切OK了,但是没想到使用 get 获取到的数据,末尾总是会少几个字节,后来研究了一番,返现返回时的数据长度确实少了几个字节,因此修改代码如下(注意需要修改所有的 len 计算)。
    修改前:
    uint64(utf8.RuneCountInString(ret))
    在这里插入图片描述
    修改后:
    uint64(len(ret))
    在这里插入图片描述
    (3)修改后因为没有地方使用到 “unicode/utf8” 包,则在代码前面的 import 中删除即可,否则编译报错!
    (4)编译,并将生成的 .so 文件放到 mysql 安装目录的 plugin 文件夹中,以便于mysql创建 udf 时可以顺利找到对应的文件,代码如下,其中 /usr/lib/mysql 是 mysql 的安装目录,需要根据实际修改。
    go build -buildmode=c-shared -o /usr/lib/mysql/plugin/http.so http.go

生成并使用udf

  • 创建 UDF

    Http Help
    	CREATE FUNCTION http_help RETURNS STRING SONAME 'http.so';
    Http Get Method
    	CREATE FUNCTION http_get RETURNS STRING SONAME 'http.so';
    Http Post Method
    	CREATE FUNCTION http_post RETURNS STRING SONAME 'http.so';
    
  • 使用 UDF

    SELECT http_get('http://example.com');
    

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_33191599/article/details/100107149