简体   繁体   English

Python和SQLite:检查数据库中是否存在项目?

[英]Python and SQLite: Check if an item exists in a database?

I have a method which writes into a database the username and password of user who wish to register. 我有一个方法,它将希望注册的用户的用户名和密码写入数据库。 Before storing the username and password they have provided into the database, i want to check if the username they have chosen already exist in either the "pending" list, or the approved "contacts" list. 在存储他们提供给数据库的用户名和密码之前,我想检查他们选择的用户名是否已存在于“待处理”列表或已批准的“联系人”列表中。

Here is the code I used to do that: 这是我以前用来做的代码:

@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

However, I would get a message that 但是,我会收到一条消息

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

I am wondering what I can do to avoid that? 我想知道我能做些什么来避免这种情况?

Thanks. 谢谢。

In your example, check1 will be None , so you can't use [0] on it. 在您的示例中, check1将为None ,因此您不能在其上使用[0] You could do something like this: 你可以这样做:

if check1 is not None:
    (error response)

Or instead just use cur.rowcount instead of cur.fetchone() : 或者只使用cur.rowcount而不是cur.fetchone()

if cur.rowcount > 0:
    (error response)

fetchone() returns None if there isn't a row. 如果没有行, fetchone()将返回None You can code like this: 你可以像这样编码:

if check1:
    ...do something with check1, like check1[0]...
else:
    .. means no row

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM