SELECT查询具有多个变量的多列

时间:2019-01-26 16:06:32

标签: python mysql sql syntax-error

我正在从客户端获取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()

1 个答案:

答案 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)