Условный запрос с sqlite3 python - PullRequest
0 голосов
/ 21 января 2019

Этот фрагмент кода является частью бота телеграммы, который я сейчас разрабатываю. Я использовал пакет PyTelegramBotAPI и использовал @ bot.callback_query_handler () для обработки обратных вызовов от пользователей. Затем я создал функцию, которая распечатывает последнюю запись из базы данных для этого конкретного пользователя, используя следующий код:

def splitbill(user):
    row = c.execute('SELECT * FROM database WHERE user = (?) ORDER BY datetime DESC LIMIT 1', user).fetchall()
    print(row[0])

Это вернуло и сообщило об ошибке ValueError: параметры неподдерживаемого типа

def splitbill(user):
    row = c.execute('SELECT * FROM database WHERE user = (?) ORDER BY datetime DESC LIMIT 1', (user,)).fetchall()
    print(row[0])

Я гуглил и нашел это решение, используя (пользователь) вместо (пользователь). Но я понятия не имею, почему это сработало. Может ли кто-нибудь просветить меня? Спасибо!

Ответы [ 3 ]

0 голосов
/ 21 января 2019

В мире Python одноэлементный tuples объявляется с , в конце. Например:

>>> p=(1)
>>> print(type(p))
<type 'int'> #--note that this is taken as an int, irrespective of the braces.
>>> q=(1,)
>>> print(type(q))
<type 'tuple'>

Функция c.excute, вероятно, принимает tuple заполнителей, что является причиной того, что переданный вами параметр (user) не считается кортежем. Хороший вопрос, хотя.

0 голосов
/ 21 января 2019

Причина, по которой работает (user,), заключается в том, что метод execute ожидает кортеж, а когда вы передаете (user) без запятой, python интерпретирует его как user.

Вы можете проверить это довольно быстро в оболочке Python:

>>> a = 'howdy'
>>> tuple = (a, )      # note the comma
>>> not_a_tuple = (a)  # note the lack of comma
>>>
>>> print(tuple)       
('howdy',)
>>> print(not_a_tuple)
howdy
>>>
>>> type(tuple)
<class 'tuple'>
>>> type(not_a_tuple)
<class 'str'>
0 голосов
/ 21 января 2019

(пользователь) интерпретируется как выражение, тогда как (пользователь,) всегда является кортежем.

...