我正在处理一个put请求,要求在工作中提供概念证明。这个项目是我10年前对SQL感到沮丧之后第一次使用SQL,所以请原谅我。
我希望更新特定商店的POTS行信息,因此我将使用数据发送请求,我将解析并发送一个UPDATE查询。当一次执行一个单独的条目时,我会发现成功,但是当添加多个变量时,它会给我一个错误,说明no column found by name: <name>,<name>等于我在下一个条目中发送的值。
就拿这句话来说:
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时是不正确的。
发布于 2018-11-28 03:42:16
测试数据周围缺少分隔符所导致的简单语法错误,原因是测试数据的外观
UPDATE table SET HuntLine=OnTheHunt将尝试将列HuntLine的值设置为OnTheHunt列的值。表中没有一个名为OnTheHunt的列,因此查询失败
UPDATE table SET HuntLine='OnTheHunt'将尝试将列HuntLine的值设置为常量字符串'OnTheHunt‘。
Ints可以工作,因为它们不需要分隔符:
UPDATE table SET HuntLine=42大多数其他数据类型倾向于使用字符串传递到sql查询中。
UPDATE table SET HuntDate='2018-01-01'如果huntdate是日期类型,则此字符串通常将在内部被解析并表示为日期。有些db需要额外的关键字来触发解析,如
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应该有类似的东西。
发布于 2018-11-28 03:32:15
在此更新查询中,字符串参数不包含在引号中。因此,对于DB来说,这些看起来像列名。
要进行验证,可以在将查询发送到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)这篇文章有一个例子,说明查询在DB中应该是什么样的。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"])https://stackoverflow.com/questions/53511611
复制相似问题