Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/326.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/79.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 具有多个变量的SQL更新_Python_Sql - Fatal编程技术网

Python 具有多个变量的SQL更新

Python 具有多个变量的SQL更新,python,sql,Python,Sql,我正在处理一个关于工作中概念证明的put请求。自从10年前我对SQL感到失望以来,这是我第一次使用它,所以请容忍我 我想更新特定存储区的POTS行信息,因此我将发送一个请求,其中包含我将解析并发送update查询的数据。当一次执行一个单独的条目时,我会发现成功,但当添加多个变量时,会出现一个错误,指出未按名称找到列:,其中等于我在下一个条目中发送的值 就拿这句话来说吧: cur.execute('UPDATE Pots SET Pots_ForwardOnFail={1}, Pots_FireP

我正在处理一个关于工作中概念证明的
put
请求。自从10年前我对SQL感到失望以来,这是我第一次使用它,所以请容忍我

我想更新特定存储区的POTS行信息,因此我将发送一个请求,其中包含我将解析并发送
update
查询的数据。当一次执行一个单独的条目时,我会发现成功,但当添加多个变量时,会出现一个错误,指出
未按名称找到列:
,其中
等于我在下一个条目中发送的值

就拿这句话来说吧:

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
这将使用值
OnTheHunt
更新存储
42
的数据库列
Pots\u ForwardOnFail
,但是会提示我一个错误:

sqlite3.OperationalError: no such column: OnTheHunt

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

在此更新查询中,字符串参数不包含在引号中。所以,对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应该如何处理查询

查询中封闭字符串的示例:

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

在此更新查询中,字符串参数不包含在引号中。所以,对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应该如何处理查询

查询中封闭字符串的示例:

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

由于测试数据周围缺少分隔符(从外观上看)而导致的简单语法错误

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

UPDATE table SET HuntLine='OnTheHunt'
将尝试将列HuntLine的值设置为常量字符串“OnTheHunt”

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

UPDATE table SET HuntLine=42
大多数其他数据类型倾向于使用字符串传递到sql查询中

UPDATE table SET HuntDate='2018-01-01'
如果huntdate是日期类型,则该字符串通常会被解析并在内部表示为日期。有些数据库需要一个额外的关键字来触发解析,如

UPDATE table SET HuntDate=DATE '2018-01-01'
最后一个提示,无关。请仔细阅读并吸收这些建议,然后继续前进,不要再像这样编写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放入文本框并破坏您的db/公开其内容时,您可以免疫。Python和sqlite应该有类似的语法错误,这是由于测试数据周围缺少分隔符(从外观上看)而导致的

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

UPDATE table SET HuntLine='OnTheHunt'
将尝试将列HuntLine的值设置为常量字符串“OnTheHunt”

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

UPDATE table SET HuntLine=42
大多数其他数据类型倾向于使用字符串传递到sql查询中

UPDATE table SET HuntDate='2018-01-01'
如果huntdate是日期类型,则该字符串通常会被解析并在内部表示为日期。有些数据库需要一个额外的关键字来触发解析,如

UPDATE table SET HuntDate=DATE '2018-01-01'
最后一个提示,无关。请仔细阅读并吸收这些建议,然后继续前进,不要再像这样编写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放入文本框并破坏您的db/公开其内容时,您可以免疫。Python和sqlite应该有类似的东西

我投票结束这个问题,因为这个问题与编程无关。问题出在我的测试中。数据库接受整数,我在测试时给了它键盘字符串。我投票结束这个问题,因为这个问题与编程无关。问题出在我的测试中。数据库接受整数,我在测试时给了它键盘字符串,事实证明这只是我的测试方式。。我正在向接受整数的列发送字符串。我很想知道,如果类型不匹配,为什么它默认使用列名。尽管如此,这是一个非常有成效的答案,因为像这样验证查询是我绝对应该做的事情;发送此查询:更新Pots SET HuntLine=OnTheHunt(查询转换为“将列HuntLine的值设置为与列的值相同