Использование инструкции 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 (я думаю, связано с тем, что запятые также включены в некоторые из значений, которые у меня есть). Каким будет правильный способ сделать это?
Ответы
Ответ 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(']', '')
...