这是我正在研究的一个多部分问题。是的,我对Python比较陌生,所以我可能无法正确地表达。在
我想知道如何完成对一些JSON数据的迭代,这些数据是从API中提取的,然后我想我需要创建dict或数据列表,然后将“INSERT”推送到PostgreSQL数据库中。在
这是我从设备中提取的JSON数据:
{u'service_group_stat': {u'cur_conns': 344,
u'member_stat_list': [{u'cur_conns': 66,
u'req_bytes': 1476212423,
u'req_pkts': 10449342,
u'resp_bytes': 33132743858,
u'resp_pkts': 25652317,
u'server': u'WWW0006',
u'tot_conns': 172226},
{u'cur_conns': 64,
u'req_bytes': 1666275823,
u'req_pkts': 11982676,
u'resp_bytes': 37575461036,
u'resp_pkts': 29175599,
u'server': u'WWW0005',
u'tot_conns': 205244},
{u'cur_conns': 89,
u'req_bytes': 1671222671,
u'req_pkts': 11940864,
u'resp_bytes': 37064038202,
u'resp_pkts': 28747313,
u'server': u'WWW0004',
u'tot_conns': 195789},
{u'cur_conns': 37,
u'req_bytes': 94117510958,
u'req_pkts': 585916896,
u'resp_bytes': 1860691638618,
u'resp_pkts': 1439228725,
u'server': u'WWW0003',
u'tot_conns': 7366402},
{u'cur_conns': 42,
u'req_bytes': 98580368121,
u'req_pkts': 642797814,
u'resp_bytes': 1934241923560,
u'resp_pkts': 1498242871,
u'server': u'WWW0002',
u'tot_conns': 7221995},
{u'cur_conns': 46,
u'req_bytes': 94886760323,
u'req_pkts': 593577169,
u'resp_bytes': 1863028601218,
u'resp_pkts': 1441197389,
u'server': u'WWW0001',
u'tot_conns': 7260787}],
u'name': u'SG_SITE1.BUSINESS.COM_443',
u'req_bytes': 292398350319,
u'req_pkts': 1856664761,
u'resp_bytes': 5765734406492,
u'resp_pkts': 4462244214,
u'tot_conns': 22422443}}
它以“数据”的形式存储。在
所以我想我们需要这样的东西:
^{pr2}$目标是提取列表中每个服务器的指标。在
实际上,我希望提取以下内容并将其插入数据库:
SRVR_NAME CURR_CONNS TOT_CONNS REQ_BYTES REQ_PKTS RESP_BYTES RESP_PKTS
WWW00006 66 172226 1476212423 10449342 33132743858 25652317
WWW00005 64 205244 1666275823 11982676 37575461036 29175599
WWW00004 89 195789 1671222671 11940864 37064038202 28747313
WWW00003 37 7366402 94117510958 585916896 1860691638618 1439228725
我不确定是否应该尝试阅读一台服务器的详细信息,根据该服务器的值创建dict,然后一次将一台服务器插入数据库?在
比如:
# Create DICT of server metrics from JSON data
metrics = ({"SRVR_NAME":'SRVR_NAME', "CURR_CONNS":'CURR_CONNS',
"TOTAL_CONNS":'TOTAL_CONNS', "REQ_BYTES":'REQ_BYTES', "REQ_PKTS":'REQ_PKTS', "RESP_BYTES":'RESP_BYTES',
"RESP_PKTS":'RESP_PKTS'})
# Execute storing metrics for server
# Table: metrics Fields:(SRVR_NAME, CURR_CONNS, TOTAL_CONNS, REQ_BYTES, REQ_PKTS, RESP_BYTES, RESP_PKTS)
# Using psycopg2 to interact with PostgreSQL
cur.executemany("""INSERT INTO metrics("SRVR_NAME", "CURR_CONNS", "TOTAL_CONNS", "REQ_BYTES",
"REQ_PKTS", "RESP_BYTES", "RESP_PKTS") VALUES (%(SRVR_NAME)s, %(DATE)s, %(TIME)s, %(CURR_CONNS)s,
%(TOTAL_CONNS)s, %(REQ_BYTES)s, %(REQ_PKTS)s, %(RESP_BYTES)s, %(RESP_PKTS)s)""", metrics)
我想这接近于我一次能为一台服务器做度量的方法了吗?在
我还没把事情搞清楚,但我想差不多了。在
但真正的问题是,我能否构建一个更大的列表或dict,包含每个服务器的所有细节,然后进行大容量插入?或者我可以迭代新的dict/list并插入该dict/list的每次传递/迭代?在
希望这有道理。只是不善于简明扼要地把它分解和解释。在
希望了解实现这一目标的最有效方法。在
更新#1
使用一些建议的代码,我尝试使用以下代码:
now = datetime.datetime.now()
date = str(now.strftime("%m-%d-%Y"))
time = str(now.strftime("%H:%M:%S"))
# Define a DICT/LIST of ServiceGroup names that we will pull stats for
name = 'SG_ACCOUNT.BUSINESS.COM_443'
# Pull stats from A10 LB for ServiceGroup and store in memory
# Will want to eventually iterate through a DICT/LIST of SG names
data = c.slb.service_group.stats(name)
srv = """INSERT INTO server("SG_NAME", "SRVR_NAME") VALUES ('name', %(server)s)"""
argslist1 = data[u'service_group_stat'][u'member_stat_list']
psycopg2.extras.execute_batch(cur, srv, argslist1, page_size=100)
sql = """INSERT INTO metrics("SRVR_NAME", "DATE", "TIME", "CURR_CONNS", "TOTAL_CONNS",
"REQ_BYTES", "REQ_PKTS", "RESP_BYTES",
"RESP_PKTS") VALUES (%(server)s,
'date', 'time', %(curr_conns)s, %(total_conns)s,
%(req_bytes)s, %(req_pkts)s, %(resp_bytes)s, %(resp_pkts)s)"""
argslist2 = data[u'service_group_stat'][u'member_stat_list']
psycopg2.extras.execute_batch(cur, sql, argslist2, page_size=100)
但是它失败了,因为我似乎无法引入以前声明的值,例如:
date = str(now.strftime("%m-%d-%Y"))
time = str(now.strftime("%H:%M:%S"))
name = 'SG_ACCOUNT.BUSINESS.COM_443'
尝试插入“name”时出现以下错误
DETAIL: Key (SG_NAME)=(name) is not present in table "servicegroup".
我不认为它实际上是在提取为'name'定义的值,而是试图插入“servicegroup”表中不存在的“name”。在
看一下http://initd.org/psycopg/docs/extras.html#module-psycopg2.extras它说{}不是性能最好的。另一种选择是http://initd.org/psycopg/docs/extras.html#fast-execution-helpers中的
execute_batch()
这里
^{pr2}$argslist
是由data[u'service_group_stat'][u'member_stat_list']
得到的,看起来像:相关问题 更多 >
编程相关推荐