Python 如果我*真的*需要为SQL脚本转义引号呢?

Python 如果我*真的*需要为SQL脚本转义引号呢?,python,sql,Python,Sql,现在请不要伸手去拿“复制”枪 我需要生成一系列SQL语句,这些语句涉及包含偶尔单个引号的文字字符串。是的,我知道问题是,我没有直接与数据库通信:我正在生成一个SQL脚本,用于在另一台计算机上加载数据。因此,我不介意向本地数据库(mysql)发出参数化查询,但我需要以文本形式输出完整的SQL命令。我可以用python来做吗?我在SO上看到的唯一建议是使用repr()or,或特定于。这肯定不是全部吗 此应用程序永远不会处理不受信任的数据,因此,尽管我希望获得最可靠的解决方案,但我并不太担心格式错误的

现在请不要伸手去拿“复制”枪

我需要生成一系列SQL语句,这些语句涉及包含偶尔单个引号的文字字符串。是的,我知道问题是,我没有直接与数据库通信:我正在生成一个SQL脚本,用于在另一台计算机上加载数据。因此,我不介意向本地数据库(mysql)发出参数化查询,但我需要以文本形式输出完整的SQL命令。我可以用python来做吗?我在SO上看到的唯一建议是使用
repr()
or,或特定于。这肯定不是全部吗


此应用程序永远不会处理不受信任的数据,因此,尽管我希望获得最可靠的解决方案,但我并不太担心格式错误的unicode攻击等。最好的方法是什么?

对于任何语言,生成SQL的过程都是相同的。您需要首先了解您想要生成的语言(或数据格式;此处相同的差异)的整体。没有做到这一点是大多数尝试的主要失败:因为他们不理解语言,所以他们无法处理所有可能导致问题的输入。当您了解该语言的全部内容(包括所有角点情况和很少使用的结构)时,您就可以创建能够理解所有可能输入并用该语言正确表示它们的代码。最简单的解决办法是让已经处理过的其他人来做困难的部分,或者通过使用不同的表示来避免整个混乱。这就是为什么每个人都推荐参数化查询。它将责任推给已经解决它的其他人,通常他们通过在协议中使用不同于SQL语言本身的表示来解决它。

生成SQL的过程对于任何语言都是相同的。您需要首先了解您想要生成的语言(或数据格式;此处相同的差异)的整体。没有做到这一点是大多数尝试的主要失败:因为他们不理解语言,所以他们无法处理所有可能导致问题的输入。当您了解该语言的全部内容(包括所有角点情况和很少使用的结构)时,您就可以创建能够理解所有可能输入并用该语言正确表示它们的代码。最简单的解决办法是让已经处理过的其他人来做困难的部分,或者通过使用不同的表示来避免整个混乱。这就是为什么每个人都推荐参数化查询。它将责任推给已经解决问题的其他人,通常他们通过在协议中使用不同于SQL语言本身的表示来解决问题。

您可以使用类将查询写入文件,而不是对数据库执行查询。您可能还可以直接使用它(并省去设置数据库等)

您还可以使用属性“回放”会话。

您可以使用类将查询写入文件,而不是对数据库执行查询。您可能还可以直接使用它(并省去设置数据库等)


您还可以使用该属性来“播放”会话。

虽然生成复杂的SQL可能会有困难,但我喜欢python中的straight
INSERT
s。没有工具,没有库,只有纯python解决了所有问题:

# syntactic sugar
def sq(s):
    return s.replace("'", "''")

# a third kind of string delimiters :3
sql_template = """INSERT INTO mytab ("the key", f1, f2) 
    VALUES (%d, '%s', '%s');"""

the_key = 7
f1 = "Hello World"
f2 = "That's ok"

# escape only string colums
sql = sql_template % (the_key, sq(f1), sq(f2))

print sql

虽然生成复杂的SQL可能会有困难,但我喜欢python的直接插入。没有工具,没有库,只有纯python解决了所有问题:

# syntactic sugar
def sq(s):
    return s.replace("'", "''")

# a third kind of string delimiters :3
sql_template = """INSERT INTO mytab ("the key", f1, f2) 
    VALUES (%d, '%s', '%s');"""

the_key = 7
f1 = "Hello World"
f2 = "That's ok"

# escape only string colums
sql = sql_template % (the_key, sq(f1), sq(f2))

print sql

您是否需要输出SQL命令,或者您是否可以控制数据的处理方式?我有一些控制权,但我想使用python来完成这个特定任务,我不想让它成为另一端的项目依赖项。此外,数据需要被转换,所以我不想转换成中间形式,然后编写一个需要分发的进口商……只是好奇为什么你考虑<代码> RePrP(<)/代码>黑客。是否存在会中断的情况?另请参见@gill,
repr()
targets python语法,而不是sql。它添加了需要删除的双引号;它可能以SQL无法理解的方式转义unicode字符;等等。您是否需要输出SQL命令,或者您是否可以控制数据的处理方式?我有一些控制权,但我想使用python来完成这个特定任务,我不想让它成为另一端的项目依赖项。此外,数据需要被转换,所以我不想转换成中间形式,然后编写一个需要分发的进口商……只是好奇为什么你考虑<代码> RePrP(<)/代码>黑客。是否存在会中断的情况?另请参见@gill,
repr()
targets python语法,而不是sql。它添加了需要删除的双引号;它可能以SQL无法理解的方式转义unicode字符;是的,非常感谢你解释这一切。我很乐意将SQL代码生成委托给参数化查询,但它们不会生成SQL(我可以掌握)——它们只是运行查询。是的,非常感谢您解释这一切。我很乐意将SQL代码生成委托给参数化查询,但它们不会生成SQL(我可以掌握)——它们只是运行查询。我必须承认,我不能对
str.replace
提出很好的反对意见。但不知何故,在所有可怕的警告之后,我不愿意自己引用……毕竟,如果输入是可信的,最终的问题几乎不可避免地会导致立即显而易见的导入问题。与使用一些fat库模块(或我们在石器时代使用的
awk
脚本)不同,您的代码将很容易被同行评审。只是说;)我同意,我投了更高的票