For-l oop выход преждевременно - PullRequest
0 голосов
/ 14 февраля 2020

У меня проблема с тем, что python for l oop преждевременно завершает работу. L oop выполняет итерацию по SQL записям базы данных по местоположению.

Если местоположение найдено, оно будет захватывать IP-адрес этих записей и отправлять конфигурацию. Если задание не выполняется или выдает исключение в моем случае, в рамках исключения оно будет go функцией обновления статуса, даты / времени. Ожидаемый результат в настоящее время является исключением.

Когда он возвращается к исходной функции, он выходит из l oop и не go к следующей записи БД (которая, я знаю, есть). Если я удаляю функцию изнутри исключения, то все работает нормально.

Текущие результаты. Это показывает, что l oop работает от функции к функции. Я должен увидеть дважды или 6 строк:

Return to Function,
Back to function,
Finished,

Return to Function,
Back to function,
Finished,

Вот что я получаю

1. IP
2. Status
3. Location
4. Main

Selection: 3


Location: Test

Return to Function,
Back to function,
Finished,

Код, показанный ниже:

def db_entry(Device, status):

    int = 0

    while int < 1:

        c.execute('SELECT * FROM Automation WHERE Device=?', (Device,))

        if bool(c.fetchone()) == True:
            c.execute("UPDATE Automation SET Time=?, DateTime=?, Status=? WHERE Device=?"(time.strftime("%H:%M:%S +0000"), date.today(), status, Device))
            mydb.commit()
            int = int + 1
        else:
            c.execute("INSERT INTO Automation VALUES ('%s','NETCONF','POC', '%s', '%s', '%s')" % (Device, status, date.today(), time.strftime("%H:%M:%S +0000")))
            mydb.commit()
            int = int + 1
    else:
        print("Return to Function")

def send_single_configuration(file):

    status_1 = "Success"
    status_2 = "Fail"

    print("\n")
    view_database()
    print("\n")
    retries = 0

    print("1. IP")
    print("2. Status")
    print("3. Location")
    print("4. Main")
    print("\n")



    input_selection = input("Selection: ")
    print("\n")


    if input_selection == "3":

        location = input("Location: ")

        for row in c.execute('SELECT * FROM Automation WHERE Location=?', (location, )):
            try:
                m = manager.connect(row[0], 830, "cisco", "cisco", {'name': 'csr'})
                config_file = open(file=file).read()
                m.edit_config(config_file, target="running")
                db_entry(row[0], status_1)
                print("\n")
                print("Configuration Complete!")
                print("\n")

            except AttributeError:
                db_entry(row[0], status_2)
                print("Back to function")

        else:
            print("Finished")
Traceback (most recent call last):
  File "C:/Users/chris.oberdalhoff/PycharmProjects/Automation/venv/SQL.py", line 412, in <module>
    main()
  File "C:/Users/chris.oberdalhoff/PycharmProjects/Automation/venv/SQL.py", line 82, in main
    snmp_configuration()
  File "C:/Users/chris.oberdalhoff/PycharmProjects/Automation/venv/SQL.py", line 326, in snmp_configuration
    send_single_configuration(SNMP_file)
  File "C:/Users/chris.oberdalhoff/PycharmProjects/Automation/venv/SQL.py", line 395, in send_single_configuration
    m.edit_config(config_file, target="running")
AttributeError: 'NoneType' object has no attribute 'edit_config'

Дополнительные тесты:

Если я удалю все, кроме оператора print, из функции db_entry, которая дала ожидаемый результат.

Я думаю, что-то с этой строкой кода или что-то еще с модулем / программой взаимодействия.

    c.execute("UPDATE Automation SET Time=?, DateTime=?, Status=? WHERE 
    Device=?",(time.strftime("%H:%M:%S +0000"), date.today(), status, 
    Device))

1 Ответ

0 голосов
/ 18 февраля 2020

Это был модуль sqlite3. Я нашел старый ответ от 8 лет: go здесь, python sqlite3 для l oop update .

Модуль sqllitle3 не допускает многопоточность.

Я создал другой объект подключения и использовал его для обновления записи в БД

    c = mydb.cursor() # Find the location
    d = mydb.cursor() # Update the entry

            for row in c.execute('SELECT * FROM Automation WHERE Location=?', (location, )):
        try:

            device_connect(row[0])
            for capability in m.server_capabilities:
                continue

            d.execute("UPDATE Automation SET Time=?, DateTime=?, Status=? WHERE Device=?",(time.strftime("%H:%M:%S +00"), date.today(), status_1, row[0],))
            mydb.commit()

        except AttributeError:
            d.execute("UPDATE Automation SET Time=?, DateTime=?, Status=? WHERE Device=?",(time.strftime("%H:%M:%S +00"), date.today(), status_2, row[0],))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...