我正在尝试使用字符串格式从字符串数组中插入一些字符串。
但由于某种原因,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运行。我怎么能指定我不想插入单引号?
答案 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)