多维句柄数组(python)

2024-06-10 22:52:47 发布

您现在位置:Python中文网/ 问答频道 /正文

我想用python构建一个动态插入查询。数据源是一个多维数组。数组如下所示:

[<insight>{
  "action":[
    {
      "name":"col1",
      "value":"20",
    },
    {
      "name":"col2",
      "value":"30",
    },...
  ],
  "call":"a"
}]

问题是“action”没有排序,而且大多数时候只包含一些列。第二个观点可能是这样的:

[<insight>{
  "action":[
    {
      "name":"col3",
      "value":"10",
    },
    {
      "name":"col2",
      "value":"50",
    },...
  ],
  "call":"b"
}]

总之,我有30列。有没有一种有效的方法来构建insert查询?结果可能是这样的:

call | col1 | col2 | col3
----------------------- 
a    |  20  |  30  |  0 
b    |  0   |  50  |  10

我的尝试是有效的,但非常密集。你知道吗

sql="INSERT INTO t_x ('col1','col2','col3') VALUES (("
cols=["col1","col2","col3"]
for insight in insights:
  for i in range(len(cols)):
    for j in range(insight["action"]):
      if cols[i]==insight["action"][j]["name"]:
        sql += insight["action"][j]["nvalue"] + ","
        break
      if j==len(insight["action"][j]["name"]):
        sql += "0,"
  sql = sql[:-1] + "),"
sql = sql[:-1] + ")"

核心思想是我有一个静态的INSERT前字符串(INSERT into t_x(COL1,COL2,COL3)…) 对于其余的部分,我需要遍历所有操作,并将名称与所有列名进行比较。结果如下:

sql = "INSERT INTO t_x ('col1','col2','col3') VALUES (('20','30','0'),('0','50','10'))"

如果我能用这样的直接语句替换循环搜索,那就太好了:

"INSERT INTO t_x ('col1','col2','col3') VALUES ((insight['action'][j]['col1'],insight['action'][j]['col2']...

有人知道我怎样才能更好地处理这种格式吗?我没有多少经验


Tags: nameinforsqlvalueactioncallcol2
1条回答
网友
1楼 · 发布于 2024-06-10 22:52:47

我试图解释json并将其分配给变量insights

insights = [{
  "action":[
    {
      "name":"col1",
      "value":"20",
    },
    {
      "name":"col2",
      "value":"30",
    }
  ],
  "call":"a"
},
{
  "action":[
    {
      "name":"col3",
      "value":"10",
    },
    {
      "name":"col2",
      "value":"50",
    }
  ],
  "call":"b"
}]

创建一个helper函数,使数据结构包含列值:

def empty_columns(n):
    return {'col%d' % i: 0 for i in range(1, n+1)}

下一个循环通过json填充参数行(使用名称而不是整数索引,只有两级for循环,以及一些空行使代码有喘息的空间):

def get_query_params(insights):
    n = 5  # number of columns, adapt to your needs
    res = []

    for action in insights:
        cur = [action['call']] + [0] * n
        cols = empty_columns(5)

        for colval in action['action']:
            cols[colval['name']] = colval['value']

        for i in range(1, n+1):  # fill the parameter array from cols
            cur[i] = cols['col%d' % i]
        res.append(cur)

    return res

现在可以验证参数是否为列表列表:

params = get_query_params(insights)
print params

输出将是(为了清晰起见,我添加了一个新行):

[['a', '20', '30', 0, 0, 0], 
 ['b', 0, '50', '10', 0, 0]]

最后,从连接(cn)中获取一个游标,并使用executemany方法一次传递所有参数:

c = cn.cursor()
c.executemany("""
    insert in to t_x (col1, col2, col3, col4, col5)
              values (%s,   %s,   %s,   %s,   %s)
""", params)

这称为参数化调用,%s是占位符(MySQL使用%s其他数据库可以使用,例如?,请检查db库)。不要把这和字符串插值混淆。你知道吗

相关问题 更多 >