Python3 需要为使用 python 的查询格式化字符串,字符串反斜杠不是转义行
Python3 need to format string for a query with python with string backslashes not escape lines
更新:
这是使用 Achampion 的分辨率后得到我需要的代码:
# make a list generated from a previous operation (dynamic list), eg. listA - listB = dynLst
dynLst
['R10YW', 'R13YW', 'R32YWBY','NOSVCYW']
# construct item request for a SQL statement using dynLst, this is Achampion's code
reqSQL = '(' + ', '.join([r"'{}'".format(x) for x in dynLst]) + ')'
# specify query field from table:
f1 = '\"Product_Code\"'
WC = f1 + ' IN ' + reqSQL
WC
'\"Product_Code\" IN (\'R10YW\', \'R13YW\', \'R32YWBY\',\'NOSVCYW\')'
我有一个列表,其中包含来自先前 python 操作的派生值。每次运行前一个 python 命令时,此列表中的项目都会更改。因此,我需要一种动态的方式来格式化列表。我将它与 'IN' 操作数一起使用,作为 SQL statement/where 子句的一部分,用于后续 python 函数。
为了以正确的方式构建 where 子句,我需要将其格式化为:
field = '\"Product_Code\"'
qValues = '(\'R10YW\', \'R13YW\', \'R32YWBY\',\'NOSVCYW\')'
whereClause = field + ' IN ' + qValues
我试过这个:
qValues = '(\'
for val in dynLst: # dynLst = a dynamic List
val = val + '\'
qValues = qValues + val + "," + '\'
qValues = qValues[:-1]
qValues = qValues + ')
但是我得到的格式是这样的:
'(\R10YW\, \R13YW\, \R32YWBY\,\NOSVCYW\)'
我也试过 raw_string('(\') 我认为这是 python3 做 r"string\string" 的方法,但没有运气。我只是得到一个语法错误。
你确定你不是在混淆转义输出。
看起来您只需要一个包含 '
的字符串,例如:
In []:
dynlist = ['R10YW', 'R13YW', 'R32YWBY', 'NOSVCYW']
'(' + ', '.join(["'{}'".format(x) for x in dynlist]) + ')'
Out[]:
"('R10YW', 'R13YW', 'R32YWBY', 'NOSVCYW')"
如果您确实需要在输出中使用 \
,那么您将得到双倍的 \
,因为这就是 Python 显示单个 \
的方式:
In []:
'(' + ', '.join([r"\'{}\'".format(x) for x in dynlist]) + ')'
Out[]:
"(\'R10YW\', \'R13YW\', \'R32YWBY\', \'NOSVCYW\')"
您的代码(在某种程度上)有效,因为它实际上产生了您想要的输出。你永远不应该以这种方式进行 SQL 查询,因为它会打开你的代码 SQL 注入攻击(我假设 SQLite 其他数据库具有相同的漏洞和一些方法来避免它。 )
https://www.tutlane.com/tutorial/sqlite/sqlite-injection-attacks
也就是说,如果您使用 python3 解释器作为交互式 shell(或 ipython 或 Jupyter),当您有一个字符串作为操作的结果时,它为程序员打印格式:
在 [10] 中:s = "\\你好"
在[11]中:s
输出[11]:'\\你好'
但是如果你打印相同的字符串:
在 [12] 中:打印
\你好
一切如你所愿。我试过你的代码,除了在最后一行的末尾遗漏了一个 ' 之外,它可以按照你想要的方式工作。
编辑:重做了斜杠,因为网站也在转义。该示例现在看起来就像来自 ipython.
更新:
这是使用 Achampion 的分辨率后得到我需要的代码:
# make a list generated from a previous operation (dynamic list), eg. listA - listB = dynLst
dynLst
['R10YW', 'R13YW', 'R32YWBY','NOSVCYW']
# construct item request for a SQL statement using dynLst, this is Achampion's code
reqSQL = '(' + ', '.join([r"'{}'".format(x) for x in dynLst]) + ')'
# specify query field from table:
f1 = '\"Product_Code\"'
WC = f1 + ' IN ' + reqSQL
WC
'\"Product_Code\" IN (\'R10YW\', \'R13YW\', \'R32YWBY\',\'NOSVCYW\')'
我有一个列表,其中包含来自先前 python 操作的派生值。每次运行前一个 python 命令时,此列表中的项目都会更改。因此,我需要一种动态的方式来格式化列表。我将它与 'IN' 操作数一起使用,作为 SQL statement/where 子句的一部分,用于后续 python 函数。
为了以正确的方式构建 where 子句,我需要将其格式化为:
field = '\"Product_Code\"'
qValues = '(\'R10YW\', \'R13YW\', \'R32YWBY\',\'NOSVCYW\')'
whereClause = field + ' IN ' + qValues
我试过这个:
qValues = '(\'
for val in dynLst: # dynLst = a dynamic List
val = val + '\'
qValues = qValues + val + "," + '\'
qValues = qValues[:-1]
qValues = qValues + ')
但是我得到的格式是这样的:
'(\R10YW\, \R13YW\, \R32YWBY\,\NOSVCYW\)'
我也试过 raw_string('(\') 我认为这是 python3 做 r"string\string" 的方法,但没有运气。我只是得到一个语法错误。
你确定你不是在混淆转义输出。
看起来您只需要一个包含 '
的字符串,例如:
In []:
dynlist = ['R10YW', 'R13YW', 'R32YWBY', 'NOSVCYW']
'(' + ', '.join(["'{}'".format(x) for x in dynlist]) + ')'
Out[]:
"('R10YW', 'R13YW', 'R32YWBY', 'NOSVCYW')"
如果您确实需要在输出中使用 \
,那么您将得到双倍的 \
,因为这就是 Python 显示单个 \
的方式:
In []:
'(' + ', '.join([r"\'{}\'".format(x) for x in dynlist]) + ')'
Out[]:
"(\'R10YW\', \'R13YW\', \'R32YWBY\', \'NOSVCYW\')"
您的代码(在某种程度上)有效,因为它实际上产生了您想要的输出。你永远不应该以这种方式进行 SQL 查询,因为它会打开你的代码 SQL 注入攻击(我假设 SQLite 其他数据库具有相同的漏洞和一些方法来避免它。 )
https://www.tutlane.com/tutorial/sqlite/sqlite-injection-attacks
也就是说,如果您使用 python3 解释器作为交互式 shell(或 ipython 或 Jupyter),当您有一个字符串作为操作的结果时,它为程序员打印格式:
在 [10] 中:s = "\\你好"
在[11]中:s
输出[11]:'\\你好'
但是如果你打印相同的字符串:
在 [12] 中:打印
\你好
一切如你所愿。我试过你的代码,除了在最后一行的末尾遗漏了一个 ' 之外,它可以按照你想要的方式工作。
编辑:重做了斜杠,因为网站也在转义。该示例现在看起来就像来自 ipython.