所以我有一张包含所有产品及其语言可用性的表格。我想在输入产品名称和语言时编写一个函数来检查语言的可用性。
我的代码如下:
"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
似乎不是把整个字符串'繁体中文'作为一个参数,它只需要传统的'并且表
中没有列具有此名称答案 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
此查询是否接受任何外部输入?因为如果是这样,你应该使用准备好的陈述。