具有多个变量的SQL UPDATE

时间:2018-11-28 03:20:34

标签: python sql

我正在处理put的概念验证请求。自从10年前对它感到沮丧以来,这个项目是我第一次使用SQL,所以请多多包涵。

我想更新特定商店的POTS行信息,因此我收到了一个请求,其中包含我将解析的数据并发送一个UPDATE查询。我一次执行1个单独的条目时会找到成功,但是添加多个变量会给我一个错误,指出no column found by name: <name>,其中<name>等于我在下一个条目中发送的值。 / p>

因此,请声明:

cur.execute('UPDATE Pots SET Pots_ForwardOnFail={1}, Pots_FirePrimary={2}, Pots_FireSecondary={3}, Pots_BurglarPrimary={4}, Pots_DNR={5}, Pots_Passenger={6}, Pots_Freight={7} WHERE StoreNumber={0};'.format(args["Store"], args["HuntLine"], args["FirePrimary"], args["FireSecondary"], args["Burglar"], args["DNR"], args["PassengerElevator"], args["FreightElevator"]))

此示例帖子:

curl --request POST \
  --url http://127.0.0.1:9099/pots/42 \
  --form Store=42 \
  --form HuntLine=OnTheHunt \
  --form FirePrimary=FireHot \
  --form FireSecondary=FireNotSoHot \
  --form Burglar=Hamburglar \
  --form DNR=DNWut \
  --form PassengerElevator=GoingUp \
  --form FreightElevator=GoingDown

这将使用值Pots_ForwardOnFail更新商店42的数据库列OnTheHunt,但是会提示我错误:

sqlite3.OperationalError: no such column: OnTheHunt

我尝试了无济于事的方法,这只是告诉我,我在处理UPDATE时处理多个变量的语法不正确。

2 个答案:

答案 0 :(得分:1)

在此更新查询中,字符串参数未包含在引号中。因此,对于DB,这些看起来像列名。

要验证,您可以在将查询发送到数据库之前打印查询。

qry='UPDATE Pots SET Pots_ForwardOnFail={1}, Pots_FirePrimary={2}, Pots_FireSecondary={3}, Pots_BurglarPrimary={4}, Pots_DNR={5}, Pots_Passenger={6}, Pots_Freight={7} WHERE StoreNumber={0};'.format(args["Store"], args["HuntLine"], args["FirePrimary"], args["FireSecondary"], args["Burglar"], args["DNR"], args["PassengerElevator"], args["FreightElevator"])
print(qry)
cur.execute(qry)

这篇文章有一个示例,说明查询对数据库的外观。 Escape single quote character for use in an SQLite query

在查询中包含字符串的示例:

qry="UPDATE Pots SET Pots_ForwardOnFail='{1}', Pots_FirePrimary='{2}', WHERE StoreNumber={0};".format(args["Store"], args["HuntLine"])

答案 1 :(得分:1)

简单的语法错误,是由于测试数据周围缺乏分隔符所致,外观如此

UPDATE table SET HuntLine=OnTheHunt

将尝试将HuntLine列的值设置为等于OnTheHunt列的值。您的表没有名为OnTheHunt的列,因此查询失败

UPDATE table SET HuntLine='OnTheHunt'

将尝试将HuntLine列的值设置为常量字符串'OnTheHunt'

整数可以工作,因为它们不需要定界符:

UPDATE table SET HuntLine=42

大多数其他数据类型倾向于使用字符串传递到sql查询中

UPDATE table SET HuntDate='2018-01-01'

如果huntdate是日期类型,则通常将解析此字符串并将其内部表示为日期。一些数据库需要一个额外的关键字来触发解析,例如

UPDATE table SET HuntDate=DATE '2018-01-01'

最后一个提示,无关。请通读http://bobby-tables.com,并吸收该建议,然后再也不要再像这样编写python了。这是一个巨大的安全风险,我断然不会雇用在面试过程测试中编写过这样代码的开发人员。我怀疑很多老板都一样

我很想修正您的查询,使其运行,因为我不想冒险将它的完成方式合法化,而应该将其参数化。

如果您在字符串是字符串的每个大括号集中使用了双引号,而在每个花括号中使用了单引号:

qry="UPDATE Pots SET Pots_ForwardOnFail='{1}', Pots_FirePrimary='{2}'...

那本来可以解决的,但它仍然是一个巨大的安全漏洞。始终将您的查询参数化/永远不要将用户提供的值连接到您的查询字符串中。.在c#和sqlserver中(我很清楚),参数化查询看起来像这样:

command.QueryText = "update pots set huntline=@hl, forwardonfail=@fof, fireprimary=@fp...";
command.Parameters.AddWithValue("@hl", request.Form["huntline"]);
command.Parameters.AddWithValue("@fp", request.Form["firepri"]);
command.Parameters.AddWithValue("@fof", request.Form["fwdonfail"]);

距离您已经拥有的距离不到一百万英里,但是可以避免用户将sql放入文本框并破坏您的数据库/暴露其内容。 Python和sqlite应该有类似的东西