Você está usando formatação de string Python e esta é uma ideia muito ruim (TM). Pense em injeção de SQL. A maneira correta de fazer isso é usar variáveis vinculadas:
cur.execute('INSERT INTO %s (day, elapsed_time, net_time, length, average_speed, geometry) VALUES (%s, %s, %s, %s, %s, %s)', (escaped_name, day, time_length, time_length_net, length_km, avg_speed, myLine_ppy))
onde a tupla de parâmetros é fornecida como segundo argumento para
execute()
. Além disso, você não precisa escapar de nenhum valor, o psycopg2 fará o escape para você. Neste caso particular também é sugerido não passar o nome da tabela em uma variável (escaped_name
), mas para incorporá-lo na string de consulta:psycopg2 não sabe como citar nomes de tabelas e colunas, apenas valores. Veja a documentação do psycopg2:
https://www.psycopg.org/docs/usage.html#passing-parameters-to-sql-queries
Se você deseja gerar programaticamente a instrução SQL, a maneira usual é usar a formatação Python para a instrução e a associação de variáveis para os argumentos. Por exemplo, se você tiver o nome da tabela em
escaped_name
você pode fazer:query = "INSERT INTO %s (col1, ...) VALUES (%%s, ...)" % escaped_name
curs.execute(query, args_tuple)
Obviamente, para usar espaços reservados em sua consulta, você precisa citar qualquer
%
que introduzem um argumento vinculado no primeiro formato. Observe que isso é seguro se e somente se
escaped_name
é gerado pelo seu código ignorando qualquer entrada externa (por exemplo, um nome de base de tabela e um contador), mas corre o risco de injeção de SQL se você usar dados fornecidos pelo usuário.