我正在从客户端获取JSON,并想检查接收的项目是否存在于数据库中。因此,我要执行一个查询,该查询匹配ID以外的所有列。
我尝试了两个查询,但没有一个起作用。第一个:
item = db.execute("SELECT * FROM supermarket WHERE (product, origin, amount, image, best_before_date) VALUES (?, ?, ?, ?, ?)",(newProduct['product'], newProduct['origin'], newProduct['amount'], newProduct['image'], newProduct['best_before_date'])).fetchone()
这是一个语法错误,内容为:
OperationalError: near ",": syntax error
第二个是:
item = db.execute("SELECT * FROM supermarket WHERE product=?", (newProduct['product']), " AND origin=?", (newProduct['origin']), " AND amount=?", (newProduct['amount']), " AND image=?", (newProduct['image']), "AND best_before_date=?", (newProduct['best_before_date'])).fetchone()
出现以下错误:
TypeError: function takes at most 2 arguments (10 given)
我无法确定语法错误的确切位置,也找不到其他方法来执行此查询。
完整的代码段:
@post('/add')
def add(db):
newProduct = request.json
item = db.execute("SELECT * FROM supermarket WHERE (product, origin, amount, image, best_before_date) VALUES (?, ?, ?, ?, ?)",(newProduct['product'], newProduct['origin'], newProduct['amount'], newProduct['image'], newProduct['best_before_date'])).fetchone()
答案 0 :(得分:0)
因此,这本身不是直接的答案,而是一些有关常规SQL方法和故障排除的指南,可以帮助您找到问题的根源。
首先,直接从代码运行原始SQL语句很少是一个好主意。相反,最好设置一个stored procedure来执行您希望运行的特定代码。这样做的好处是,您可以使用Python客户端将问题与涉及数据查询本身的问题分开。通过创建一个sp,您还将验证命令本身的语法。
第二,一旦存储过程语法正确,就可以开始对python代码本身进行故障排除。我认为您会发现,使用SQL命令对象比按您的方式尝试要容易得多。 This tutorial可能是一个很好的起点。
第三,要确保不会将重复项插入数据库,请创建唯一索引。达到目标的正确方法是尝试插入,如果有重复,插入将失败。 Here is a resource可能会有所帮助。
插入命令的正确语法
insert into supermarket (product, origin, amount, image, best_before_date)
values (@product, @origin, @amount, @image, @best_before_date)
创建索引的正确语法
CREATE UNIQUE INDEX IX_supermarket
using HASH
ON supermarket (product, origin, amount, image, best_before_date)