【问题标题】:Creating Trigger Using Connector/Python - MySQL使用连接器/Python 创建触发器 - MySQL
【发布时间】:2018-10-31 21:40:31
【问题描述】:

此代码在 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 服务器版本相对应的手册,以获取在“分隔符//”附近使用的正确语法 CREATE TRIGGER mytrigger BEFORE INSERT ON MYTABLE FOR EACH ROW ' 在第 1 行

请帮忙

【问题讨论】:

    标签: triggers python-3.6 mysql-8.0


    【解决方案1】:

    对于遇到此问题的其他任何人(或者在近 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()
    

    【讨论】:

      猜你喜欢
      • 2015-03-01
      • 1970-01-01
      • 2011-02-03
      • 2016-09-19
      • 2013-07-02
      • 1970-01-01
      • 2015-02-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多