如何在 python 中填写插入语句的列名

How do I fill in the column names of an insert statement in python

我想使用 Python 将一些数据插入数据库。跳过大量代码,我使用这样的东西:

cursor.execute('insert into table_name (column1, column2) values (%s, %s)', variable1, variable2)

一切都很好。我正在从 API 的 多个端点 获取数据,所有 return 数据都以相当平坦的格式显示,例如:

[
    {
        "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"
    }
]

实际数据和 key:value 对因端点而异,但基本结构(即列表中每个项目的单个 'level' 字典)对于每个端点都是相同的。

每个端点基本上都是将数据放入 table,其中列名完全复制 JSON 中的键,所以我真的很想要一个简单地迭代 [=] 的插入函数31=] 并从中构建插入语句,使用键填充列名,使用值填充值。我可以为这样的值做到这一点:

a = [
    {
        'foo':'one',
        'bar':'two'
    }
]

cursor.execute('insert into table_name (foo, bar) values (%s, %s)', tuple(a[0].values()))

但我无法设法以编程方式填写“(foo, bar)”位,这样我就不必手动输入列名。请问我该怎么做?

出于某种原因,每当我 post 上 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 + ');' 

你应该把插入语句分成两部分第一部分是列名第二部分是值part.You可以试试下面的代码:

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)