triggers - 使用连接器/Python 创建触发器 - MySQL
问题描述
此代码在 MYSQLWorkbench 中正常工作。
use MYDB
drop trigger if exists mytrigger
delimiter //
CREATE TRIGGER mytrigger BEFORE INSERT ON MYTABLE FOR EACH ROW
BEGIN
IF (select COUNT(*) from MYTABLE) = 12 THEN
SET NEW.COL2 = 10;
END IF;
END;//
delimiter ;
MYTABLE 有两列 (COL1,COL2)
我想通过 python 创建这个触发器,所以我在 python 中编写了这段代码:
import mysql.connector
cnx = mysql.connector.connect(user='root', password='root', host='127.0.0.1', database='mysql')
cursor = cnx.cursor()
DB_NAME = 'MYDB'
Table_Name= 'MYTABLE'
cursor.execute("CREATE DATABASE IF NOT EXISTS " + str(DB_NAME))
cnx.commit()
cursor.execute("USE " + str(DB_NAME))
cnx.commit()
cursor.execute("CREATE TABLE IF NOT EXISTS " + str(Table_Name) + " ("
" `COL1` BIGINT(20) NOT NULL ,"
" `COL2` varchar(20) NOT NULL,"
" PRIMARY KEY (`COL1`)"
") ENGINE=InnoDB")
cnx.commit()
cursor.execute(" drop trigger if exists mytrigger")
qrystr = (" delimiter // \n"
" CREATE TRIGGER mytrigger BEFORE INSERT ON MYTABLE FOR EACH ROW \n"
" BEGIN \n"
" IF (select COUNT(*) from MYTABLE) = 12 THEN \n"
" SET NEW.COL2 = 10;\n"
" END IF;\n"
" END;//\n"
" delimiter ; \n")
cursor.execute(qrystr)
cnx.commit()
cnx.close()
但是会发生此错误:(((((((((((((((((((((((((((((((((((((((((())))
错误:您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,以在第 1 行的 'delimiter // CREATE TRIGGER mytrigger BEFORE INSERT ON MYTABLE FOR EACH ROW' 附近使用正确的语法
请帮忙
解决方案
对于其他遇到此问题的人(或者在近 11 个月后这仍然是提问者的问题的可能性):
DELIMITER
只是 CLI 的一项功能(不是服务器本身),因此各种连接器不知道如何处理它。我最终解决了同样的问题,方法是删除DELIMITER
语句和依赖它的任何内容,并将整个触发器语句移动到一行以立即执行。因为它是一次执行,所以连接器确定分号不会结束语句。
cursor.execute(" drop trigger if exists mytrigger")
## NEW CODE ##
qrystr = "CREATE TRIGGER mytrigger BEFORE INSERT ON MYTABLE FOR EACH ROW BEGIN IF (select COUNT(*) from MYTABLE) = 12 THEN SET NEW.COL2 = 10; END IF; END"
##############
cursor.execute(qrystr)
cnx.commit()
cnx.close()
推荐阅读
- sublimetext3 - 如何在所有范围内使用片段?
- .htaccess - Opencart 3.0.3.2 注册/登录网址对 seo 不友好
- php - 在编译时使用环境变量配置服务
- swift - Swift UICollectionview 水平单元格显示中心位置,并根据单元格选择自动移动
- java - Angular 如何知道要调用哪个 Spring Boot REST API?
- amazon-web-services - 调用 ListQueues 操作时 AccessDenied
- python-3.x - 从字典到逆字典的字典理解
- c# - 如何在 IronPython 2.7 中引用针对运行时版本“v2.0.xxx”构建的程序集?
- c# - 确定主要货币单位和小数单位之间的因子
- postgresql - 如何在不重新启动 postgres 服务器的情况下刷新停用词列表?