关于sql:如何写一个字符串,可以是’%s’到文件(python)

How to write a string that could be None to '%s' to a file (python)

我正在尝试将字符串写入文件。此文件将是对Microsoft的SQL Server的查询,因此它必须遵循特定的格式。这就是我的问题所在。

假设代码的其余部分是正确的,我有这样的写方法:

1
2
3
4
5
6
file.write("INSERT INTO SAMPLE_TABLE (int_value, string_value, comment)
"

          "VALUES (%d, '%s', '%s')

"

           % (row["int_value"], row["string_value"], row["comment"]))

如您所见,我需要在%s周围加上引号,因为这是查询的语法。我还应该提到我正在开发一个GUI。用户可以选择在注释中输入。如果用户没有输入任何内容,那么row["comment"]将为无。但是,由于我有关于%s的引用,它将写入'None',它将是数据库中与None相邻的字符串,在数据库中转换为空值,这就是我想要的。

我可以这样做:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
if row["comment"] is None:
    file.write("INSERT INTO SAMPLE_TABLE (int_value, string_value, comment)
"

              "VALUES (%d, '%s', %s)

"

               % (row["int_value"], row["string_value"], row["comment"]))
else:
    file.write("INSERT INTO SAMPLE_TABLE (int_value, string_value, comment)
"

          "VALUES (%d, '%s', '%s')

"

           % (row["int_value"], row["string_value"], row["comment"]))

但这是两行代码。如果后来我意识到不止一个值可能是零呢?我要检查每一个箱子!我需要让这个充满活力。

感谢您的帮助。


这个怎么样?

1
2
3
4
5
6
7
comment_str ="None" if row["comment"] is None else"'{}'".format(row["comment"])
file.write("INSERT INTO SAMPLE_TABLE (int_value, string_value, comment)
"

          "VALUES (%d, '%s', %s)

"

           % (row["int_value"], row["string_value"], comment_str))


您可以使用任何python mysql模块及其光标选项

1
cursor.mogrify(query, args)

如果你已经在使用它。它将根据类型正确地避开所有内容。

如果你想手动操作,你可以做一个简单的

1
row['comment'] if row['comment'] is None else"'".join(['',row['comment'],''])

在查询之前


不添加引号,然后用带引号的注释替换它(可以用一行进行双重替换),怎么样?

1
2
3
4
row = {"comment":"abc"}
comment = row.get("comment") # Note, bracket lookup would have thrown a KeyError, not returning None
values ="%d, '%s', %s" % (1,"string_value","'%s'" % comment if comment is not None else None)
print values

哪个可以打印1, 'string_value', 'abc'1, 'string_value', None

然后用VALUES = (%s) % values替换值

注意,如果只保留

1
2
3
comment = row.get("comment")
# In your string:
VALUES = (%s) % ("%d, '%s', %s" % (row["int_value"], row["string_value"],"'%s'" % comment if comment is not None else None))

下面是一个基本示例:

1
2
3
4
5
6
7
8
9
>>> comment = None
>>> 'Values = (%s)' % ("'%s'" % comment if comment is not None else None)
'Values = (None)'
>>> comment ="test"
>>> 'Values = (%s)' % ("'%s'" % comment if comment is not None else None)
"Values = ('test')"
>>> comment ="" # For empty comments, thanks to @Bharel for pointing this out
>>> 'Values = (%s)' % ("'%s'" % comment if comment is not None else None)
"Values = ('')"


我会用repr(row["comment"])%s。它为您提供了一个字符串的引号,但只留下None字面值。

1
2
3
4
>>> 'VALUES (%s)' % repr(None)
'VALUES (None)'
>>> 'VALUES (%s)' % repr("string")
"VALUES ('string')"


你可以试试

1
2
3
4
5
6
file.write("INSERT INTO SAMPLE_TABLE (int_value, string_value, comment)
"

      "VALUES (%d, '%s', '%s')

"

       % (row["int_value"], row["string_value"], row["comment"] or 'NULL'))


为什么不直接插入

1
2
3
4
if row["comment"] is not None:
    row["comment"] ="'%s'" % row["comment"]

file.write(...

它提供了您想要的自定义行为,不需要重复任何代码。