我想使用Python将一些数据插入数据库。跳过大量代码,我使用如下代码:
cursor.execute('insert into table_name (column1, column2) values (%s, %s)', variable1, variable2)
一切顺利。我正在从API的多个终结点获取数据,这些数据均以相当平坦的格式返回数据,例如:
[
{
"LearnerId": 123456,
"LearnerCode": "654321",
"Date": "2018-07-02",
"Session": "AM",
"AttendanceCode": "/\\",
"AttendanceCodeId": 1,
"MinutesLate": null,
"Notes": null,
"ClassDateRollId": 347514,
"GroupCode": "7A",
"EnteredDate": "2018-07-02 10:10:24"
},
{
"LearnerId": 778832,
"LearnerCode": "837478",
"Date": "2018-07-02",
"Session": "AM",
"AttendanceCode": "/\\",
"AttendanceCodeId": 1,
"MinutesLate": null,
"Notes": null,
"ClassDateRollId": 347514,
"GroupCode": "9E",
"EnteredDate": "2018-07-02 10:12:34"
}
]
每个端点的实际数据和键:值对不同,但是每个端点的基本结构(即,列表中每个项目的字典只有一个“级别”)是相同的。
每个端点基本上都将数据放入表中,其中的列名精确地复制了JSON中的键,因此,我真的希望有一个插入函数可以简单地遍历JSON并从中构建插入语句,并填充列名使用键,值使用值。我可以为这样的值做到这一点:
a = [
{
'foo':'one',
'bar':'two'
}
]
cursor.execute('insert into table_name (foo, bar) values (%s, %s)', tuple(a[0].values()))
但是我无法以编程方式填写'(foo,bar)'位,因此不必手动键入列名。请问我该怎么做?
答案 0 :(得分:0)
由于某种原因,每当我在SO上发贴时,我的脑海立即意识到我很傻,答案很简单。结合使用str.join()和字符串乘法进行救援!
s = len(a[0].values()) * '%s,'
s = s[:-1]
cursor.execute('insert into table_name (' + str.join(',', a[0].keys()) + ') values (' + s + ');'
答案 1 :(得分:0)
您应该将插入语句分为两部分,第一部分是列名,第二部分是值部分。您可以尝试以下代码:
data = [{'a': 1, 'b': 2}, {'a': 3, 'b': 4}]
sql_raw_string = 'insert into table_name (%s, %s) '
sql_raw_value_string = 'values (%s, %s)'
for single_data in data:
final_key_sting = sql_raw_string %(tuple(single_data.keys()))
final_value_string = sql_raw_value_string %(tuple(single_data.values()))
final_query = final_key_sting + final_value_string
print(final_query)