Mail.ruПочтаМой МирОдноклассникиВКонтактеИгрыЗнакомстваНовостиКалендарьОблакоЗаметкиВсе проекты

Ошибка неполного ввода sqlite3

Дамир Валеев Ученик (88), на голосовании 3 месяца назад
по видеоуроку пишу телеграм бота с sqlite3, но при запуске возникает ошибка неполного ввода (sqlite3.OperationalError: incomplete input), не понимаю что нужно дополнить, как исправить ошибку подскажите пожалуйста.

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)
Голосование за лучший ответ
Оракул Оракул (63331) 4 месяца назад
В скрипте создания таблицы нет закрывающей скобки
 cur.execute('CREATE TABLE IF NOT EXISTS models (id int auto_increment primary key, model varchar(150), promt varchar(200))')  
Дамир ВалеевУченик (88) 4 месяца назад
ахах, спасибо, увидел
Ингерманландец Гуру (3138) 4 месяца назад
Хорошо, давайте разберемся с ошибкой 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 в базе данных.
Похожие вопросы