PostgreSQL
 sql >> Base de Dados >  >> RDS >> PostgreSQL

Psycopg2 Inserir na tabela com espaços reservados


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.