【问题标题】:Sqlite select column text with multple wordsSqlite选择具有多个单词的列文本
【发布时间】:2017-10-27 03:31:43
【问题描述】:

所以我有一张表格,上面有所有产品及其语言可用性。我想写一个函数来检查输入产品名称和语言时的语言可用性。

我的代码如下:

"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

似乎没有将整个字符串“繁体中文”作为参数,而是仅使用“繁体”,并且表中没有具有此名称的列

【问题讨论】:

    标签: python string select text sqlite


    【解决方案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
    

    【讨论】:

      【解决方案2】:

      使用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
      

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

      【讨论】:

      • 您至少应该使用准备好的语句。
      • @TimBiegeleisen 说的很对,但是我不懂Python要加个例子。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-04-18
      • 2022-09-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多