如何在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 查询浏览器)识别。如果您直接通过 API 执行 SQL 语句,则无需使用 DELIMITER
。
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 语句,因此没有歧义——接口(interface)知道函数定义主体内的任何分号都不会终止整个 CREATE FUNCTION
声明。因此,无需使用 DELIMITER
更改语句终止符。
关于python - 通过 MySQLdb 创建函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/745538/