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))
我正在尝试从 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))