从具有不同值

时间:2016-08-19 14:45:00

标签: python sql

所以我的代码出了问题。

我想要做的是我有一个列表设置如下:

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.')

每次打印都会返回:

  • [' misty',' mis']
  • ' misty',' mis'
  • (' misty',' mis')

现在这是因为我手动输入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"?":语法错误

我想知道是否有人可以提供帮助!

1 个答案:

答案 0 :(得分:1)

只是从“它只是一个本地.db文件”中猜测你正在使用SQLite和内置的sqlite3 Python模块。

如果是这样,我想你想要这个:

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

"?" * len(sublist)为子列表中的 n 元素提供了一系列 n 个问号。用逗号连接它,你得到一个很好的参数化命令:"... 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以外的模块,请告诉我们您正在使用的内容。 (对于未来的问题:这是非常重要的信息。更好的是提供一个完整的可运行的例子。)