检查sqlite数据库中是否存在用户名

问题描述 投票:0回答:2

相当普通的问题,但其他解决方案似乎都不适合我。

这就是我所拥有的,目前它总是返回用户名不存在。我希望代码遍历所有数据,并检查是否可以在表中找到输入(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")
python database sqlite username
2个回答
0
投票

这似乎是非常标准的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并获取一行以告诉您是否存在任何匹配的行,这就是运算符的作用,并且可能会更有效:]

EXISTS

尽管您的Python有很多问题。

  1. SQL查询总是返回rows,这意味着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") 总是一个元组列表(即使只有一个值),这意味着您永远不会在其中找到字符串
  2. 顾名思义,fetchall fetches
  3. 所有行,这意味着第二个fetchall将始终返回一个空列表(没有要提取的内容)
  4. [fetchallif a: ... else: ...]好得多>
  5. 正如我的主张所暗示的,与检索整个数据库然后在Python中进行过滤相比,最好是在数据库中过滤数据(使用适当的参数化方法)(>
  6. 您可以尝试使用其他查询作为:

    if a: ... if not a: ...

    如果由于找不到记录而引发异常,并且您只想知道用户是否存在,则可以使用count:

    def read_from_db():
        sql=f"SELECT user FROM stuffToPlot WHERE user LIKE '{x}'"
        c.execute(sql)
        c.fetchall()
    
        if len(c) >0:
            print('Username already exists')
        else:
            print("Username doesn't exist")
    

-1
投票

您可以尝试使用其他查询作为:

if a: ... if not a: ...
© www.soinside.com 2019 - 2024. All rights reserved.