Значение Sqlite3 в Ruby Script не работает как строка - PullRequest
0 голосов
/ 19 декабря 2018

Я пытаюсь создать систему аутентификации пользователя и столкнулся с проблемой.В этом коде я пытаюсь проверить, соответствует ли определенное значение другому значению в той же строке.Он печатает, но не работает как строка, когда я устанавливаю ее равной другой строке.

    db.execute("CREATE TABLE IF NOT EXISTS auth(id int, name text, password text)")

    db.execute("INSERT INTO auth(id, name, password) VALUES(?, ?, ?)", [1, 'Bugs', 'Carrots'])    


   t = db.execute("SELECT password FROM auth WHERE name = 'Bugs'") 

   if t == 'Carrots'
     puts "yes"
   end

   #i am trying to print yes to the console 

1 Ответ

0 голосов
/ 19 декабря 2018

Я думаю, вы получаете массив, представляющий список совпадений, хотя в этом случае возвращается только одна строка.Кроме того, сама строка является массивом значений, хотя в этом случае строка будет массивом только одного значения.Таким образом, вы должны сравнивать t[0][0], а не просто t

. Вы можете использовать функцию db.get_first_value вместо этого, чтобы упростить это.

(Это предполагает, что name уникален; вывероятно, вы хотите использовать ограничение UNIQUE в схеме базы данных как для id, так и для name.)

(И, да, вы должны принять предупреждение @ tadman близко к сердцу.)

Итак, вот минимально измененная версия кода, который вы разместили выше ( без предлагаемых улучшений), который дает желаемый результат:

#!/usr/bin/env ruby

require 'sqlite3'

db = SQLite3::Database.new(':memory:')

db.execute("CREATE TABLE IF NOT EXISTS auth(id int, name text, password text)")

db.execute("INSERT INTO auth(id, name, password) VALUES(?, ?, ?)",
           [1, 'Bugs', 'Carrots'])


t = db.execute("SELECT password FROM auth WHERE name = 'Bugs'")

if t[0][0] == 'Carrots'
  puts "yes"
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...