首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将SQL中的列表与API中的列表进行比较

将SQL中的列表与API中的列表进行比较
EN

Stack Overflow用户
提问于 2018-08-29 09:36:28
回答 1查看 43关注 0票数 1

我为一个Security工作,我目前正在创建一个脚本,该脚本从我们的一个在线控制台供应商那里提取威胁数据,并将详细信息存储在SQLLite3数据库中供以后使用。

我已经能够查询来自控制台的所有威胁并将它们上传到数据库中,但是由于我们正在处理测试控制台上的3000多个威胁,脚本需要很长时间才能运行。

该脚本的基本大纲如下:

  1. 查询控制台API以获得威胁的总页面。(它们只能在200块中被查询)
  2. 循环遍历页面,获取每个页面上的所有威胁散列,并将它们存储在列表中。
  3. 循环此列表,并使用API查询每个散列以获得威胁的全部详细信息,并将其存储到SQL数据库中。

我现在面临一个问题,因为我试图优化脚本,以便它在连续运行时运行得更快。

我尝试实现一个函数,该函数查询SQL数据库并提取所有当前存储的散列并将它们添加到一个列表中,然后将该列表与API列表进行比较。如果散列出现在SQL列表中,则跳过查询该哈希的API。

我遇到的问题是,当我试图比较这些列表时,每个散列似乎都没有在SQL列表中找到,从而将其添加到用于上传到DB的最终哈希列表中。

查询DB的函数:

代码语言:javascript
复制
def get_sql_threats():
sql_threats = []
c.execute("SELECT sha256 from threats")
r = c.fetchall()
for result in r:
    sql_threats.append(result)
return sql_threats

函数,该函数获取威胁并比较列表:

代码语言:javascript
复制
def get_threat_hashes():
page_num = 1
total_pages = get_total_pages()
temp_list = []
threat_hashes = []   
sql_threats = get_sql_threats() 
while page_num <= total_pages:
    threat_list = get_threats(page_num)
    for y in threat_list:
        hash = y['sha256']
        temp_list.append(hash)
    for x in temp_list: 
        if x in sql_threats:
            print "skipping"
        elif x not in sql_threats:
            threat_hashes.append(x)
            print "Adding " + x

    page_num += 1
return threat_hashes

有人能看到这些功能有什么问题吗?为墙的文字道歉,但我想提供尽可能多的信息。

任何帮助都将不胜感激。

谢谢,克雷格

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-08-29 09:43:27

使用setset-difference而不是创建列表,如果/如果不是,则手动添加它们:

代码语言:javascript
复制
threatsFromAPI = set(range(10))  # populate from API

sqlThreats = set(range(3,10,2))  # populate from Server: sqlThreats = set(c.fetchall())

getFromThreadApi = threatsFromAPI - sqlThreats  # calculate diff between API and Sql

print("In API: ", threatsFromAPI)
print("In SQL: ", sqlThreats)    
print("Get new ones: ", getFromThreadApi)

输出:

代码语言:javascript
复制
In API:  {0, 1, 2, 3, 4, 5, 6, 7, 8, 9} 
In SQL:  {9, 3, 5, 7} 
Get new ones:  {0, 1, 2, 4, 6, 8}

杜库set() && set()类.还有一个不变的frozenset(),如果您可以一次填充它,就可以使用它(您可以分页通过,所以很可能不会)。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52074204

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档