Документы MySQL 5.0 говорят, что триггер может вызывать UDF , поэтому эта часть кажется возможной.Просмотр исходного кода некоторых расширений UDF даст вам хорошее представление о сложности.Вы можете найти пакеты с открытым исходным кодом в репозитории MySQL UDF .
Хотелось бы, чтобы у меня был простой ответ на часть "создание MySQL UDF в Python", но я не знаюпростой готовый способ сделать это.
В Postgres есть язык PL / Python , который позволяет писать процедуры и функции непосредственно с использованием Python внутри базы данных.Этот код может быть лучшим руководством для выяснения, как подключить Python к MySQL;однако, насколько мне известно, никто еще не достиг этого (но я бы хотел ошибиться).
Несколько неясных подробностей о том, как это можно сделать:
UDF - это общие объекты, которые загружаются в демон MySQL, поэтому для его создания необходимо иметь возможность генерировать заглушки C, которые (среди прочего) инициализируют интерпретатор Python, загружают и компилируют скрипт Python в байт-код, а затем переводят MySQL UDF.аргументы в вызове функции Python, а затем перевод возвращаемого значения обратно.
Для простой строковой функции UDF с именем myfunc
общий объект будет иметь следующие функции:
// 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, запущенных одновременно в разных потоках, поэтому вам нужно найти способ либо эффективно создавать и кэшировать суб-интерпретаторы по запросу в контексте одного вызова функции, либо безопасно повторно использовать один интерпретаторв нескольких потоках (с блокировкой, которая может замедлить процесс неприемлемо).