PYODBC:无法遍历 SQL 查询

PYODBC: Can't iterate through SQL Query

我正在尝试从 SQL 服务器中提取设备并对这些设备进行 ping 测试。

这是我到目前为止编写的代码:

import subprocess
import pyodbc

data = {}


def list():
    conn = pyodbc.connect("Driver={SQL Server};"
                          "Server=sqlserver;"
                          "Database=database;"
                          "Trusted_Connection=yes;")
    cursor = conn.cursor()
    cursor.execute('''
       SELECT TOP 10 Names FROM sqldatabasetable
       ''')
    results = cursor.fetchall()
    for result in results:
        return result.Names
        #print(result.Names)
    conn.close()


def pingtest():
    response = subprocess.Popen(['ping.exe', list()], stdout=subprocess.PIPE).communicate()[0]
    response = response.decode()
    if 'bytes=32' in response:
        status = 'Up'
        return status
    else:
        status = 'Down'
        return status

print(list())
print(pingtest())
#print(pingtest(), list())

当我在 list() 函数下只打印 print(result.Names) 时,我得到了 10 个设备,但是当我 return 它们到 list() 并在 pingtest() function,我只得到第一台设备。我知道我遗漏了一些非常明显的东西。这应该是一个直接的答案,但我无法弄清楚如果必须的话我应该在哪里循环。

这会将设备名称和 ping 状态打印为:

['devicename1' , 'devicename2', 'devicename3', 'devicename4', 'devicename5']
Down

按照我编写 print 命令的方式,我期待这样:

devicename1
Ping status of devicename1
devicename2
Ping status of devicename2
and so on...

当您在 for result in results: 循环中 print 时,您的代码会继续遍历检索到的每一行。但是,当您将 print 替换为 return 时,第一次通过循环时 return 将立即退出 list() 函数,因此您只能从第一个循环中获取值行。

如果您想要 list() 到 return 来自所有行的值,那么您可以用

这样的列表理解替换循环
return [result.Names for result in results]

您可以让 pingtest 接受 device_name 参数并传递给 ping.exe。因此,您可以先获取 list(),然后对其进行迭代,并将每个设备传递给该循环中的 pingtest

import subprocess
import pyodbc


data = {}


def mylist():
    conn = pyodbc.connect("Driver={SQL Server};"
                          "Server=sqlserver;"
                          "Database=database;"
                          "Trusted_Connection=yes;")
    cursor = conn.cursor()
    cursor.execute('''
       SELECT TOP 10 Names FROM sqldatabasetable
       ''')
    results = cursor.fetchall()
    conn.close()
    return [result.Names for result in results]


def pingtest(device):
    response = subprocess.Popen(['ping.exe', device], stdout=subprocess.PIPE).communicate()[0]
    response = response.decode()
    if 'bytes=32' in response:
        status = 'Up'
        return status
    else:
        status = 'Down'
        return status


devices = mylist()
for device in devices:
    print(device)
    print(pingtest(device))