Проблемы с реализацией python db слушателя - PullRequest
0 голосов
/ 18 января 2020

Я пишу модуль для программы, которая должна прослушивать новые записи в БД и выполнять функцию в случае публикации новых строк в этой таблице ... иначе как триггер.

Я написал некоторый код, но он не работает. Вот моя логика c: подключиться к базе данных, запросить новую строку, сравнить эту строку с переменной, если она не равна, запустить функцию, сохранить новую строку в переменной, иначе закрыть. Запускайте каждые 2 секунды, чтобы сравнить новую строку с тем, что хранится в переменной / объекте.

Все работает нормально и получает ожидаемые результаты из БД, однако я получаю 'локальную переменную' last_sent ', на которую ссылаются до назначения. Это смущает меня по двум причинам.

  1. Я думал, что я установил last_sent в 'none' как глобальную переменную / объект перед вызовом функций.

  2. Для того, чтобы мои логи сравнения c работали, я не могу установить last_sent в функции sendListener () перед if / else

Вот код.

from Logger import Logger
from sendSMS import sendSMS
from Needles import dbUser, dbHost, dbPassword, pull_stmt
import pyodbc
import time

#set last_sent to something
last_sent = ''

def sendListener():
    #connect to db
    cnxn = pyodbc.connect('UID='+dbUser+';PWD='+dbPassword+';DSN='+dbHost)
    cursor = cnxn.cursor()
    #run query to pull newest row
    cursor.execute(pull_stmt)
    results = cursor.fetchone()

    #if query results different from results stored in last_sent, run function. 
    #then set last_sent object to the query results for next comparison.
    if results != last_sent:
        sendSMS()
        last_sent = results
    else:
        cnxn.close()

# a loop to run the check every 2 seconds- as to lessen cpu usage
def sleepLoop():
    while 0 == 0:
        sendListener()
        time.sleep(2.0)

sleepLoop()

Я уверен, что есть лучший способ реализовать это.

1 Ответ

1 голос
/ 18 января 2020

Здесь:

if results != last_sent:
    sendSMS()
    last_sent = results
else:
    cnxn.close()

Python видит, что вы назначаете last_sent, но он не помечен как глобальный в этой функции, поэтому он должен быть локальным. Тем не менее, вы читаете его в results != last_sent перед его определением , поэтому вы получаете ошибку.

Чтобы решить эту проблему, пометьте ее как глобальную в начале функции:

def sendListener():
    global last_sent
    ...
...