0

我正在使用从 JSON 解析的数据填充数据库。当我执行我的INSERT语句时,我收到一个错误:sqlite3.OperationalError: no such column: None. 一些 JSON 数据返回null,这会导致 Python 插入None表中,但我相信这应该没问题?有谁知道问题是什么?

追溯: Traceback (most recent call last): File "productInfoScraper.py", line 71, in <module> ")")

INSERT在 Python 中的声明:

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"]) + "'" +
        ")")

我的CREATE TABLE声明:

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)")
4

1 回答 1

2

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

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

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

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

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

cursor.execute("""INSERT INTO ProductInfo VALUES(
    :product_id, 
    :product_name,
    ...
    :diet_type)""", data["data"])

如果没有足够的示例代码和数据来测试它,我不知道这是否能解决你的问题,但它会消除许多潜在的错误来源,所以我会给出很大的可能性。

最可能的问题是您尝试插入且未用引号括起来的值之一str(data["data"]["sodium_mg"])是 PythonNone值。

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

参数绑定将通过插入空值自动为您处理。

但这只是我所说的“难以正确引用和转换”的一个例子,所以我不能确定它是否正是你所看到的。

于 2013-08-28T20:46:13.367 回答