在Python中插入sqlite 3时出错

在Python中插入sqlite 3时出错,python,sql,sqlite,Python,Sql,Sqlite,我正在用从JSON解析的数据填充数据库。当我执行INSERT语句时,我得到一个错误:sqlite3.OperationalError:没有这样的列:无。一些JSON数据返回null,这将导致Python在表中插入None,但我相信这应该可以吗?有人知道问题出在哪里吗 回溯: 回溯(最近一次呼叫最后一次): 文件“productInfoScraper.py”,第71行,在 ”) Python中我的INSERT语句: cursor.execute("INSERT INTO ProductInfo V

我正在用从JSON解析的数据填充数据库。当我执行
INSERT
语句时,我得到一个错误:
sqlite3.OperationalError:没有这样的列:无
。一些JSON数据返回
null
,这将导致Python在表中插入
None
,但我相信这应该可以吗?有人知道问题出在哪里吗

回溯:
回溯(最近一次呼叫最后一次):
文件“productInfoScraper.py”,第71行,在
”)

Python中我的
INSERT
语句:

cursor.execute("INSERT INTO ProductInfo VALUES(" +
        str(data["data"]["product_id"]) + ", " +
        "'" + str(data["data"]["product_name"]) + "'" + ", " +
        "'" + str(data["data"]["ingredients"]) + "'" + ", " +
        "'" + str(data["data"]["serving_size"]) + "'" + ", " +
        str(data["data"]["calories"]) + ", " +
        str(data["data"]["total_fat_g"]) + ", " +
        str(data["data"]["total_fat_percent"]) + ", " +
        str(data["data"]["fat_saturated_g"]) + ", " +
        str(data["data"]["fat_saturated_percent"]) + ", " +
        str(data["data"]["fat_trans_g"]) + ", " +
        str(data["data"]["fat_trans_percent"]) + ", " +
        str(data["data"]["cholesterol_mg"]) + ", " +
        str(data["data"]["sodium_mg"]) + ", " +
        str(data["data"]["sodium_percent"]) + ", " +
        str(data["data"]["carbo_g"]) + ", " +
        str(data["data"]["carbo_percent"]) + ", " +
        str(data["data"]["carbo_fibre_g"]) + ", " +
        str(data["data"]["carbo_fibre_percent"]) + ", " +
        str(data["data"]["carbo_sugars_g"]) + ", " +
        str(data["data"]["protein_g"]) + ", " +
        str(data["data"]["vitamin_a_percent"]) + ", " +
        str(data["data"]["vitamin_c_percent"]) + ", " +
        str(data["data"]["calcium_percent"]) + ", " +
        str(data["data"]["iron_percent"]) + ", " +
        "'" + str(data["data"]["micro_nutrients"]) + "'" +  ", " +
        "'" + str(data["data"]["tips"]) + "'" + ", " +
        str(data["data"]["diet_id"]) + ", " +
        "'" + str(data["data"]["diet_type"]) + "'" +
        ")")
我的
创建表
语句:

cursor.execute("CREATE TABLE ProductInfo(product_id INT, product_name TEXT,\
  ingredients TEXT, serving_size TEXT, calories INT, total_fat_g INT,\
  total_fat_percent INT, fat_saturated_g INT, fat_saturated_percent INT,\
  fat_trans_g INT, fat_trans_percent INT, cholesterol_mg INT, sodium_mg\
  INT, sodium_percent INT, carbo_g INT, carbo_percent INT, carbo_fibre_g\
  INT, carbo_fibre_percent INT, carbo_sugars_g INT, protein_g INT,\
  vitamin_a_percent INT, vitamin_c_percent INT, calcium_percent INT,\
  iron_percent INT, micro_nutrients TEXT, tips TEXT, diet_id INT, diet_type\
  TEXT)")

首先,您不应该以这种方式构建SQL语句。正如明确指出的那样:

通常,SQL操作需要使用Python变量中的值。您不应该使用Python的字符串操作来组装查询,因为这样做是不安全的;它使您的程序容易受到SQL注入攻击(有关可能出错的幽默示例,请参阅)

相反,使用DB-API的参数替换

除安全问题外,还有其他问题,很难正确引用和转换,很容易在某个地方犯一个简单的错误,而且在犯错误时很难调试这些错误

正确的方法是为每个键使用命名占位符,并将
数据[“data”]
作为参数映射传递:

cursor.execute("""INSERT INTO ProductInfo VALUES(
    :product_id, 
    :product_name,
    ...
    :diet_type)""", data["data"])
如果没有足够的示例代码和数据来测试它,我不知道这是否能解决您的问题,但它将消除许多潜在的错误源,因此我认为它很有可能解决

最有可能的问题是,您试图插入但没有用引号括起来的一个值,
str(data[“data”][“nadium_-mg”])
,是Python的
None

只需将一个不带引号的
None
放入SQL语句,就意味着您希望将名为“None”的列的值复制到此列。如果要使用空值、字符串“None”或其他内容,则必须正确写入

参数绑定将通过插入空值自动为您解决这一问题


但这只是我所说的“很难正确引用和转换”的一个例子,所以我不能确定这是否就是你所看到的。除了漫画中所展示的安全问题外,很难正确引用所有内容,也很难调试简单的打字错误。@abanert我该怎么做?类似于
cursor.execute(“INSERT INTO Table VALUES(?,?)”,a,b)
或其他完全不同的东西?好吧,您不需要在占位符周围加引号,这一点的关键是DB负责为您报价。此外,在这里,命名占位符比位置占位符更具可读性。有关详细信息,请参阅我的答案。(另外,作为旁注,通常认为使用
INSERT
而不使用列列表来依赖列的顺序是一个坏主意。然而,我认为这不是您的问题。)此外,如果您阅读文档开头的小教程,它将确切地说明如何正确执行此操作,并解释原因。这本书值得一读,也值得浏览一下文档的其余部分,因为那里有很多有用的信息,而且写得很好。谢谢你的建议,我会再次尝试你的建议。