繁体   English   中英

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

[英]Checking if a username exists within a sqlite database

非常笼统的问题,但其他解决方案似乎都不适合我。

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

这似乎是非常标准的 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 查询总是返回rows ,这意味着fetchall总是一个元组列表(即使你得到一个值),这意味着你永远不会在那里找到一个字符串
  2. 顾名思义, fetchall获取所有行,这意味着第二个fetchall将始终返回一个空列表(没有什么可获取的)
  3. if a: ... else: ...if a: ... if not a: ...好得多
  4. 正如我的提议所暗示的那样,在数据库中过滤数据(使用适当的参数化)通常比检索整个数据库然后在 Python 中过滤更好

我不知道它是否对所有库都有效,但似乎 sqllite 的 fetchall() 方法返回一个元组元组。

fetchall() 方法获取所有记录。 它返回一个结果集。 从技术上讲,它是一个元组元组。 每个内部元组代表表中的一行。

所以你可以试试:

for query_result in c.fetchall() :
    if x in query_result:
        print('Username already exists') 
    else:
        print("Username doesn't exist" )

暂无
暂无

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

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