如果存在创建表的文件,我正在尝试动态地向查询添加一些其他字符串。如果我删除第一个三端,则结束三元组。尝试打印下面的字符串时出现语法错误。
testQuery = """
select
fish,
"""+("""Room,""" if os.path.isfile(schoolFile)==True else """""")+
"""period_01,
period_02
from over_cs_doe d
"""+("""LEFT JOIN schools s ON s.fish=d.fish""" if os.path.isfile(schoolFile)==True else """""")
答案 0 :(得分:1)
您的代码几乎没问题,问题是如果您假装在下一行中继续发表声明,则必须在行末使用\
testQuery = """
select
fish,
"""+("""Room,""" if os.path.isfile(schoolFile) else """""") + \ #Use backslash to continue your statement
"""period_01,
period_02
from over_cs_doe d
"""+("""LEFT JOIN schools s ON s.fish=d.fish""" if os.path.isfile(schoolFile) else """""")
正如我在评论中所说,不要测试布尔值是否为真
答案 1 :(得分:0)
您可以通过这种方式混合字符串和代码,但这并不容易阅读。 为什么不尝试类似的东西:
if os.path.isfile(schoolFile):
testQuery = """
select Fish,Room,period_01 ...
from ...
"""
else:
testQuery = """
select Fish,period_01 ...
from ...
"""
答案 2 :(得分:0)
对于它的价值,一个更易读,更不易出错的替代方案是使用字符串插值而不是连接。
另外,正如评论所暗示的那样,'某种东西='真'以“布尔”方式肯定不被认为是好风格。这同样适用于不需要它们的三引号字符串。
因此,您的testQuery也可能如下所示:
testQuery = """
select
fish,
%s
period_01,
period_02
from over_cs_doe d
%s
""" % ("Room," if os.path.isfile(schoolFile) else "",
"LEFT JOIN schools s ON s.fish=d.fish" if os.path.isfile(schoolFile) else "")
答案 3 :(得分:0)
对于 Python 3.6 以后的版本,我将使用 f 字符串,无需担心行延续或位置插值,例如 %s
占位符。
例如:
is_school_file = os.path.isfile(schoolFile)
testQuery = f"""
select
fish,
{" room," if is_school_file else ""}
period_01,
period_02
from over_cs_doe as d
{"left join schools as s ON s.fish=d.fish" if is_school_file else ""}"""
如果您使用的是 DB-API 兼容的数据库库,或者像 SQLAlchemy 这样的 ORM,那么有更安全的方法来构建避免 SQL 注入的查询。这看起来不像是可能存在任何未经处理的用户输入的情况,但有责任在人们连接字符串以创建 SQL 语句的任何地方提及它,因为 SQL 注入仍然是 #1 代码漏洞。