在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客户端中,它将按预期工作
该DELIMITER命令是内置的MySQL Shell客户端,只有该程序(和MySQL查询浏览器)才能识别。DELIMITER如果您直接通过API执行SQL语句,则无需使用。
DELIMITER
的目的DELIMITER是帮助您避免CREATE FUNCTION在语句本身可以包含分号字符时避免终止语句。这在shell客户端中很重要,在该客户端中,默认情况下,分号终止SQL语句。您需要将语句终止符设置为其他字符,以便提交函数(或触发器或过程)的主体。
CREATE FUNCTION
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。