【问题标题】:For-loop exiting prematurelyFor循环过早退出
【发布时间】:2020-02-14 18:52:31
【问题描述】:

我遇到了一个问题,即 python for 循环过早退出。该循环按位置迭代 SQL 数据库条目。

如果找到位置,它将获取这些条目的 IP 地址并发送配置。如果作业失败,或者在我的情况下引发异常,则在异常中它将转到一个函数来更新状态、日期/时间。当前的预期结果是异常。

当它返回到原始函数时,它会退出循环并且不会转到下一个 DB 条目(我知道它在那里。)如果我从异常中删除该函数,那么一切正常。

当前结果。它显示了从一个功能到另一个功能的循环。我应该看到两次,或 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'

更多测试:

如果我从给出预期结果的 db_entry 函数中删除除打印语句之外的所有内容。

我正在考虑使用这行代码或模块/程序交互的东西。

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

【问题讨论】:

  • 发生的确切 AttributeError 是什么?
  • status 似乎没有定义,这可能会使 try-block 失败:db_entry(row[0], status)
  • 抱歉,状态应该是 status_1。我已经在我的代码中更改了它,但它仍然不起作用
  • AttributeError: 'NoneType' object has no attribute 'edit_config' - 这是因为 m 失败,或者与设备的连接失败。目前这是预期的
  • 附带说明,try 块中的代码应该是最低限度的。就目前而言,有很多行可能会引发 AttributeError。

标签: python sql python-3.x sqlite


【解决方案1】:

这是 sqlite3 模块。我在这里找到了 8 年前的旧答案,python sqlite3 for loop 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],))

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-09-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-22
    • 2014-11-04
    • 2018-02-12
    • 1970-01-01
    相关资源
    最近更新 更多