首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >具有多变量的SQL更新

具有多变量的SQL更新
EN

Stack Overflow用户
提问于 2018-11-28 03:20:33
回答 2查看 1.5K关注 0票数 0

我正在处理一个put请求,要求在工作中提供概念证明。这个项目是我10年前对SQL感到沮丧之后第一次使用SQL,所以请原谅我。

我希望更新特定商店的POTS行信息,因此我将使用数据发送请求,我将解析并发送一个UPDATE查询。当一次执行一个单独的条目时,我会发现成功,但是当添加多个变量时,它会给我一个错误,说明no column found by name: <name><name>等于我在下一个条目中发送的值。

就拿这句话来说:

代码语言:javascript
复制
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"]))

这一抽样职位:

代码语言:javascript
复制
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,但是会提示我出错:

代码语言:javascript
复制
sqlite3.OperationalError: no such column: OnTheHunt

我尝试了一些方法,但没有效果,这只是告诉我,我处理多个变量的语法在使用UPDATE时是不正确的。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-11-28 03:42:16

测试数据周围缺少分隔符所导致的简单语法错误,原因是测试数据的外观

代码语言:javascript
复制
UPDATE table SET HuntLine=OnTheHunt

将尝试将列HuntLine的值设置为OnTheHunt列的值。表中没有一个名为OnTheHunt的列,因此查询失败

代码语言:javascript
复制
UPDATE table SET HuntLine='OnTheHunt'

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

Ints可以工作,因为它们不需要分隔符:

代码语言:javascript
复制
UPDATE table SET HuntLine=42

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

代码语言:javascript
复制
UPDATE table SET HuntDate='2018-01-01'

如果huntdate是日期类型,则此字符串通常将在内部被解析并表示为日期。有些db需要额外的关键字来触发解析,如

代码语言:javascript
复制
UPDATE table SET HuntDate=DATE '2018-01-01'

最后一点,无关。请好好阅读一下http://bobby-tables.com,并吸收这些建议,然后以后不要再写这样的python了。这是一个巨大的安全风险,我不会雇佣一个在面试过程测试中这样写代码的开发人员;我怀疑许多雇主是一样的。

我不太愿意修复您的查询,以便它运行,因为我不想冒险使它的方式合法化,当它应该被参数化时,但是..。

是否在列为字符串的每个圆括号集合周围使用双引号和单引号:

代码语言:javascript
复制
qry="UPDATE Pots SET Pots_ForwardOnFail='{1}', Pots_FirePrimary='{2}'...

这样就可以解决了,但它仍然是一个巨大的安全漏洞。始终参数化查询/从不将用户提供的值连接到查询字符串中。在c#和sqlserver中,参数化查询如下所示:

代码语言:javascript
复制
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应该有类似的东西。

票数 1
EN

Stack Overflow用户

发布于 2018-11-28 03:32:15

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

要进行验证,可以在将查询发送到DB之前打印它。

代码语言:javascript
复制
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

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

代码语言:javascript
复制
qry="UPDATE Pots SET Pots_ForwardOnFail='{1}', Pots_FirePrimary='{2}', WHERE StoreNumber={0};".format(args["Store"], args["HuntLine"])
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53511611

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档