Используя mysql.connector в Python, выполните MySQL Trigger, который вычисляет и вставляет значение во вновь созданный столбец в существующей таблице. - PullRequest
0 голосов
/ 10 июля 2019

Я пытаюсь в Python 3 выполнить курсор, который создаст новый столбец «Total_TU» в таблице, и этот столбец должен автоматически получать значения для каждой строки на основе строк из двух других столбцов: «CU_per_TU» и «ТОТ»."Total_TU" = "CU_per_TU" * "TU"

Столбцы "Total_TU" и "TU" создаются одновременно, и мне нужно обновить столбец "Total_TU" после обновления столбца "TU",

Ошибка синтаксиса SQL содержится в последнем операторе cursor.execute.

Я пытаюсь использовать этот код, который я видел в других темах и руководствах, но получаю ошибку синтаксиса SQLдля последней команды cursor.execute, и я не понимаю, в чем проблема.

Вот код

import mysql.connector

conn = connection_forward_db
cursor = conn.cursor()

cursor.execute("CREATE TABLE IF NOT EXISTS AC_forwarders.table_a AS SELECT * FROM `temp`")
cursor.execute("ALTER TABLE AC_forwarders.table_a ADD TU INT, ADD Total_CU INT")
cursor.execute("UPDATE table_a SET TU = "+int(x)+" WHERE Product_ID = aaa")


cursor.execute("""CREATE TRIGGER Total_TU_update BEFORE UPDATE ON table_a
FOR EACH ROW BEGIN
    SET new.Total_TU = new.CU_per_TU * new.TU;
END~

CREATE TRIGGER Total_TU_insert BEFORE INSERT ON table_a
OR EACH ROW BEGIN
    SET new.Total_TU = new.CU_per_TU * new.TU; 
END~""") 

conn.commit()

Столбец Total_TU должен обновляться на основе CU_per_TU и TU послеTU обновляется значением.

Вот полная ошибка (я запускаю только последний курсор, так как 3 других работают нормально):

MySQLInterfaceError Traceback (самый последний вызовпоследний) /anaconda3/lib/python3.6/site-packages/mysql/connector/connection_cext.py в cmd_query (self, query, raw, buffered, raw_as_string) 394 raw = raw, buffered = buffered, -> 395 raw_as_string =raw_as_string) 396 за исключением MySQLInterfaceError as exc:

MySQLInterfaceError: в синтаксисе SQL имеется ошибка;обратитесь к руководству, соответствующему вашей версии сервера MySQL, чтобы узнать правильный синтаксис для использования около '~

CREATE TRIGGER Total_TU_insert ПЕРЕД ВСТАВКОЙ ВКЛ. table_a ИЛИ КАЖДАЯ СТРОКА НАЧИНАЕТСЯ в строке 4

Во время обработкивыше исключения, произошло другое исключение:

ProgrammingError Traceback (последний последний вызов) в () 17 ИЛИ КАЖДАЯ СТРОКА НАЧИНАЕТСЯ 18 SET new.Total_TU = new.CU_per_TU * new.TU;---> 19 END ~ "" ") 20 21 conn.commit ()

/ anaconda3 / lib / python3.6 / site-packages / mysql / connector / cursor_cext.py в execute (self, операция, params, multi) 264 result = self._cnx.cmd_query (stmt, raw = self._raw, 265 buffered = self._buffered, -> 266 raw_as_string = self._raw_as_string) 267 за исключением MySQLInterfaceError, так как исключение: 268 повышает ошибки.get_mysql_exception(msg = exc.msg, errno = exc.errno,

/ anaconda3 / lib / python3.6 / site-packages / mysql / connector / connection_cext.py в cmd_query (self, query, raw, buffered,raw_as_string) 396 за исключением MySQLInterfaceError как исключение: 397 вызывает error.get_mysql_exception (exc.errno, msg = exc.msg, -> 398 sqlstate = exc.sqlstate) 399 кроме AttributeError: 400, если self._unix_socket:

ProgrammingError: 1064 (42000): у вас есть ошибка в вашем синтаксисе SQL, проверьте правильность синтаксиса для руководства, соответствующего вашей версии сервера MySQL, для значения, близкого к '~

CREATE TRIGGER Total_TU_insert ПЕРЕД ВСТАВКОЙ НА table_a ИЛИ КАЖДОЙСтрока начинается в строке 4

1 Ответ

0 голосов
/ 10 июля 2019

Большое спасибо P.Salmon!

Да, теперь это работает после того, как я настроил код:

cursor.execute("""CREATE TRIGGER Total_TU_update BEFORE UPDATE ON table_a
FOR EACH ROW
    SET new.Total_TU = new.CU_per_TU * new.TU;""")


cursor.execute("""CREATE TRIGGER Total_TU_insert BEFORE INSERT ON table_a
FOR EACH ROW
    SET new.Total_TU = new.CU_per_TU * new.TU;""") 

conn.commit()

PS В таблице существуют другие зависимые столбцы, я их просто не упомянул, так как проблем сих:)

...