Поиск имени в cx_Oracle

У меня есть var='smth', и мне нужно проверить, существует ли var в таблице 'smtb'

Я пробовал что-то это, но это не работает:

rows=curs.fetchall()
for row in rows:
            if var==row:
                print("Yes")

Когда я печатаю элементы строк, я получаю такой шаблон:

('element',)

Как я могу проверить, существует ли var в таблице?


person Marshall Black    schedule 06.03.2013    source источник


Ответы (1)


Не делайте этого в Python. Если вы хотите найти что-то в таблице базы данных, самый быстрый и эффективный способ — сделать это в SQL. Не забудьте использовать переменные привязки.

Предполагая, что у вас есть объект курсора curs, он может выглядеть примерно так (при условии, что ваша таблица уникальна для var).

>>> sql = "select * from my_table where var = :var"
>>> bind_variables = {'var' : 'smth'}
>>>
>>> curs.execute(sql, bind_variables)
[<cx_Oracle.STRING with value None>]
>>> results = curs.fetchall()
>>> results
[('smth',)]
>>> try:
...     var = results[0][0]
...     print ('Yes')
... except IndexError:
...     print ('No')
...
Yes

Тогда, если вы ищете что-то, чего не существует, вы получите следующее.

>>> bind_variables = {'var' : 'other'}
>>> results = curs.fetchall()
>>> results
[]
>>> try:
...     var = results[0][0]
...     print ('Yes')
... except IndexError:
...     print ('No')
...
No

Фактическая причина, по которой вы не получаете ожидаемого результата, заключается в том, что cx_Oracle возвращает список кортежей в соответствии с PEP 249. Вы ожидаете, что будет возвращен только один столбец, поэтому вам нужен доступ к 0th индексу кортежа, если вы хотите сделать это так, как вы.

>>> rows = [('other',),('smth',)]
>>> var = 'smth'
>>> for row in rows:
...     if var == row[0]:
...         print ('Yes')
...
Yes
person Ben    schedule 06.03.2013