簡體   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