Python字符串格式:单引号问题

时间:2017-03-09 19:52:53

标签: python sql string-formatting psycopg2

我正在尝试使用字符串格式从字符串数组中插入一些字符串。

但由于某种原因,Python正在用所需的字符串填充第一个%s,但用单引号括起来。

是否有明确的方法来阻止此行为?

示例:

myString = [['000b',
  '1',
  'Text1',
  '1.74',
  'Text2',
  'None'],
 ['000b',
  '1',
  'TextA',
  '12.92',
  'TextB',
  'None']]

当我运行以下内容时:

cursor.executemany("INSERT INTO schema.myTable_%s_name (col1, col2, col3, col4, col5) VALUES (%s, NULLIF(%s,'None')::decimal, NULLIF(%s,'None')::decimal, %s, NULLIF(%s,'None')::int)", myString[0:len(myString)])

预期的行为是表名变为schema.myTable_000b_name但Python写schema.myTable_'000b'_name这自然会阻止SQL运行。我怎么能指定我不想插入单引号?

2 个答案:

答案 0 :(得分:1)

这不符合你的想法。

executemany过程创建一个SQL语句,然后执行相同的语句,将其绑定到不同的参数。这样你就可以这样快速将多行插入表中。

这不允许运行多个不同的 SQL语句,每个语句都有自己的参数。它不支持从参数中插入表名;它尝试工作的事实是一种好奇心,而不是一种特征。

如果需要插入许多表,请发出尽可能多的插入语句。使用普通的Python插值计算表名。数据库驱动程序尝试将您在表名中间找到的参数解释为varchar常量,并正确引用它。

答案 1 :(得分:0)

使用python生成SQL字符串时,我建议您查看python的.format(key=value)语法。见https://pyformat.info。这样可以非常直观地创建查询

my_array = [{table: 'something',value: 'something_else'}]

for opts in my_array:
    query = 'select * into {table} from some_table where x = {value}'.format(**opts)
相关问题