我想用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']...
有人知道我怎样才能更好地处理这种格式吗?我没有多少经验
我试图解释json并将其分配给变量
insights
:创建一个helper函数,使数据结构包含列值:
下一个循环通过json填充参数行(使用名称而不是整数索引,只有两级for循环,以及一些空行使代码有喘息的空间):
现在可以验证参数是否为列表列表:
输出将是(为了清晰起见,我添加了一个新行):
最后,从连接(
cn
)中获取一个游标,并使用executemany
方法一次传递所有参数:这称为参数化调用,
%s
是占位符(MySQL使用%s
其他数据库可以使用,例如?
,请检查db库)。不要把这和字符串插值混淆。你知道吗相关问题 更多 >
编程相关推荐