Ошибка `sqlite3.OperationalError`, указывающая на то, что отсутствует столбец с именем, похоже на то, что вы пытаетесь вставить данные в таблицу с некорректной подготовкой SQL-запроса. В вашем коде есть несколько моментов, которые могут вызывать эту ошибку.
1. **Неправильная вставка строк**: Варусе при формировании строкового запроса вы не экранируете значение `caption`, что может привести к ошибкам, если текст содержит специальные символы или пробелы. Лучше использовать параметризацию для всех параметров.
2. **Проблемы со структурой таблицы**: Убедитесь, что столбцы, в которые вы пытаетесь вставить данные, действительно существуют в таблице `posts`. Если вы добавляете другие столбцы, возможно, они не были правильно созданы.
Исправленный запрос может выглядеть следующим образом:
```python
async def create_post(tg_id: int, caption: str, media_id=''):
if not media_id:
# Используем параметризацию для безопасности и предотвращения SQL-инъекций
cur.execute('INSERT INTO posts(tg_id, caption) VALUES(?, ?)', (tg_id, caption))
else:
cur.execute('INSERT INTO posts(tg_id, media_id, caption) VALUES(?, ?, ?)', (tg_id, media_id, caption))
db.commit()
```
### Советы по устранению проблем:
1. **Проверка структуры таблицы**: Проверьте, что в таблице `posts` действительно существуют столбцы `tg_id`, `caption` и `media_id`.
```sql
PRAGMA table_info(posts);
```
2. **Логирование**: Для удобства отладки вы можете добавить логирование значений переменных, которые вы вставляете, чтобы убедиться, что они корректны.
3. **Обработка исключений**: Оберните ваш код с запросами в конструкцию `try-except`, чтобы получить более подробную информацию об ошибках.
```python
try:
if not media_id:
cur.execute('INSERT INTO posts(tg_id, caption) VALUES(?, ?)', (tg_id, caption))
else:
cur.execute('INSERT INTO posts(tg_id, media_id, caption) VALUES(?, ?, ?)', (tg_id, media_id, caption))
db.commit()
except sqlite3.OperationalError as e:
print(f"Ошибка выполнения SQL-запроса: {e}")
```
Эти шаги должны помочь вам диагностировать и исправить проблему.