Python Sqlite选择包含多个单词的列文本

Python Sqlite选择包含多个单词的列文本,python,string,select,text,sqlite,Python,String,Select,Text,Sqlite,因此,我有一个表,其中列出了所有产品及其语言可用性。我想写一个函数来检查输入产品名称和语言时的语言可用性 我的代码如下: "CREATE TABLE t (Language,French, Italian, German, Spanish, Japanese, Korean, 'Traditional Chinese');") //insert data to table t def checkLanguageAvailability(self, product, language

因此,我有一个表,其中列出了所有产品及其语言可用性。我想写一个函数来检查输入产品名称和语言时的语言可用性

我的代码如下:

"CREATE TABLE t (Language,French, Italian, German, Spanish, Japanese, Korean, 'Traditional Chinese');")

   //insert data to table t 

 def checkLanguageAvailability(self, product, language):           
        query = "SELECT " + language + " FROM t WHERE Language = '" + product + "'"
        cur = self.df.cursor()
        cur.execute(query)
        # print cur.fetchall()
        res = cur.fetchall()
        if res[0][0] == '':
            return False
        elif int(float(res[0][0])) != 0:
            return True
所以当我测试它时,它在一个单词的文本中运行良好

checkLanguageAvailability("productname",'French')) --> True
但是有多个单词的文本

checkLanguageAvailability("productname",'Traditional Chinese'))
它会引发以下错误:

    cur.execute(query)
sqlite3.OperationalError: no such column: Traditional
似乎不是将整个字符串“Traditional Chinese”作为参数,而是将“Traditional”作为参数,并且表中没有具有此名称的列使用:


这个查询是否接受任何外部输入?因为如果是这样,您应该使用准备好的语句。

我不同意您的表结构和代码。为每种语言添加一个新列的成本很高,而且极不灵活。每次决定支持新语言时,这种方法都需要对模式进行重大更改。此外,您当前连接的查询字符串容易发生SQL注入。除此之外,通常不应将查询中的列名作为参数。当你发现自己在这样做的时候,这可能意味着糟糕的设计或黑客攻击。相反,我建议采用下表:

CREATE TABLE t (language TEXT, product TEXT)
此设计将给定产品和语言表示为一行。因此,如果我们找到给定产品和语言的记录条目,我们就知道它存在

尝试使用如下代码:

def checkLanguageAvailability(self, product, language):
    cur = self.df.cursor()
    cmd = cur.execute("SELECT 1 FROM t WHERE product = ? AND language = ?", (product, language))
    res = cur.fetchall()
    cnt = len(res)
    if cnt == 0
        return False
    else
        return True

您至少应该使用准备好的语句。@TimBiegeleisen非常正确,但我不懂Python来添加示例。
def checkLanguageAvailability(self, product, language):
    cur = self.df.cursor()
    cmd = cur.execute("SELECT 1 FROM t WHERE product = ? AND language = ?", (product, language))
    res = cur.fetchall()
    cnt = len(res)
    if cnt == 0
        return False
    else
        return True