Python Разница SQLite3 между [] и () - PullRequest
0 голосов
/ 18 января 2020

Я читал некоторую документацию по SQLite и не совсем понимаю разницу между использованием [квадратных скобок] и использованием (круглых скобок).

c.execute('INSERT INTO list VALUES(?)', [name])

c.execute('INSERT INTO list VALUES(?)', (name))

c.execute('INSERT INTO list VALUES(?, ?)', ('name', 'age')

Может ли что-то подобное работать?

c.execute('INSERT INTO list VALUES(?, ?)', [name, age])

1 Ответ

2 голосов
/ 18 января 2020

Да, это тоже работает. Разница между ними:

Параметр 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>
>>>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...