Задавайте вопросы, мы ответим
Вы не зашли.
Здравствуйте уважаемые форумчане.
Есть у меня поле в таблице в которое каждые 10 секунд пишутся данные о состоянии оборудования.
Все очень просто если это 1 то авария если 0 то все нормально.
А мне же необходимо в другую таблицу вывести запись о событии в виде произвольного текста, о времени неработоспособности оборудования.
Например
20 раз появилась 1 методом update а на 21 пришел 0
записать, что со стольки то, до стольки, не было ответа от оборудования такого то.
Вопрос в чем.
реально ли создать такой триггер, который будет считывать значение только одного поля в строке. И записывать время неработоспособности оборудования, а не все 20 update.
Если я не прав поправьте меня. Может это как то по другому решается, что бы не изобретать велосипед подскажите где взять информацию.
Отредактированно ingfa (30.08.2014 01:07:35)
Неактивен
Для решения вашей задачи логично раз в некоторое время запускать процедуру, которая будет составлять выжимку за отчетный период.
Неактивен
Примерчиков нет?
Неактивен
А что именно нуждается в примере? Запрос, который выбирает значение или который пишет в другую таблицу? Если так, то приведите структуру Ваших таблиц, значения etc.
Что до самой процедуры, то можно по крону запускать (или по планировщику, если windows), или можно через events
Есть у меня поле в таблице в которое каждые 10 секунд пишутся данные о состоянии оборудования.
А почему бы в том же месте и не проверять и не делать соотв. действия?
Неактивен
Структура таблиц простая
cursor.execute("create table IF NOT EXISTS stranichka_t13006 (nomer_potoka CHAR(50) NULL, snmp_sost CHAR(50) NULL, sostoyanie_potoka CHAR(50) NULL, snmp_avar CHAR(50) NULL,sostoyanie_avar CHAR(50) NULL DEFAULT 'Не определенное',chislo TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP,nazvanie_potoka CHAR(50) NULL,cvet_teksta, vivod CHAR(50) NULL)")
nomer_potoka это просто номер потока E1-1 например
snmp_sost это snmp команда (не используется)
sostoyanie_potoka это то что нужно, сюда приходят каждые 10 секунд данные и в зависимости от состояния этого поля, мне нужно формировать таблицу неработоспособности E1-1 например и из этой таблицы уже формировать сколько был неработоспособен канал.
snmp_avar это snmp команда (не используется)
sostoyanie_avar из этого поля добавлять уже название аварии что произошла во вновь созданную таблицу.
chislo ну это понятно что
А данные я добавляю с помощью команды
update изменяются только 3 поля
sostoyanie_potoka
sostoyanie_avar
chislo
deadka написал:
А что именно нуждается в примере? Запрос, который выбирает значение или который пишет в другую таблицу? Если так, то приведите структуру Ваших таблиц, значения etc.
Что до самой процедуры, то можно по крону запускать (или по планировщику, если windows), или можно через eventsЕсть у меня поле в таблице в которое каждые 10 секунд пишутся данные о состоянии оборудования.
А почему бы в том же месте и не проверять и не делать соотв. действия?
Неактивен
Если по простому написать, что бы вас не запутывать.
Я не понимаю, как мне, при поступившей аварии в поля
sostoyanie_potoka
sostoyanie_avar
зафиксировать куда то, что они не работали.
Неактивен
Я не понимаю, как мне, при поступившей аварии в поля
sostoyanie_potoka
sostoyanie_avar
зафиксировать куда то, что они не работали.
Эмм. Вопрос сводится к тому - как вставить данные в таблицу?
А мне же необходимо в другую таблицу вывести запись о событии в виде произвольного текста, о времени неработоспособности оборудования.
Ну, значит в этой другой таблице должно быть поле типа datetime или timestamp - и туда нужно вставить текущее время, описание ошибки, причину аварии и прочее.
Неактивен
но ведь данные появляются каждые 10 секунд а мне необходимо начало аварии и конец или вычислить между началом аварии и концом. Как это сделать?
Неактивен
Ну так смотрите в данные - если там сказано про аварию, то так и запишите..
Или формализуйте вопрос несколько точнее.
Неактивен
Вот как могу попытаюсь объяснить.
Авария например была с 17-00 01.09.2014 по 17-01 01.09.2014
sostoyanie_potoka sostoyanie_avar chislo
0 norma 16-59-50 01.09.2014
1 avariya_electrop 17-00-00 01.09.2014
1 avariya_electrop 17-00-10 01.09.2014
1 avariya_electrop 17-00-20 01.09.2014
1 avariya_electrop 17-00-30 01.09.2014
1 avariya_electrop 17-00-40 01.09.2014
1 avariya_electrop 17-00-50 01.09.2014
0 norma 17-01-00 01.09.2014
В основной таблице просто обновляются поля, мне необходимо записать это с отдельную таблицу в таком же виде как я расписал, это наверное делается триггером, как я понял. Из того, что получилось высчитать общее время неработоспособности оборудования.
Конкретно нужна такая запись.
avariya_electrop с 17-00-00 01.09.2014 по 17-01-00 01.09.2014
Неактивен
Приведите результат запроса show create table ВАША_ТАБЛИЦА
где колонки
sostoyanie_potoka sostoyanie_avar chislo
Хочу увидеть, как вы chislo храните - очень надеюсь, что datetime или timestamp.
Что касается алгоритма, как это можно сделать (сразу говорю - думаю, что не самый оптимальный, для нахождения оптимального надо поэксперементировать, как структуры таблицы пришлете попробую):
Получили Вы данные
Если norma, то все хорошо.
Исходим из того, что Вы получили avariya_electrop, то есть строку
1 avariya_electrop 17-00-50 01.09.2014
Далее в цикле находим самую дальнюю запись, у которой avariya_electrop
т. е. сперва находим запросом
select * FROM mytable WHERE chislo < ТЕКУЩЕЕ_ЗНАЧЕНИЕ_Т_Е_17-00-50 01.09.2014 ORDER BY chislo DESC limit 1;
"следующую" запись по направлению против часовой стрелки.
Проверяете ее sostoyanie_avar, если оно снова avariya_electrop, то еще раз запускаете запрос, только там ТЕКУЩЕЕ_ЗНАЧЕНИЕ уже будет 17-00-40 01.09.2014
И так до упора, пока не находим первоначальное аварийное время - ну или первую запись в таблице.
Далее вставляете в отчетную таблицу запись с найденными временами - ну или обновляете.
Неактивен
Дело в том что таблицы у меня создаются в моделях django, данные в базу данных пишутся из скрипта который опрашивает оборудование. и все что я написал про 0 и 1 это не совсем точно. Сделал я это по причине облегчить понимание, себе и вам.
А вот правдивая история. Сначало создаю модели
Вот модели
class t13006 (models.Model):
nomer_potoka = models.CharField(max_length=1000,blank=True, null=True)
snmp_sost = models.CharField(max_length=1000,blank=True, null=True)
sostoyanie_potoka = models.CharField(max_length=1000,blank=True, null=True)
snmp_avar = models.CharField(max_length=1000,blank=True, null=True)
sostoyanie_avar = models.CharField(max_length=1000,blank=True, null=True)
chislo = models.DateTimeField(blank=True, null=True)
nazvanie_potoka = models.CharField(max_length=1000,blank=True, null=True)
cvet_teksta = models.CharField(max_length=1000, default='black',blank=True, null=True)
vivod = models.CharField(max_length=1000,blank=True, null=True)
class t13009 (models.Model):
nomer_potoka = models.CharField(max_length=1000,blank=True, null=True)
snmp_sost = models.CharField(max_length=1000,blank=True, null=True)
sostoyanie_potoka = models.CharField(max_length=1000,blank=True, null=True)
snmp_avar = models.CharField(max_length=1000,blank=True, null=True)
sostoyanie_avar = models.CharField(max_length=1000,blank=True, null=True)
chislo = models.DateTimeField(blank=True, null=True)
nazvanie_potoka = models.CharField(max_length=1000,blank=True, null=True)
cvet_teksta = models.CharField(max_length=1000, default='black',blank=True, null=True)
vivod = models.CharField(max_length=1000,blank=True, null=True)
class t13008 (models.Model):
nomer_potoka = models.CharField(max_length=1000,blank=True, null=True)
snmp_sost = models.CharField(max_length=1000,blank=True, null=True)
sostoyanie_potoka = models.CharField(max_length=1000,blank=True, null=True)
snmp_avar = models.CharField(max_length=1000,blank=True, null=True)
sostoyanie_avar = models.CharField(max_length=1000,blank=True, null=True)
chislo = models.DateTimeField(blank=True, null=True)
nazvanie_potoka = models.CharField(max_length=1000,blank=True, null=True)
cvet_teksta = models.CharField(max_length=1000, default='black',blank=True, null=True)
vivod = models.CharField(max_length=1000,blank=True, null=True)
class t13012 (models.Model):
nomer_potoka = models.CharField(max_length=1000,blank=True, null=True)
snmp_sost = models.CharField(max_length=1000,blank=True, null=True)
sostoyanie_potoka = models.CharField(max_length=1000,blank=True, null=True)
snmp_avar = models.CharField(max_length=1000,blank=True, null=True)
sostoyanie_avar = models.CharField(max_length=1000,blank=True, null=True)
chislo = models.DateTimeField(blank=True, null=True)
nazvanie_potoka = models.CharField(max_length=1000,blank=True, null=True)
cvet_teksta = models.CharField(max_length=1000, default='black',blank=True, null=True)
vivod = models.CharField(max_length=1000,blank=True, null=True)
class t13011 (models.Model):
nomer_potoka = models.CharField(max_length=1000,blank=True, null=True)
snmp_sost = models.CharField(max_length=1000,blank=True, null=True)
sostoyanie_potoka = models.CharField(max_length=1000,blank=True, null=True)
snmp_avar = models.CharField(max_length=1000,blank=True, null=True)
sostoyanie_avar = models.CharField(max_length=1000,blank=True, null=True)
chislo = models.DateTimeField(blank=True, null=True)
nazvanie_potoka = models.CharField(max_length=1000,blank=True, null=True)
cvet_teksta = models.CharField(max_length=1000, default='black',blank=True, null=True)
vivod = models.CharField(max_length=1000,blank=True, null=True)
class t13010 (models.Model):
nomer_potoka = models.CharField(max_length=1000,blank=True, null=True)
snmp_sost = models.CharField(max_length=1000,blank=True, null=True)
sostoyanie_potoka = models.CharField(max_length=1000,blank=True, null=True)
snmp_avar = models.CharField(max_length=1000,blank=True, null=True)
sostoyanie_avar = models.CharField(max_length=1000,blank=True, null=True)
chislo = models.DateTimeField(blank=True, null=True)
nazvanie_potoka = models.CharField(max_length=1000,blank=True, null=True)
cvet_teksta = models.CharField(max_length=1000, default='black',blank=True, null=True)
vivod = models.CharField(max_length=1000,blank=True, null=True)
class natex101 (models.Model):
nomer_potoka = models.CharField(max_length=1000, blank=True, null=True)
snmp_sost_pr = models.CharField(max_length=1000,blank=True, null=True)
sostoyanie_potoka_pr = models.CharField(max_length=1000,blank=True, null=True)
snmp_sost_per = models.CharField(max_length=1000,blank=True, null=True)
sostoyanie_potoka_per = models.CharField(max_length=1000,blank=True, null=True)
chislo = models.DateTimeField(blank=True, null=True)
nazvanie_potoka = models.CharField(max_length=1000,blank=True, null=True)
cvet_teksta = models.CharField(max_length=1000, default='black',blank=True, null=True)
vivod = models.CharField(max_length=1000,blank=True, null=True)
class natex103 (models.Model):
nomer_potoka = models.CharField(max_length=1000, blank=True, null=True)
snmp_sost_pr = models.CharField(max_length=1000,blank=True, null=True)
sostoyanie_potoka_pr = models.CharField(max_length=1000,blank=True, null=True)
snmp_sost_per = models.CharField(max_length=1000,blank=True, null=True)
sostoyanie_potoka_per = models.CharField(max_length=1000,blank=True, null=True)
chislo = models.DateTimeField(blank=True, null=True)
nazvanie_potoka = models.CharField(max_length=1000,blank=True, null=True)
cvet_teksta = models.CharField(max_length=1000, default='black',blank=True, null=True)
vivod = models.CharField(max_length=1000,blank=True, null=True)
class natex21 (models.Model):
nomer_potoka = models.CharField(max_length=1000, blank=True, null=True)
snmp_sost_pr = models.CharField(max_length=1000,blank=True, null=True)
sostoyanie_potoka_pr = models.CharField(max_length=1000,blank=True, null=True)
snmp_sost_per = models.CharField(max_length=1000,blank=True, null=True)
sostoyanie_potoka_per = models.CharField(max_length=1000,blank=True, null=True)
chislo = models.DateTimeField(blank=True, null=True)
nazvanie_potoka = models.CharField(max_length=1000,blank=True, null=True)
cvet_teksta = models.CharField(max_length=1000, default='black',blank=True, null=True)
vivod = models.CharField(max_length=1000,blank=True, null=True)
class natex22 (models.Model):
nomer_potoka = models.CharField(max_length=1000, blank=True, null=True)
snmp_sost_pr = models.CharField(max_length=1000,blank=True, null=True)
sostoyanie_potoka_pr = models.CharField(max_length=1000,blank=True, null=True)
snmp_sost_per = models.CharField(max_length=1000,blank=True, null=True)
sostoyanie_potoka_per = models.CharField(max_length=1000,blank=True, null=True)
chislo = models.DateTimeField(blank=True, null=True)
nazvanie_potoka = models.CharField(max_length=1000,blank=True, null=True)
cvet_teksta = models.CharField(max_length=1000, default='black',blank=True, null=True)
vivod = models.CharField(max_length=1000,blank=True, null=True)
Потом заполняю таблицы данными, для того что бы можно было использовать команду update
Вот чем заполняю
там где 2 потока
from pysnmp.entity.rfc3413.oneliner import cmdgen
import MySQLdb
connection = MySQLdb.connect(host = '127.0.0.1' ,user='root', passwd='lthtdj2013', db='snmp', charset = 'utf8')
cursor = connection.cursor()
#cursor.execute("create table IF NOT EXISTS stranichka_t13006 (nomer_potoka CHAR(50) NULL, snmp_sost CHAR(50) NULL, sostoyanie_potoka CHAR(50) NULL, snmp_avar CHAR(50) NULL,sostoyanie_avar CHAR(50) NULL DEFAULT 'Не определенное',chislo TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP,nazvanie_potoka CHAR(50) NULL,cvet_teksta, vivod CHAR(50) NULL)")
cursor.execute("""insert into stranichka_t13006 (nomer_potoka, snmp_sost, sostoyanie_potoka, snmp_avar,sostoyanie_avar, nazvanie_potoka, cvet_teksta, vivod) VALUE ("E1-1","1.3.6.1.4.1.164.3.1.4.1.1.1.5.5.1","В работе", "1.3.6.1.4.1.164.3.1.4.1.1.1.6.5.1","Отсуствует","Без названия","black", "1")""")
cursor.execute("""insert into stranichka_t13006 (nomer_potoka, snmp_sost, sostoyanie_potoka, snmp_avar,sostoyanie_avar, nazvanie_potoka, cvet_teksta, vivod) VALUE ("E1-2","1.3.6.1.4.1.164.3.1.4.1.1.1.5.5.2","В работе", "1.3.6.1.4.1.164.3.1.4.1.1.1.6.5.2","Отсуствует","Без названия","black", "1")""")
cursor.execute("commit")
Там где 16 потоков
#cursor.execute("create table IF NOT EXISTS stranichka_natex101 (nomer_potoka CHAR(50) NULL, snmp_sost_pr CHAR(50) NULL, sostoyanie_potoka_pr CHAR(50) NULL, snmp_sost_per CHAR(50) NULL,sostoyanie_potoka_per CHAR(50) NULL DEFAULT 'Не определенное',chislo TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP,nazvanie_potoka CHAR(50) NULL,cvet_teksta, vivod CHAR(50) NULL)")
cursor.execute("""insert into stranichka_natex101 (nomer_potoka, snmp_sost_pr, sostoyanie_potoka_pr, snmp_sost_per,sostoyanie_potoka_per, nazvanie_potoka, cvet_teksta, vivod) VALUE ("E1-1","1.3.6.1.2.1.10.18.6.1.10.1","В работе", "1.3.6.1.2.1.10.18.6.1.10.2","В работе","Без названия","black", "1")""")
cursor.execute("""insert into stranichka_natex101 (nomer_potoka, snmp_sost_pr, sostoyanie_potoka_pr, snmp_sost_per,sostoyanie_potoka_per, nazvanie_potoka, cvet_teksta, vivod) VALUE ("E1-2","1.3.6.1.2.1.10.18.6.1.10.3","В работе", "1.3.6.1.2.1.10.18.6.1.10.4","В работе","Без названия","black", "1")""")
cursor.execute("""insert into stranichka_natex101 (nomer_potoka, snmp_sost_pr, sostoyanie_potoka_pr, snmp_sost_per,sostoyanie_potoka_per, nazvanie_potoka, cvet_teksta, vivod) VALUE ("E1-3","1.3.6.1.2.1.10.18.6.1.10.5","В работе", "1.3.6.1.2.1.10.18.6.1.10.6","В работе","Без названия","black", "1")""")
cursor.execute("""insert into stranichka_natex101 (nomer_potoka, snmp_sost_pr, sostoyanie_potoka_pr, snmp_sost_per,sostoyanie_potoka_per, nazvanie_potoka, cvet_teksta, vivod) VALUE ("E1-4","1.3.6.1.2.1.10.18.6.1.10.7","В работе", "1.3.6.1.2.1.10.18.6.1.10.8","В работе","Без названия","black", "1")""")
cursor.execute("""insert into stranichka_natex101 (nomer_potoka, snmp_sost_pr, sostoyanie_potoka_pr, snmp_sost_per,sostoyanie_potoka_per, nazvanie_potoka, cvet_teksta, vivod) VALUE ("E1-5","1.3.6.1.2.1.10.18.6.1.10.9","В работе", "1.3.6.1.2.1.10.18.6.1.10.10","В работе","Без названия","black", "1")""")
cursor.execute("""insert into stranichka_natex101 (nomer_potoka, snmp_sost_pr, sostoyanie_potoka_pr, snmp_sost_per,sostoyanie_potoka_per, nazvanie_potoka, cvet_teksta, vivod) VALUE ("E1-6","1.3.6.1.2.1.10.18.6.1.10.11","В работе", "1.3.6.1.2.1.10.18.6.1.10.12","В работе","Без названия","black", "1")""")
cursor.execute("""insert into stranichka_natex101 (nomer_potoka, snmp_sost_pr, sostoyanie_potoka_pr, snmp_sost_per,sostoyanie_potoka_per, nazvanie_potoka, cvet_teksta, vivod) VALUE ("E1-7","1.3.6.1.2.1.10.18.6.1.10.13","В работе", "1.3.6.1.2.1.10.18.6.1.10.14","В работе","Без названия","black", "1")""")
cursor.execute("""insert into stranichka_natex101 (nomer_potoka, snmp_sost_pr, sostoyanie_potoka_pr, snmp_sost_per,sostoyanie_potoka_per, nazvanie_potoka, cvet_teksta, vivod) VALUE ("E1-8","1.3.6.1.2.1.10.18.6.1.10.15","В работе", "1.3.6.1.2.1.10.18.6.1.10.16","В работе","Без названия","black", "1")""")
cursor.execute("""insert into stranichka_natex101 (nomer_potoka, snmp_sost_pr, sostoyanie_potoka_pr, snmp_sost_per,sostoyanie_potoka_per, nazvanie_potoka, cvet_teksta, vivod) VALUE ("E1-9","1.3.6.1.2.1.10.18.6.1.10.17","В работе", "1.3.6.1.2.1.10.18.6.1.10.18","В работе","Без названия","black", "1")""")
cursor.execute("""insert into stranichka_natex101 (nomer_potoka, snmp_sost_pr, sostoyanie_potoka_pr, snmp_sost_per,sostoyanie_potoka_per, nazvanie_potoka, cvet_teksta, vivod) VALUE ("E1-10","1.3.6.1.2.1.10.18.6.1.10.19","В работе", "1.3.6.1.2.1.10.18.6.1.10.20","В работе","Без названия","black", "1")""")
cursor.execute("""insert into stranichka_natex101 (nomer_potoka, snmp_sost_pr, sostoyanie_potoka_pr, snmp_sost_per,sostoyanie_potoka_per, nazvanie_potoka, cvet_teksta, vivod) VALUE ("E1-11","1.3.6.1.2.1.10.18.6.1.10.21","В работе", "1.3.6.1.2.1.10.18.6.1.10.22","В работе","Без названия","black", "1")""")
cursor.execute("""insert into stranichka_natex101 (nomer_potoka, snmp_sost_pr, sostoyanie_potoka_pr, snmp_sost_per,sostoyanie_potoka_per, nazvanie_potoka, cvet_teksta, vivod) VALUE ("E1-12","1.3.6.1.2.1.10.18.6.1.10.23","В работе", "1.3.6.1.2.1.10.18.6.1.10.24","В работе","Без названия","black", "1")""")
cursor.execute("""insert into stranichka_natex101 (nomer_potoka, snmp_sost_pr, sostoyanie_potoka_pr, snmp_sost_per,sostoyanie_potoka_per, nazvanie_potoka, cvet_teksta, vivod) VALUE ("E1-13","1.3.6.1.2.1.10.18.6.1.10.25","В работе", "1.3.6.1.2.1.10.18.6.1.10.26","В работе","Без названия","black", "1")""")
cursor.execute("""insert into stranichka_natex101 (nomer_potoka, snmp_sost_pr, sostoyanie_potoka_pr, snmp_sost_per,sostoyanie_potoka_per, nazvanie_potoka, cvet_teksta, vivod) VALUE ("E1-14","1.3.6.1.2.1.10.18.6.1.10.27","В работе", "1.3.6.1.2.1.10.18.6.1.10.28","В работе","Без названия","black", "1")""")
cursor.execute("""insert into stranichka_natex101 (nomer_potoka, snmp_sost_pr, sostoyanie_potoka_pr, snmp_sost_per,sostoyanie_potoka_per, nazvanie_potoka, cvet_teksta, vivod) VALUE ("E1-15","1.3.6.1.2.1.10.18.6.1.10.29","В работе", "1.3.6.1.2.1.10.18.6.1.10.30","В работе","Без названия","black", "1")""")
cursor.execute("""insert into stranichka_natex101 (nomer_potoka, snmp_sost_pr, sostoyanie_potoka_pr, snmp_sost_per,sostoyanie_potoka_per, nazvanie_potoka, cvet_teksta, vivod) VALUE ("E1-16","1.3.6.1.2.1.10.18.6.1.10.31","В работе", "1.3.6.1.2.1.10.18.6.1.10.32","В работе","Без названия","black", "1")""")
cursor.execute("commit")
А дальше уже скриптом обновляю таблицы
cursor.execute("update {0} SET sostoyanie_avar = '{3}', chislo = CURRENT_TIMESTAMP where nomer_potoka = '{1}' and snmp_avar = '{2}';".format(b,c,name.prettyPrint(),avariya))
cursor.execute("COMMIT;")
print('%s = %s' % (name.prettyPrint(), val.prettyPrint()))
То есть количество строк у меня одно и тоже всегда.
Может я все не правильно делаю, и данные как то по другому нужно сохранять в базе данных? Подскажите если хоть что то поняли из моего дерьмо кода.
Неактивен
Давайте с другой стороны зайдём - мой алгоритм Вам понятен?, можете его реализовать? Если нет, то давайте разберемся - что именно в нем непонятно?
Неактивен
Я уже подумываю, как в корне все переделать.
А как бы вы сделали запись данных в базу данных что бы бы не было таких проблем. ведь наверняка я изобретаю велосипед.
Подскажите лучше как все переделать?
Неактивен