Ошибка в sqlite3

Почему выдает ошибку? Ошибка: "sqlite3.OperationalError: near "table": syntax error"

Код

def sqlLiteConnect(self, db, table, column_name, lang=None):
    self.connect = sqlite3.connect(db)
    self.cursor = self.connect.cursor()
    self.query_columns = "PRAGMA table_info('+table+')"
    self.cursor.execute(self.query_columns)

    self.queryRow = """SELECT id, Word, Translation FROM table  WHERE id=random.randomint(0, 2000) """
    self.cursor.execute(self.queryRow)
    print(self.queryRow)
    self.cursor.commit()


sqlLiteConnect(self, 'db/Lings_Words_Db.db', 'generalWords', 'Word')

Ответы (1 шт):

Автор решения: insolor

Первая ошибка, в этой строке:

self.query_columns = "PRAGMA table_info('+table+')"

по логике должно подставляться значение переменной table, но для этого нужно чтобы кавычки были одинаковые:

self.query_columns = "PRAGMA table_info(" + table + ")"

Т.е. должны соединяться три строки: "PRAGMA table_info(", строка из переменной table и ")", а у вас просто одна цельная строка, в которой table - это просто текст, а не имя переменной. Пробелы до и после + не играют роли, я их добавил для лучшей читаемости. Также, если нужно чтобы имя таблицы в итоговой строке было обернуто в одинарные кавычки, то нужно делать так:

self.query_columns = "PRAGMA table_info('" + table + "')"

Вторая ошибка: в SQL запрос вы добавили python код random.randomint(0, 2000) - но SQL этот код не сможет выполнить. Нужно получить случайное число средствами python, потом передать его в запрос:

self.queryRow = """SELECT id, Word, Translation FROM table  WHERE id=?"""
self.cursor.execute(self.queryRow, (random.randomint(0, 2000),))

См. справку по методу execute.

Третья ошибка: в запросе """SELECT id, Word, Translation FROM table WHERE id=?""" table - это просто текст, который будет воспринят как имя таблицы (таблицы с именем table), а не имя переменной, вместо которой подставится значение аргумента метода.

Полный исправленный код метода:

def sqlLiteConnect(self, db, table, column_name, lang=None):
    self.connect = sqlite3.connect(db)
    self.cursor = self.connect.cursor()
    self.query_columns = f"PRAGMA table_info('{table}')"
    self.cursor.execute(self.query_columns)

    self.queryRow = f"""SELECT id, Word, Translation FROM {table} WHERE id=?"""
    self.cursor.execute(self.queryRow, (random.randomint(0, 2000),))
    print(self.queryRow)
    self.cursor.commit()

Обратите внимание: я использовал f-строки для подстановки значений переменных внутрь строк запроса. Подробнее можно почитать, например, здесь: Форматирование в Python с помощью f-строк

→ Ссылка