【问题标题】:Error : Insert Command error with Database as SQLITE错误:使用数据库作为 SQLITE 插入命令错误
【发布时间】:2020-07-29 20:13:26
【问题描述】:

我正在使用 Python 将数据插入 SQLite

database_tasks.bookId 是一个类变量

def insert(self, conn,dbname, name, writer='none'):
        c = conn.cursor()

        if dbname == "Book_database":            
            database_tasks.bookId += 1
            sql= "INSERT INTO Book_database VALUES(" + database_tasks.bookId + "," + name + "," + writer + ")"

        else:
            database_tasks.studentId += 1
            sql= "INSERT INTO Student VALUES("+ database_tasks.studentId + "," + name + ")"

        c.execute(sql)
        conn.commit()        
        return None

插入命令出错。

sql= "INSERT INTO Book_database VALUES(" + database_tasks.bookId + "," + name + "," + writer + ")"

TypeError: 只能将 str(不是“int”)连接到 str

【问题讨论】:

    标签: python python-2.7 sqlite


    【解决方案1】:

    您应该从不构建一个查询字符串,其中包含要以这种方式插入的值,但使用参数化查询。这是一种反模式,几十年来一直用于构建 SQL 注入攻击。你应该使用:

        if dbname == "Book_database":            
            database_tasks.bookId += 1
            c.execute("INSERT INTO Book_database VALUES(?,?,?)",
                      (database_tasks.bookId, name, writer))
    
        else:
            ...
    

    【讨论】:

      【解决方案2】:
      • 看起来您的bookIdint。在合并之前将其转换为 str
      sql= "INSERT INTO Book_database VALUES(" + str(database_tasks.bookId) + "," + name + "," + writer + ")"
      

      【讨论】:

        【解决方案3】:

        这个错误是不言自明的——你试图将一个整数连接到一个字符串。

        我的假设是 database_tasks.studentId 是一个 int,所以将您的查询更改为

        sql= "INSERT INTO Book_database VALUES(" + str(database_tasks.bookId) + "," + name + "," + writer + ")"
        

        会解决此问题,但请注意,如果这是面向公众的,则很容易利用此问题,我建议完全验证输入,或更改解决此问题的方法。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2012-10-30
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-07-16
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多