Создание триггера с использованием Connector / Python - MySQL - PullRequest
0 голосов
/ 22 мая 2018

Этот код правильно работает в 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()

НО Эта ошибка возникает: (((((((((((((((((((((((((((((((((((((((((((((В 1001010 * Ошибка: у вас есть ошибка в вашем синтаксисе SQL; проверьте правильность синтаксиса, близкую к разделителю, в руководстве, соответствующем вашей версии сервера MySQL, для использования рядом с «разделителем // CREATE TRIGGER mytrigger ПЕРЕД ВСТАВКОЙ НА MYTABLE FOR EACH ROW» в строке 1

пожалуйста, помогите

1 Ответ

0 голосов
/ 18 апреля 2019

Для всех, кто столкнулся с этой проблемой (или если нет вероятности, что эта проблема все еще остается проблемой для аскера почти 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()
...