Python и SQLite: проверить, существует ли элемент в базе данных? - PullRequest
3 голосов
/ 03 апреля 2012

У меня есть метод, который записывает в базу данных имя пользователя и пароль пользователя, который хочет зарегистрироваться.Перед сохранением имени пользователя и пароля, которые они предоставили в базе данных, я хочу проверить, существует ли выбранное ими имя пользователя уже в списке «в ожидании» или в списке утвержденных «контактов».

Воткод, который я использовал для этого:

@cherrypy.expose
def writePending(self, username=None, password=None, message=None, signin=None):
    """ Add request of friendship into a database which stores all
        pending friendships.
    """

    page = get_file(staticfolder + "/html/friendingPage.html")

    if username != "" and password != "" and message !="":
        con = lite.connect('static/database/Friendship.db')
        cur = con.cursor()

        with con:      
            cur.execute("CREATE TABLE IF NOT EXISTS pending(user TEXT, pass TEXT, info TEXT)")
            cur.execute("CREATE TABLE IF NOT EXISTS contacts(user TEXT, pass TEXT)")

            "Check to see if the username is already registered"

            cur.execute("Select * from pending where user = ?", (username, ))
            check1=cur.fetchone()
            cur.execute("Select * from contacts where user = ?", (username, ))
            check2=cur.fetchone()

            if check1[0] != None:
                page = page.replace("$Error", "The ID you used is still pending for friendship")
            elif check2[0] != None:
                page = page.replace("$Error", "The ID you used is already added as a contact")
            else:
                cur.execute("CREATE TABLE IF NOT EXISTS pending(user TEXT, pass TEXT, info TEXT)")   
                cur.execute("INSERT INTO pending VALUES(?, ?, ?)", (username, password, message))               
                page = get_file(staticfolder + "/html/thankYouPage.html")

    else:
        page = get_file(staticfolder + "/html/friendingPage.html")
        page = page.replace("$Error", "You Must fill out all fields to proceed")

    return page

Однако я получу сообщение, что

Traceback (most recent call last):
  File "/usr/lib/pymodules/python2.7/cherrypy/_cprequest.py", line 606, in respond
    cherrypy.response.body = self.handler()
  File "/usr/lib/pymodules/python2.7/cherrypy/_cpdispatch.py", line 25, in __call__
    return self.callable(*self.args, **self.kwargs)
  File "proj1base.py", line 540, in writePending
    if type(check1[0]) != None:
TypeError: 'NoneType' object is not subscriptable

Мне интересно, что я могу сделать, чтобы избежать этого?

Спасибо.

Ответы [ 2 ]

6 голосов
/ 03 апреля 2012

В вашем примере check1 будет None, поэтому вы не можете использовать [0] для него. Вы могли бы сделать что-то вроде этого:

if check1 is not None:
    (error response)

Или вместо этого просто используйте cur.rowcount вместо cur.fetchone():

if cur.rowcount > 0:
    (error response)
1 голос
/ 03 апреля 2012

fetchone() возвращает None, если строки нет.Вы можете кодировать так:

if check1:
    ...do something with check1, like check1[0]...
else:
    .. means no row
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...