Проверка наличия имени пользователя в базе данных sqlite - PullRequest
0 голосов
/ 20 января 2020

Довольно общий вопрос c, но ни одно из других решений не помогло мне.

Это то, что у меня есть, и в данный момент всегда возвращается, что имя пользователя не существует. Я хочу, чтобы код go прошел через все данные и проверил, можно ли найти вход (x) в таблице. Спасибо.

x = вход от пользователя c = conn.cursor ()

def read_from_db():
   c.execute("SELECT user FROM stuffToPlot ") 
   if x in c.fetchall():
      print('Username already exists')
   if x not in c.fetchall():
      print("Username doesn't exist")

Ответы [ 2 ]

0 голосов
/ 24 января 2020

Я не знаю, допустимо ли это для всех библиотек, но кажется, что метод fetchall () для sqllite возвращает кортеж кортежей.

Метод fetchall () получает все записи. Возвращает набор результатов. Технически, это кортеж кортежей. Каждый из внутренних кортежей представляет строку в таблице.

Таким образом, вы можете попробовать:

for query_result in c.fetchall() :
    if x in query_result:
        print('Username already exists') 
    else:
        print("Username doesn't exist" )
0 голосов
/ 20 января 2020

Это выглядит довольно стандартно SQL: просто параметризовать ваш запрос с именем пользователя,

c.execute("SELECT 1 FROM stuffToPlot where user = %s", [x]) 

, это вернет строку для каждого пользователя, соответствующего x. Это может быть 0 или 1 строка (если у вас может быть несколько stuffToPlot с одним и тем же user, вы всегда можете добавить limit 1 к запросу). Затем вы можете проверить cr.rowcount, чтобы увидеть, есть ли у вас результаты, даже не потрудившись их получить: вы просто хотите посмотреть, есть ли совпадение:

if c.rowcount:
    print('Username already exists')
else:
    print("Username doesn't exist")

В качестве альтернативы, вы можете использовать EXISTS и извлеките одну строку, сообщающую, есть ли какая-либо подходящая строка, для этого и нужен оператор, и она, вероятно, будет более эффективной:

c.execute('select exists(select 1 from stuffToPlot where user = %s)', [x])
[exists] = cr.fetchone() # fetch and unpack the only row our query returns
if exists:
    print('Username already exists')
else:
    print("Username doesn't exist")

Существует множество проблем с вашим Python однако.

  1. SQL запросов всегда возвращают строк , что означает fetchall всегда список кортежей (даже если вы получаете одно значение), то есть вы никогда не находите там строку
  2. , как указывает ее имя, fetchall извлекает всех строк, что означает, что вторая fetchall всегда будет возвращать пустой список (ничего не осталось извлечь)
  3. if a: ... else: ... намного лучше, чем if a: ... if not a: ...
  4. , как подсказано в моем предложении, как правило, лучше фильтровать ваши данные в базе данных (используя правильную параметризацию), чем извлекать всю совокупность база данных затем фильтруется нг в Python
...