conn.commit()函数似乎在第二个循环中不起作用

时间:2018-08-22 16:25:55

标签: pycharm sql-server-2014 python-3.6 database-table pypyodbc

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

最初没有评论。现在,它们已经删除了,不再成为问题。

0 个答案:

没有答案