Ошибка в 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 шт):
Первая ошибка, в этой строке:
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-строк