我正在处理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
时处理多个变量的语法不正确。
答案 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应该有类似的东西