Sqlite选择包含多个单词

时间:2017-10-27 03:31:43

标签: 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):           
        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

似乎不是把整个字符串'繁体中文'作为一个参数,它只需要传统的'并且表

中没有列具有此名称

2 个答案:

答案 0 :(得分:1)

我不同意您的表格结构以及您的代码。为每种语言添加新列是昂贵且最不灵活的。每次您决定支持新语言时,此方法都需要更改主要模式。此外,您当前的连接查询字符串易于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

答案 1 :(得分:0)

使用LIKE

def checkLanguageAvailability(self, product, language):           
        query = "SELECT " + language + " FROM t WHERE Language LIKE '%" + 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

此查询是否接受任何外部输入?因为如果是这样,你应该使用准备好的陈述。