Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/305.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sqlite/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sqlite3与python插入同一行_Python_Sqlite - Fatal编程技术网

Sqlite3与python插入同一行

Sqlite3与python插入同一行,python,sqlite,Python,Sqlite,我在sqlite3中的不同行上插入python脚本时遇到问题。但我希望它插入到同一行。我对使用脚本将信息插入数据库相当陌生,因此我在这方面的知识有限 数据库中的我的Id自动递增。是否有方法更新插入信息的前一行? 我希望数据库中的所有内容都在一行上。谢谢你的帮助 Sqlite表: create table ansible_packagelist (id integer PRIMARY KEY, date datetime default current_timestamp, host text,

我在sqlite3中的不同行上插入python脚本时遇到问题。但我希望它插入到同一行。我对使用脚本将信息插入数据库相当陌生,因此我在这方面的知识有限

数据库中的我的Id自动递增。是否有方法更新插入信息的前一行? 我希望数据库中的所有内容都在一行上。谢谢你的帮助

Sqlite表:

create table ansible_packagelist (id integer PRIMARY KEY, date datetime default current_timestamp, host text, package_name text, installed_version text NULL, upgradeable_version text NULL, required_version text NULL);
下面是我的python代码

import apt
import sys, getopt
import subprocess
import sqlite3

con = sqlite3.connect("ansible.db")

def aptpkg(package_name):
    cache = apt.Cache()
    pkg = cache[package_name]
    host = subprocess.Popen('hostname', stdout=subprocess.PIPE, universal_newlines=True).stdout.read().strip()
    if pkg.is_installed:
        print host
        print 'Current ' + package_name + ' installed:', pkg.installed.version
        con.execute("insert into ansible_packagelist (date, host, package_name, installed_version) values (current_timestamp,?,?,?)", (host, package_name, pkg.installed.version,))
    else:
        print host, package_name + ' is not installed on this system.\n'
    if pkg.is_upgradable:
        print 'Upgradeable version of ' + package_name + ' :', pkg.candidate.version
        con.execute("insert into ansible_packagelist (upgradeable_version) values (?)", (pkg.candidate.version,))
    con.commit()

def aptver(package_version):
    cache1 = apt.Cache()
    pkg1 = cache1[packname]
    con.execute("insert into ansible_packagelist (required_package) values (?)", (package_version,))
    if package_version >= pkg1.installed.version:
        print 'The Package needs to be upgraded, ' + package_version + ' is the version needed'
    elif package_version == pkg1.installed.version:
        print 'The package is at the correct version'
    elif package_version <= pkg1.installed.version:
        print 'The package is at a greater version than requested'
    else:
        print 'The package is at the correct version'
    con.commit()
导入apt
导入sys,getopt
导入子流程
导入sqlite3
con=sqlite3.connect(“ansible.db”)
def aptpkg(机组名称):
cache=apt.cache()
pkg=缓存[包名称]
host=subprocess.Popen('hostname',stdout=subprocess.PIPE,universal\u newlines=True)。stdout.read().strip()
如果安装了pkg.u:
打印主机
打印“当前”+软件包名称+“已安装:”,pkg.installed.version
con.execute(“插入ansible_packagelist(日期、主机、软件包名称、安装版本)值(当前时间戳、、、?)”,(主机、软件包名称、软件包安装版本,)
其他:
打印主机,此系统上未安装程序包_name+。\n
如果包装可升级:
打印“+package_name+”的可升级版本:”,pkg.candidate.version
con.execute(“插入ansible_packagelist(可升级_版本)值(?),(pkg.candidate.version,)
con.commit()
def aptver(成套设备版本):
cache1=apt.Cache()
pkg1=cache1[packname]
con.execute(“插入ansible_packagelist(必需的_package)值(?),(package_版本,)
如果package_version>=pkg1.installed.version:
打印“需要升级软件包”+“软件包版本+”是需要的版本”
elif包_版本==pkg1.installed.version:
打印“软件包的版本正确”

SQL Insert中的elif包_version将始终创建新行

要修改现有行,需要使用Update语句。为此,您需要一个唯一的密钥来匹配。在这种情况下,您可能不需要使用包名。但通常您希望获取ID(设置为自动递增)并在代码中引用该ID

您的可升级更新语句应该如下所示

 con.execute("Update ansible_packagelist Set upgradeable_version = ? Where package_name = ?", (pkg.candidate.version, package_name))

是的,这可能是重复的。编辑:实际上不,它可以工作,但它可以处理每一行。它应该在包的任何位置将其更新为包的名称。现在我不确定你的数据库结构是什么。一切都很好,我想得太多了。我只是觉得有点不对劲,但无论如何,我只打算每月运行一次这个脚本。非常感谢你。