2016-08-19 18 views
0

所以我一直有我的代碼有問題。以不同的值從多行返回數據

什麼即時試圖做的是我已經設置了類似的列表:

locationList = [['mt', 'moon', 'mt-moon'], ['misty', 'mis'], ['surge', 'sur'], ect...] 

而且這是什麼是他們投入的人使用的,因此而不必輸入整個單詞,他們只是做縮寫。

現在我將這些存儲在數據庫中,包括人名,他們的積分,賭博積分和下注點。就像這樣:

**Name** | **Points** | **BetLocation** | **BetPoints** 
-------- | ---------- | --------------- | ------------- 
James | 1000  | mis    | 100   
Mike  | 3000  | misty   | 700   
Dave  | 400  | mt    | 200   

現在什麼即時試圖做的是,當我選擇一個成功的位置,好比說我選擇飄渺,它將返回兩次詹姆斯和邁克但不戴夫。

if any(winner in s for s in locationList): 
     c = conn.cursor() 
     search = winner 
     for sublist in locationList: 
      if sublist[0] == search: 
       print(sublist) 
       print(str(sublist)[1:-1]) 
       test1 = '(' + str(sublist)[1:-1] + ')' 
       print(test1) 
       c.execute("SELECT Name, CurrentBetValue FROM Users WHERE CurrentBetLocation IN('misty', 'mis')") 
       data = c.fetchall() 
       print(data) 
       for f in data: 
        kek = (f[1], f[0]) 
        c.execute('UPDATE Users SET Points = Points + (? * 2) WHERE Name = ?', kek) 
       conn.commit() 
       betReset() 
       betsOpen = False 
       return send_message('"'+str(winner) + '"' + ' is the winning location, points have been updated.') 

每個打印回報:

  • [ '縹', '錯誤']
  • '縹', '錯誤'
  • ( '縹', '錯誤')

現在這項工作,因爲我已經手動把IN('misty', 'mis') 並返回我想要的。

但是如果我將其更改爲c.execute("SELECT Name, CurrentBetValue FROM Users WHERE CurrentBetLocation IN ?", test1)

c.execute("SELECT Name, CurrentBetValue FROM Users WHERE CurrentBetLocation IN ?", test1) sqlite3.OperationalError: near "?": syntax error

我想知道是否有人能幫助!

+1

我沒有看到任何PHP代碼。 – aynber

+0

是的抱歉idk爲什麼我把它放在oops – Jonese1234

+0

知道數據庫和你使用的界面將有所幫助。 – polku

回答

1

只需從「它只是一個本地.db文件」中猜出你正在使用SQLite和內置的Python模塊sqlite3即可。

如果是這樣,我想你想要這樣的:

c.execute("SELECT Name, CurrentBetValue FROM Users WHERE CurrentBetLocation IN ({})".format(",".join("?"*len(sublist))), sublist) 

"?" * len(sublist)給你的ň問號在子列表ñ元素的序列。用逗號加入,你會得到一個很好的參數化命令:"... IN (?,?)"。最後,你可以傳入你的sublist作爲那些參數。

這裏有一對夫婦的意見一個完整的工作示例內嵌所以你可以看到發生了什麼:

import sqlite3 

conn = sqlite3.connect("test.db") 

c = conn.cursor() 

c.execute("create table test (name text, location text)") 
c.execute("insert into test values (?, ?)", ("James", "mis")) 
c.execute("insert into test values (?, ?)", ("Mike", "misty")) 
c.execute("insert into test values (?, ?)", ("Dave", "mt")) 

sublist = ["misty", "mis"] 

# select name from test where location in (?,?) 
command = "select name from test where location in ({})".format(",".join("?" * len(sublist))) 

# select name from test where location in ('misty', 'mis') 
c.execute(command, sublist) 

print(c.fetchall()) # [('James',), ('Mike',)] 

如果我的假設是錯誤的,您使用的是SQLite的或比sqlite3其他模塊以外的數據庫,請告訴我們你在用什麼。 (對於未來的問題:這是非常重要的信息,甚至更好的是提供一個完整的可運行示例。)

+0

是啊我正在使用sqlite3,我也通過執行'c.execute(「SELECT Name,CurrentBetValue FROM Users WHERE CurrentBetLocation IN {0}」)來使其工作。format(test1))' – Jonese1234

+0

@ Jonese1234這樣做會破壞使用參數化查詢的安全性好處,所以我建議不要這樣做。 – smarx