我能否用Python编写MySQL的UDF?

4

我希望有一种方式可以通过MySQL存储过程调用Python。
因此,我想知道是否可以使用Python编写UDF,并从MySQL中调用。

如果不可能,那么我能用什么替代方法实现这个功能呢?

1个回答

7
MySQL 5.0文档称触发器可以调用UDF,因此这部分看起来是可能的。查看一些UDF扩展的源代码会让您对所涉及的复杂性有一个很好的了解。您可以在MySQL UDF存储库中找到开源软件包。
我希望我能够轻松回答“如何在Python中创建MySQL UDF”的问题,但我不知道是否有简单的现成方法可以实现。Postgres有PL/Python语言,它允许您在数据库中直接使用Python编写过程和函数。这段代码可能是将Python插入MySQL的最佳指南;然而,据我所知,还没有人完成这项工作(但我很乐意错)。 以下是可能完成此操作的一些混乱细节: UDFs是共享对象,它们被加载到MySQL守护进程中。因此,要创建一个UDF,您需要能够生成C存根,这些存根(除其他外)初始化Python解释器、将Python脚本编译成字节码,然后将MySQL UDF参数转换为Python函数调用,并将返回值翻译回来。
对于一个名为myfunc的简单UDF字符串函数,共享对象将具有以下函数:
// initialize state when 'myfunc' is loaded.
my_bool myfunc_init(UDF_INIT *initid, UDF_ARGS *args, ...)

// call myfunc, this would need to translate the args, invoke the
// python function, then return the string, may need to create and cache
// python sub-interpreters on the fly, etc
char *myfunc(UDF_INIT *initid, UDF_ARGS *args, ...)

// clean up the state when 'myfunc' is unloaded.
void myfunc_deinit(UDF_INIT *initid);

由于可能会有多个线程同时运行您的UDF,因此您需要找到一种方法,在单个函数调用的上下文中高效地创建和缓存子解释器,或者安全地在多个线程之间重复使用单个解释器(使用锁可能会使速度变慢,不可接受)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接