使用 pyodbc 和 ping status 更新多行

Updating multiple rows using pyodbc and ping status

我希望使用 os 和 pyodbc 更新单列中的多行。我的代码如下:

def poll():
for x in device_query():
    command = os.system('ping -n 1 %s' % x[4])
    if command == 0 and x[8] == '':
        cursor.execute('insert into CamTable (UnitStatus)', 'online')
        cnxn.commit()
    elif command == 0 and x[8] == 'offline':
        cursor.execute("update CamTable set UnitStatus=? where UnitStaus='offline'", 'online')
        cnxn.commit()
    elif command != 0 and x[8] == '':
        cursor.execute('insert into CamTable (UnitStatus)', 'offline')
        cnxn.commit()
    elif command != 0 and x[8] == 'online':
        cursor.execute('update CamTable set UnitStatus=?', 'offline')
        cnxn.commit()
    else:
        pass

但是,x[8] 中的每一行都更新为相同的值。如何更新每一行的具体状态?

谢谢。

您需要一个 WHERE 子句,否则它将更新 table:

中的所有行
cursor.execute('update CamTable set UnitStatus=?', 'offline')

请阅读此处有关 UPDATE 查询和 INSERT 查询的文档,您的语法似乎有误:

https://code.google.com/p/pyodbc/wiki/GettingStarted

作为语法错误的另一个例子,这个:

cursor.execute('insert into CamTable (UnitStatus)', 'online')

应该是这样的:

cursor.execute('insert into CamTable (UnitStatus) VALUES (?)', 'online')

更多上下文也会有帮助,在您修复语法后,我们可以确定您实际执行的 if 子句中的位置。你从哪里得到 device_query()?

更新后的代码如下:

def poll():
    for x in device_query():
        command = os.system('ping -n 1 %s' % x[4])
        if command == 0 and x[8] == '':
            cursor.execute('insert into CamTable (UnitStatus) VALUES (?)', 'online')
            cnxn.commit()
        elif command == 0 and x[8] == 'offline':
            print 'update'
            cursor.execute("update CamTable set UnitStatus=? where ip=?", 'online', str(x[4]))
            cnxn.commit()
        elif command != 0 and x[8] == '':
            cursor.execute('insert into CamTable (UnitStatus) VALUES (?)', 'offline')
            cnxn.commit()
        elif command != 0 and x[8] == 'online':
            print 'update'
            cursor.execute("update CamTable set UnitStatus=? where ip=?", 'offline', str(x[4]))
            cnxn.commit()
        else:
            pass

x[4] 将在我的数据库中轮询设备的 IP 地址并进行相应更新。