Подтвердить что ты не робот

Использование инструкции Python для инструкции SQL INSERT

Я пытаюсь использовать dict для выполнения SQL INSERT. Логика в основном будет:

INSERT INTO table (dict.keys()) VALUES dict.values()

Тем не менее, мне сложно найти правильный синтаксис/поток, чтобы сделать это. Это то, что я сейчас имею:

# data = {...}
sorted_column_headers_list = []
sorted_column_values_list = []
for k, v in data.items():
    sorted_column_headers_list.append(k)
    sorted_column_values_list.append(v)
sorted_column_headers_string = ', '.join(sorted_column_headers_list)
sorted_column_values_string = ', '.join(sorted_column_values_list)

cursor.execute("""INSERT INTO title (%s) 
            VALUES (%s)""", 
            (sorted_column_headers_string, sorted_column_values_string))

Из этого я получаю исключение SQL (я думаю, связано с тем, что запятые также включены в некоторые из значений, которые у меня есть). Каким будет правильный способ сделать это?

4b9b3361

Ответ 1

Вы хотите добавить заполнитель параметров в запрос. Это может обеспечить вам то, что вам нужно:

qmarks = ', '.join('?' * len(myDict))
qry = "Insert Into Table (%s) Values (%s)" % (qmarks, qmarks)
cursor.execute(qry, myDict.keys() + myDict.values())

Ответ 2

Я думаю, что комментарий об использовании этого с MySQL не совсем завершен. MySQLdb не выполняет подстановку параметров в столбцах, а только значения (IIUC) - поэтому, возможно, больше нравится

placeholders = ', '.join(['%s'] * len(myDict))
columns = ', '.join(myDict.keys())
sql = "INSERT INTO %s ( %s ) VALUES ( %s )" % (table, columns, placeholders)
cursor.execute(sql, myDict.values())

Вы не получаете экранирование в столбцах, так что сначала вы можете проверить их.

Смотрите http://mail.python.org/pipermail/tutor/2010-December/080701.html для более полного решения

Ответ 3

Всегда хорошие ответы здесь, но в Python 3 вы должны написать следующее:

placeholder = ", ".join(["%s"] * len(dict))
stmt = "insert into `{table}` ({columns}) values ({values});".format(table=table_name, columns=",".join(dict.keys()), values=placeholder)
cur.execute(stmt, list(dict.values()))

Не забудьте преобразовать dict.values() в список, потому что в Python 3, dict.values() возвращает представление, а не список.

Кроме того, НЕ введите dict.values() в stmt, потому что он вырывает цитату из строки join ing, что вызвало ошибку MySQL при ее вставке. Поэтому вы всегда должны динамически вставлять его в cur.execute().

Ответ 4

Я попробовал решение @furicle, но он все равно вводит все как строку - если ваш dict смешанный, тогда это может не работать так, как вы хотели бы этого. У меня была аналогичная проблема, и это то, что я придумал - это всего лишь построитель запросов, и вы можете использовать его (с изменениями) для работы с любой имеющейся базой данных. Посмотрите!

def ins_query_maker(tablename, rowdict):
keys = tuple(rowdict)
dictsize = len(rowdict)
sql = ''
for i in range(dictsize) :
    if(type(rowdict[keys[i]]).__name__ == 'str'):
        sql += '\'' + str(rowdict[keys[i]]) + '\''
    else:
        sql += str(rowdict[keys[i]])
    if(i< dictsize-1):
        sql += ', '
query = "insert into " + str(tablename) + " " + str(keys) + " values (" + sql + ")"
print(query) # for demo purposes we do this
return(query) #in real code we do this

Это грубо и все еще нуждается в проверках здравого смысла и т.д., но он работает по назначению. для dict:

tab = {'idnumber': 1, 'fname': 'some', 'lname': 'dude', 'dob': '15/08/1947', 'mobile': 5550000914, 'age' : 70.4}

выполняется запрос Я получаю следующий вывод

результаты запроса, сгенерированного пакетом

Ответ 5

table='mytable'    
columns_string= '('+','.join(myDict.keys())+')'    
values_string = '('+','.join(map(str,myDict.values()))+')'    
sql = """INSERT INTO %s %s
     VALUES %s"""%(table, columns_string,values_string)

Ответ 6

Как насчет:

keys = str(dict.keys())
keys.replace('[', '(')
keys.replace(']', ')')
keys.replace("'",'')

vals = str(dict.values())
vals.replace('[', '(')
vals.replace(']', ')')

cur.execute('INSERT INTO table %s VALUES %s' % (keys, vals))

Для python 3:

keys = str(dict.keys())[9:].replace('[', '').replace(']', '')
vals = str(dict.values())[11:].replace('[', '').replace(']', '')

...