Я относительно новичок в 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'
.
Вопрос:
Есть ли способ использовать знак вопроса или именованный стиль таким образом?