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