【发布时间】: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