Динамический SQL-запрос (строковый шаблон) - PullRequest
0 голосов
/ 21 октября 2019

Допустим, у меня есть рабочая функция, которая печатает первую запись из базы данных:

class DataBase:
    def db_firstrecord(self):

        self.execute("SELECT * FROM Flat")
        row = self.fetchall()
        row = row[0]
        print(row)

def main():
    DB.DataBase.db_firstrecord(cur)

Недавно я обнаружил, что существует несколько способов создания динамических запросов SQL (строковые шаблоны SQL). И я хочу использовать мою начальную функцию с разными именами таблиц. Как я могу реализовать это в чистоте и безопасности?

Я хочу что-то вроде этого:

class DataBase:
    def db_firstrecord(self,`Table_name`):

        self.execute("SELECT * FROM `Table_name`")
        row = self.fetchall()
        row = row[0]
        print(row)

def main():
    DB.DataBase.db_firstrecord(cur,`Table_name`)

1 Ответ

1 голос
/ 21 октября 2019

Используйте белый список допустимых имен таблиц.

class Database:
    table_names = {'table1', 'table2', ...}

    def db_firstrecord(self, table_name):
        if table_name not in table_names:
            raise ValueError

        self.execute(f"SELECT * FROM `{table_name}` LIMIT 1")
        row = self.fetch()
        return row

Обратите внимание, что вы не можете вставлять обратные метки вокруг переменной Python в списке параметров. Он должен быть в строке SQL.

И нет причин извлекать все строки, если вы просто хотите получить первую. Скажите, чтобы запрос возвращал только одну строку, и просто используйте fetch() вместо fetchall().

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