Да, это тоже работает. Разница между ними:
Параметр parameters
для cur.execute () ожидает:
- итерируемая или последовательность значений для помещения в заполнители запроса, используя заполнители вопросительного знака - списки, кортежи. Это то, что вы используете выше.
- или именованные заполнители, которые сопоставляют имена параметров с их значениями - словарь.
Вы можете использовать любой из них в своем запросе. Побочные эффекты минимальны, но кортежи предпочтительны, так как они неизменны и имеют меньше методов. Поэтому Python требуется меньше ресурсов для их создания и использования. Это верно для большинства методов / функций, которые ожидают последовательность.
>>> # This is the qmark style:
>>> cur.execute("insert into people values (?, ?)", (who, age))
<sqlite3.Cursor object at 0x0000000002C2E3B0>
>>>
>>> # *** this is also qmark style, but with a list of params instead of a tuple of params ***
>>> cur.execute("insert into people values (?, ?)", [who, age])
<sqlite3.Cursor object at 0x0000000002C2E3B0>
>>>
>>> cur.execute('select * from people')
<sqlite3.Cursor object at 0x0000000002C2E3B0>
>>> cur.fetchall()
[('Yeltsin', 72), ('Yeltsin', 72)]
>>>
Примечание к c.execute('INSERT INTO list VALUES(?)', (name))
, из комментария bereal ниже :
[name]
- список с одним элементом. Если вы хотите создать кортеж с одним элементом, вам нужно добавить запятую к express, которая: (name,)
. В противном случае (name)
это просто name
и в запросе. Это строка, которая сама по себе является итеративной и будет расширяться до последовательности каждого символа в строке.
>>> list('Yeltsin')
['Y', 'e', 'l', 't', 's', 'i', 'n']
>>> tuple('Yeltsin')
('Y', 'e', 'l', 't', 's', 'i', 'n')
Так что, если вы execute()
'ее редактируете, она обрабатывает строку, поскольку последовательность жалуется, что Вы передали слишком много параметров:
>>> cur.execute("insert into people values (?)", (who))
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
sqlite3.ProgrammingError: Incorrect number of bindings supplied. The current statement uses 1, and there are 7 supplied.
Правильный путь с кортежем только для одного параметра:
>>> cur.execute("insert into people values (?)", (who,))
<sqlite3.Cursor object at 0x0000000002698A40>
>>>
>>> # or with a list, no comma needed
>>> cur.execute("insert into people values (?)", [who])
<sqlite3.Cursor object at 0x0000000002698A40>
>>>