Используйте словарь python для вставки в mysql

Я пытаюсь взять данные из словаря (пример упрощен для удобства чтения) и вставить их в базу данных mysql. У меня есть следующий фрагмент кода.

import pymysql 
conn = pymysql.connect(server, user , password, "db")
    cur = conn.cursor()
    ORFs={'E7': '562', 'E6': '83', 'E1': '865', 'E2': '2756 '}
    table="genome"
    cols = ORFs.keys()
    vals = ORFs.values()
    sql = "INSERT INTO %s (%s) VALUES(%s)" % (
    table, ",".join(cols), ",".join(vals))

    print sql
    print ORFs.values()
    cur.execute(sql, ORFs.values())


    cur.close()
    conn.close()

оператор print sql возвращает
INSERT INTO genome (E7,E6,E1,E2) VALUES(562,83,865,2756 )
когда я ввожу это непосредственно в командную строку mysql, команда mysql работает. Но когда я запускаю скрипт python, я получаю сообщение об ошибке:

<type 'exceptions.TypeError'>: not all arguments converted during string formatting
      args = ('not all arguments converted during string formatting',)
      message = 'not all arguments converted during string formatting' 

Как всегда, любые предложения будут высоко оценены.


person Stylize    schedule 26.10.2015    source источник


Ответы (3)


sql = "INSERT INTO %s (%s) VALUES(%s)" % (
    table, ",".join(cols), ",".join(vals))

Этот SQL включает значения, и cur.execute(sql, ORFs.values()) тоже имеет значения.

Итак, должно быть cur.execute(sql).

person huang    schedule 26.10.2015
comment
возникает проблема, когда есть значение, отличное от str - person Aminah Nuraini; 26.05.2018

Предыдущий ответ не работает для нестрокового значения словаря. Это переработанная версия.

    format_string = ','.join(['%s'] * len(dict))
    self.db.set("""INSERT IGNORE INTO listings ({0}) VALUES ({1})""".format(", ".join(dict.keys()),format_string), 
                         (dict.values()))
person Aminah Nuraini    schedule 26.05.2018

В моем случае я пропущу нулевые столбцы.

data = {'k': 'v'}
fs = ','.join(list(map(lambda x: '`' + x + '`', [*data.keys()])))
vs = ','.join(list(map(lambda x: '%(' + x + ')s', [*data.keys()])))
sql = "INSERT INTO `%s` (%s) VALUES (%s)" % (table, fs, vs)
count = cursor.execute(sql, data)
person Jun.wan    schedule 23.04.2019