一尘不染

通过MySQLdb创建函数

mysql

在python中使用MySQLdb库时,如何定义多语句函数或过程?

例:

import MySQLdb

db = MySQLdb.connect(db='service')

c = db.cursor()

c.execute("""DELIMITER //
CREATE FUNCTION trivial_func (radius float) 
    RETURNS FLOAT

    BEGIN
    IF radius > 1 THEN
        RETURN 0.0;
    ELSE
        RETURN 1.0;
    END IF;
END //

DELIMITER ;""")

这将创建以下回溯:

Traceback (most recent call last):
  File "proof.py", line 21, in <module>
    DELIMITER ;""")
  File "build/bdist.macosx-10.5-i386/egg/MySQLdb/cursors.py", line 173, in execute
  File "build/bdist.macosx-10.5-i386/egg/MySQLdb/connections.py", line 35, in defaulterrorhandler
_mysql_exceptions.ProgrammingError: (1064, "You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'DELIMITER //\nCREATE FUNCTION trivial_func (radius float) \n    RETURNS FLOAT\n\n   ' at line 1")

如果我将相同的SQL直接复制到mysql shell客户端中,它将按预期工作


阅读 218

收藏
2020-05-17

共1个答案

一尘不染

DELIMITER命令是内置的MySQL
Shell客户端,只有该程序(和MySQL查询浏览器)才能识别。DELIMITER如果您直接通过API执行SQL语句,则无需使用。

的目的DELIMITER是帮助您避免CREATE FUNCTION在语句本身可以包含分号字符时避免终止语句。这在shell客户端中很重要,在该客户端中,默认情况下,分号终止SQL语句。您需要将语句终止符设置为其他字符,以便提交函数(或触发器或过程)的主体。

CREATE FUNCTION trivial_func (radius float) 
    RETURNS FLOAT

    BEGIN
    IF radius > 1 THEN
        RETURN 0.0; <-- does this semicolon terminate RETURN or CREATE FUNCTION?
    ELSE
        RETURN 1.0;
    END IF;
END

由于API通常允许您一次提交一个SQL语句,因此没有歧义-接口知道函数定义主体内的任何分号都不会终止整个CREATE FUNCTION语句。因此,无需使用来更改语句终止符DELIMITER

2020-05-17