Как динамически сгенерировать mysql ON DUPLICATE UPDATE в python

0

Я пытаюсь динамически генерировать запросы вставки/обновления MySQL с учетом файла csv.
У меня есть файл csv hobbies.csv:

id,name,hobby
"1","rick","coding"
"2","mike","programming"
"3","tim","debugging"

Затем у меня есть 2 функции: 1 для генерации запросов, 1 для обновления базы данных:

generate_sql.py

from connect_to_database import read_db_config
from config_parser import read_csv_files
from update_db import insert_records
import csv

def generate_mysql_queries():
    csv_file_list, table_list, temp_val, temp_key, temp_table, reader, header, data, data_list = ([] for i in range(9))
    val_param = '%s'
    query = ''
    total_queries = 0
    db = read_db_config(filename='config.ini', section='mysql')
    csv_file_dict = read_csv_files(filename='config.ini', section='data')
    for key, value in csv_file_dict.items():
        temp_val = [value]
        temp_key = [key]
        csv_file_list.append(temp_val)
        table_list.append(temp_key)
    for index, files in enumerate(csv_file_list):
        with open("".join(files), 'r') as f:
            reader = csv.reader(f)
            header.append(next(reader))
            data.append([row for row in reader])
            for d in range(len(data[index])):
                val_param_subs = ','.join((val_param,) * len(data[index][d]))
                total_queries += 1
                query = """INSERT INTO """ + str(db['database']) + """.""" + """""".join('{0}'.format(t) for t in table_list[index]) + \
                        """(""" + """, """.join('{0}'.format(h) for h in header[index]) + """) VALUES (%s)""" % val_param_subs + \
                        """ ON DUPLICATE KEY UPDATE """ + """=%s, """.join(header[index]) + """=%s"""
                data_list.append(data[index][d])
            insert_records(query, data_list)

Затем я передаю запрос и данные в insert_records() в update_db.py:

from mysql.connector import MySQLConnection, Error
from connect_to_database import read_db_config


def insert_records(query, data):
    query_string = query
    data_tuple = tuple(data)
    try:
        db_config = read_db_config(filename='config.ini', section='mysql')
        conn = MySQLConnection(**db_config)
        cursor = conn.cursor()
        cursor.executemany(query, data_tuple)
        print("\tExecuted!")
        conn.commit()
    except Error as e:
        print('\n\tError:', e)
        print("\n\tNot Executed!")
    finally:
        cursor.close()
        conn.close()

Данные, переданные в cursor.executemany(query, data_string), выглядят следующим образом (запрос - это строка, а data_tuple - кортеж):

query: INSERT INTO test.hobbies(id, name, hobby) VALUES (%s,%s,%s) ON DUPLICATE KEY UPDATE id=%s, name=%s, hobby=%s
data_tuple: (['1', 'rick', 'coding'], ['2', 'mike', 'programming'], ['3', 'tim', 'debugging'])

Учитывая эти два параметра, я получаю следующую ошибку:

Ошибка: 1064 (42000): у вас есть ошибка в синтаксисе SQL; проверьте руководство, соответствующее версии сервера MariaDB, для правильного синтаксиса для использования рядом с '% s, name =% s, hobby =% s' в строке 1

Я пробовал передавать в той же строке нединамически, просто отправив полную строку без параметров "% s", и она отлично работает. Что мне не хватает? Буду признателен за любую оказанную помощь.

Теги:
csv

1 ответ

0

Вероятно, это использование тройных двойных кавычек в python. Когда вы используете это

query = """INSERT INTO """ + str(db['database']) + """.""" + """""".join('{0}'.format(t) for t in table_list[index]) + \
                    """(""" + """, """.join('{0}'.format(h) for h in header[index]) + """) VALUES (%s)""" % val_param_subs + \
                    """ ON DUPLICATE KEY UPDATE """ + """=%s, """.join(header[index]) + """=%s"""

Вы говорите python, что все это строка, включая% s.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню