SQLite: подстановка имени параметра и поля на Python - PullRequest
0 голосов
/ 03 апреля 2020

Я относительно новичок в SQL и sqlite3 в целом, и у меня есть вопрос об использовании знака вопроса или именованного стиля в выполнениях.

У меня есть несколько баз данных с таблицей под названием structures, и я создали метод в классе Python, который извлекает n-ное значение некоторого столбца, используя

def get_nth(self, col_name, n):
    cursor = self.con.cursor()
    if n == -1:
        cursor.execute(f"SELECT {col_name} FROM structures ORDER BY id DESC LIMIT 1")
    else:
        cursor.execute(f"SELECT {col_name} FROM structures WHERE id == {n}")

    try:
        val = cursor.fetchall()[0][0]
    except IndexError as e:
        print("Faulty database - no 'structures' table found")
        raise e
    return val

Погуглив о других проблемах, связанных с sqlite3, я обнаружил, что выполнение с f-strings или str.format будет уязвимым для атак с использованием инъекций, и поэтому я попытался изменить выполнение, в соответствии с Cursor Objects , следующим образом:

if n == -1:
    cursor.execute("SELECT ? FROM structures ORDER BY id DESC LIMIT 1", (col_name, ))
else:
    cursor.execute("SELECT ? FROM structures WHERE id == ?", (col_name, n))

print(cursor.fetchall()[0][0])

Это выдает само имя столбца вместо фактического значения , поскольку .execute использует 'id', а не id, если col_name='id'.

Вопрос:

Есть ли способ использовать знак вопроса или именованный стиль таким образом?

Ответы [ 2 ]

1 голос
/ 03 апреля 2020

В соответствии с ответом @SergeBallesta, вы можете сделать что-то вроде:

sql = 'SELECT {col_name} FROM structures WHERE id = ?'.format(col_name=colname)
cursor.execute(sql, [n])

, который использует гибрид двух соглашений.

1 голос
/ 03 апреля 2020

Нет. Вы можете передавать только data в параметризованных запросах, но ни SQL такие слова, как INSERT, SELECT или UPDATE, ни имена, такие как имена таблиц или полей.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...