MySQL Python ON DUPLICATE KEY UPDATE VALUES

wljmcqd8  于 2023-06-28  发布在  Mysql
关注(0)|答案(2)|浏览(138)

我正在使用Python将JSON数据上传到MySQL。我需要在insert语句中包含“ON DUPLICATE KEY UPDATE VALUES”,但是在Python中遇到了问题。

如果我运行下面的代码,一切都正常工作...

import json
import mysql.connector

mydb = mysql.connector.connect(host=x,user=x,password=x,database=x)
cursor = mydb.cursor()

json_data = json.loads(file)

for item in json_data['data']:
   cursor.execute(
       "INSERT INTO input_1 (a,b,c,d) VALUES (%s,%s,%s,%s)",
        (item['a'],item['b'],item['c'],item['d'])
   )

然而,当我把“ON DUPLICATE KEY”钉到最后…

import json
import mysql.connector

mydb = mysql.connector.connect(host=x,user=x,password=x,database=x)
cursor = mydb.cursor()

json_data = json.loads(file)

for item in json_data['data']:
   cursor.execute(
       "INSERT INTO input_1 (a,b,c,d) VALUES (%s,%s,%s,%s) ON DUPLICATE KEY UPDATE VALUES a=%s,b=%s,c=%s", 
       (item['a'],item['b'],item['c'],item['d'])
   )

我收到以下消息:
编程错误:SQL语句的参数不足

iaqfqrcu

iaqfqrcu1#

替换:

cursor.execute("INSERT INTO input_1 (a,b,c,d) VALUES (%s,%s,%s,%s) ON DUPLICATE KEY UPDATE VALUES a=%s,b=%s,c=%s", (item['a'],item['b'],item['c'],item['d']))

其中:

cursor.execute("INSERT INTO input_1 (a,b,c,d) VALUES (%s,%s,%s,%s) ON DUPLICATE KEY UPDATE VALUES a=%s,b=%s,c=%s", (item['a'],item['b'],item['c'],item['d'],item['a'],item['b'],item['c']))

SQL语句需要7个参数,而不是4个。

8iwquhpp

8iwquhpp2#

所有功能于一身:

def insert_row(table, db, row, **kwargs):
    placeholders = ', '.join(['%s'] * len(row))
    columns = ', '.join(row.keys())
    ignore = 'IGNORE' if kwargs.get('insertIgnore') else ''
    onDuplicate = ''
    onDuplicateUpdate = kwargs.get('onDuplicateUpdate', [])
    values = list(row.values())
    if len(onDuplicateUpdate) > 0:
        updates = {}
        for k in onDuplicateUpdate:
            updates[k] = row[k]
        updatePlaceholders = ('=%s, '.join(updates.keys())) + '=%s'
        values.extend(list(updates.values()))
        onDuplicate = f'  ON DUPLICATE KEY UPDATE {updatePlaceholders}'

    sql = "INSERT %s INTO %s ( %s ) VALUES ( %s ) %s ;" % (ignore, table, columns, placeholders, onDuplicate)
    # print('sql', sql)
    rowInserted = db.cursor().execute(sql, values)
    db.commit()
    return rowInserted == 1

使用示例:

user_details = {
    "id": "1",
    "name": "Saifullah Khan",
    "city": "Rawalpindi",
    "address": "Bahria Town Phase 8",
    "timestamp": datetime.now().strftime("%Y-%m-%d %H:%M:%S")
}
onDuplicateUpdate = ['city', 'address', 'timestamp']
insert_row('users', db, user_details, onDuplicateUpdate=onDuplicateUpdate, insertIgnore=True)

相关问题