gpt4 book ai didi

python - 通过 MySQLdb 创建函数

转载 作者:IT老高 更新时间:2023-10-29 00:03:05 26 4
gpt4 key购买 nike

如何在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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com