在Python中插入sqlite 3时出错
我正在用从JSON解析的数据填充数据库。当我执行在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
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
而不使用列列表来依赖列的顺序是一个坏主意。然而,我认为这不是您的问题。)此外,如果您阅读文档开头的小教程,它将确切地说明如何正确执行此操作,并解释原因。这本书值得一读,也值得浏览一下文档的其余部分,因为那里有很多有用的信息,而且写得很好。谢谢你的建议,我会再次尝试你的建议。