PYODBC:无法通过SQL查询进行迭代

时间:2018-09-21 22:42:58

标签: python sql-server python-3.x pyodbc

我正在尝试从SQL Server中提取设备并对这些设备执行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())

当我在print(result.Names)函数下仅打印list()时,我得到10台设备,但是当我将它们返回到list()并迭代pingtest() function中的设备时,我得到了仅第一个设备。我知道我缺少一些显而易见的东西。这应该是一个简单的答案,但是如果有必要,我无法确切找出应该在哪里循环。

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

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

我期望像这样,按照我编写print命令的方式进行操作:

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

2 个答案:

答案 0 :(得分:3)

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

如果您希望list()返回所有行中的值,则可以用列表理解(如

)替换循环
return [result.Names for result in results]

答案 1 :(得分:2)

您可以使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))