我正在尝试将在Python 3.6.5中获得的数据插入到已在Microsoft SQL Server 2014中创建的表中。我能够将计算机的名称和IP地址存储到一行中,但是插入应用程序名称。我有一个for循环有效,但似乎只在第一次迭代中有效。
我想每次循环都创建一个新行。新行将包含计算机的名称,IP地址和唯一的应用程序名称(可以在阵列中找到)。相反,它只有一行,并且直到通过最外层循环的下一次迭代开始才创建另一行。
这是我的代码:
def main():
for i in range(45, 48): # Pings addresses 192.168.1.1 to 192.168.1.255
adr = ipa + str(i) # str(i) is the machine number that follows the rest of the IP address
if is_up(adr):
machine = getfqdn(adr)
name = subprocess.check_output('for /f "usebackq skip=1 tokens=*" %i in (`wmic/node:' + adr + ' product get name ^| findstr /r /v "^$"`) do @echo %i', shell=True)
namelist = str(name).replace('b', '').replace('\\r', '').replace('\\n', '|').split('|')
loop = 0
for j in namelist:
loop += 1
if loop == 1:
cur.execute("INSERT INTO InstalledApps (HostName, IP, AppName) VALUES ('" + machine + "', '" + adr + "', '" + str(j)[1:len(j)] + "')")
conn.commit()
elif loop < (namelist.__len__() - 2):
cur.execute("INSERT INTO InstalledApps (HostName, IP, AppName) VALUES ('" + machine + "', '" + adr + "', '" + str(j)[0:len(j)] + "')")
conn.commit()
conn.commit()
# vendor = subprocess.check_output('wmic/node:' + adr + ' product get vendor', shell=True)
# version = subprocess.check_output('wmic/node:' + adr + ' product get version', shell=True)
conn.commit()
conn.commit()
conn.close()
一旦获得名称,我将在供应商和版本方面进行工作,因为它们的获取方式相同。
该表显示每次通过外循环时,内循环的第一次迭代结果。这就是我要解决的问题。
我尝试调试它,有时conn.commit()会覆盖第一行中的先前数据,但不会形成新行。
更新:我知道了原因。它正在写行,但是我在用于显示该表的.sql文件中有此内容:
--WITH Apps AS
--(
-- SELECT *, ROW_NUMBER() OVER(PARTITION BY HostName ORDER BY IP) AS ROWNUMBER
-- FROM InstalledApps
--)
--Delete From Apps Where ROWNUMBER > 1
最初没有评论。现在,它们已经删除了,不再成为问题。