python - 通过 MySQLdb 创建函数

标签 python 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 客户端中,它会按预期工作

最佳答案

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/

相关文章:

python - 使用 python 删除空行和空 [ ]

python - pycharm recnoizes 导入但仍然 ValueError : Attempted relative import beyond toplevel package django project on make migrations

python - 在 linux 上,使用 bash 脚本如何重命名 Excel 文件以在现有文件名的末尾包含行数

mysql - mysql中授予权限的*.*是什么意思?

php - 如何使用 Zend_Db 有效地读取大量行?

python - 如何从 YouTube 搜索中抓取视频?

Python变量命名约定

php - wpdb->从 table1 查询检查元数据并发布状态

mysql - 我的 sql 查询最近 7 天的数据?如果数据不存在,那么甚至获取日期并显示为 0 或 null

php - 插入时基于 MAX() 子查询安全地自动递增 MySQL 字段