Python: как удалить одинарные кавычки из элемента списка - PullRequest
0 голосов
/ 22 февраля 2019

Я работаю над небольшим количеством кода на Python, чтобы выполнить запрос к базе данных SQL с красным смещением (postgres), и столкнулся с проблемой, из-за которой я не могу убрать окружающие одинарные кавычки из переменной I 'м переходя на запрос.Я пытаюсь удалить несколько таблиц из списка.Это основы моего кода:

def func(table_list):
    drop_query = 'drop table if exists %s'  #loaded from file
    table_name = table_list[0]              #table_name = 'my_db.my_table'
    con=psycopg2.connect(dbname=DB, host=HOST, port=PORT, user=USER, password=PASS)
    cur=con.cursor()
    cur.execute(drop_query, (table_name, )) #this line is giving me trouble
    #cleanup statements for the connection

table_list = ['my_db.my_table']

когда вызывается func (), мне выдается следующая ошибка:

syntax error at or near "'my_db.my_table'"
LINE 1: drop table if exists 'my_db.my_table...
                             ^

Есть ли способ, которым я могу удалить окружающие одинарные кавычки из моего элемента списка?

на данный момент, я сделал это (как мне кажется) неправильно и использовал конкатенацию строк, но знаю, что этов основном просят SQL-инъекции.

Ответы [ 2 ]

0 голосов
/ 22 февраля 2019

Это не так, как работает psycopg2.Вы используете строковый оператор %s для замены на строку.Причина этого заключается в том, чтобы безопасно токенизировать вашу строку, чтобы избежать SQL-инъекций, все остальное обрабатывает psycopg2.

Вам необходимо изменить запрос, прежде чем он попадет в оператор execute.

drop_query = 'drop table if exists {}'.format(table_name)

Я предупреждаю вас, однако, не разрешайте создавать имена этих таблиц из внешних источников, иначе вы рискуете ввести SQL.

Однако новая версия PSYCOPG2 допускает нечто подобное

http://initd.org/psycopg/docs/sql.html#module-psycopg2.sql

from psycopg2 import sql

cur.execute(
    sql.SQL("insert into {} values (%s, %s)")
        .format(sql.Identifier('my_table')),
    [10, 20])
0 голосов
/ 22 февраля 2019

Я почти уверен, что это не лучший способ сделать это, но вы можете удалить определенные символы или части строк, используя функцию replace ().Это должно работать:

cur.execute(drop_query, (table_name.replace("'", ""), ))
...