Хорошо, давайте разберемся с ошибкой sqlite3.OperationalError: incomplete input. Эта ошибка возникает в SQLite3, когда вы пытаетесь выполнить SQL-запрос, который является синтаксически неполным или неправильным.
В вашем коде причина ошибки кроется в этой строке:
cur.execute('CREATE TABLE IF NOT EXISTS models (id int auto_increment primary key, model varchar(150), promt varchar(200)')
Проблема:
Вы используете auto_increment в определении столбца id, но auto_increment в SQLite3 не является стандартным атрибутом столбца. В SQLite3 автоинкремент выполняется с помощью ключевого слова INTEGER PRIMARY KEY AUTOINCREMENT или INTEGER PRIMARY KEY (это тоже сработает).
Решение:
Вам нужно изменить SQL-запрос для создания таблицы следующим образом:
cur.execute('CREATE TABLE IF NOT EXISTS models (id INTEGER PRIMARY KEY AUTOINCREMENT, model VARCHAR(150), promt VARCHAR(200))')
Исправленный код:
Вот полный исправленный код с правильным SQL-запросом:
import telebot
import sqlite3
bot = telebot.TeleBot('токен бота')
@bot.message_handler(commands=['start'])
def start(message):
conn = sqlite3.connect('modelsFile.sql')
cur = conn.cursor()
cur.execute('CREATE TABLE IF NOT EXISTS models (id INTEGER PRIMARY KEY AUTOINCREMENT, model VARCHAR(150), promt VARCHAR(200))')
conn.commit()
cur.close()
conn.close()
bot.send_message(message.chat.id, 'Привет, я твой менеджер моделей LoRa и промпту к ним для Stable Diffusion, введи название модели : ')
bot.register_next_step_handler(message, model_model)
def model_model(message):
pass
bot.polling(none_stop=True)
Объяснение изменений:
id INTEGER PRIMARY KEY AUTOINCREMENT:
INTEGER: Объявляет столбец как целочисленный тип.
PRIMARY KEY: Указывает, что этот столбец является первичным ключом.
AUTOINCREMENT: указывает что этот столбец должен автоматически увеличиваться.
VARCHAR(150) and VARCHAR(200):
В SQLite, VARCHAR, TEXT и другие типы строк ведут себя аналогично (за исключением кодировки и порядка сравнения, но это не важно для этой задачи), но рекомендуется использовать заглавные буквы при написании типа, например, VARCHAR (стандарт SQL).
Почему была ошибка:
Ошибка incomplete input возникала, потому что SQLite не понимал синтаксис auto_increment в том месте, где он был указан (в определении столбца id). SQLite ожидает INTEGER PRIMARY KEY AUTOINCREMENT, чтобы создать столбец с автоинкрементом.
Дополнительные советы:
Проверка ошибок: Всегда добавляйте обработку исключений (try...except) при работе с базами данных. Это поможет вам отлавливать ошибки и лучше понимать их причины.
SQL-инъекции: Если будете использовать ввод пользователя в SQL-запросах, используйте параметры и подстановки для избежания SQL-инъекций.
Типы полей: Убедитесь, что типы полей в SQLite3 соответствуют данным, которые вы собираетесь хранить.
Закрытие соединения: Обязательно закрывайте соединение (conn.close()) и курсор (cur.close()) после работы с базой данных.
После исправления ошибки ваш код должен работать правильно и создать таблицу models в базе данных.
import telebot
import sqlite3
bot = telebot.TeleBot('токен бота')
@bot.message_handler(commands=['start'])
def start(message):
conn = sqlite3.connect('modelsFile.sql')
cur = conn.cursor()
cur.execute('CREATE TABLE IF NOT EXISTS models (id int auto_increment primary key, model varchar(150), promt varchar(200)')
conn.commit()
cur.close()
conn.close()
bot.send_message(message.chat.id, 'Привет, я твой менеджер моделей LoRa и промпту к ним для Stable Diffusion, введи название модели : ')
bot.register_next_step_handler(message, model_model)
def model_model(message):
pass
bot.polling(none_stop=True)