#Что происходит и когда возникает
«no such column: имя» после выпуска нового кода обычно означает, что SQL уже использует поле, отсутствующее в фактической таблице. Причиной может оказаться пропущенная миграция, запуск на другой копии базы, опечатка или использование двойных кавычек вместо правильного строкового литерала. Не исправляйте ошибку добавлением поля, пока не выясните, какая именно база используется.
#Возможные причины: как различить
| Возможная причина | Как узнать | Что делать |
|---|---|---|
| Не выполнена миграцияКод уже ожидает столбец, но его ещё нет в базе данного окружения. | PRAGMA table_info показывает старую схему; в реестре миграций новая версия не отмечена. | Запустить штатную согласованную миграцию после копии. |
| Приложение открыло другую базуОтносительный путь создаёт или открывает тестовую/пустую базу в другом каталоге. | PRAGMA database_list показывает неожиданный путь; у другой базы схема полная. | Указать правильный абсолютный путь и проверить владельца данных. |
| Опечатка или неверная ссылка на алиасНазвания колонок или алиасов различаются между кодом и схемой. | Поле присутствует под другим именем либо только в другой таблице. | Исправить запрос, не меняя структуру базы. |
#Пошаговая диагностика и исправление
- Зафиксируйте точный столбец и момент появленияПри новом выпуске приложения найдите в журнале точное «no such column: …», имя таблицы и SQL без секретов. Запишите, в каком действии возникает сбой: чтение, вставка или отчёт. Если ошибка появилась после переноса сервера, сначала исключите открытие не той базы.
- Определите открытый файл базыОткройте SQLite-клиент приложения на том же соединении и выполните PRAGMA database_list;. Для базы main появится путь к действительному файлу, если она файловая; у базы :memory: может не быть пути. Сравните с настройками приложения. Не создавайте новый пустой файл с похожим именем.
- Посмотрите реальный список столбцовЧерез sqlite3 или поддерживаемую SQL-панель выполните PRAGMA table_info(orders); для соответствующей таблицы (orders — пример). В ответе есть имя каждого столбца и его тип. Если таблицы нет вообще, ищите ошибку подключения или отдельную отсутствующую миграцию; если столбец уже есть, переходите к проверке SQL.
- Сверьте историю миграций и кодОткройте каталог миграций проекта или журнал его штатного мигратора. Найдите изменение, которое добавляет нужное поле, проверьте требования версии приложения, ограничения NOT NULL и значения по умолчанию. Не запускайте миграции вслепую на единственном экземпляре базы.
- Создайте проверенную резервную копиюПеред правкой структуры используйте .backup в sqlite3 или Online Backup API; сохраните копию с новым именем и запустите на ней PRAGMA integrity_check;. Результат ok подтверждает отсутствие найденных структурных повреждений, но отдельно проверьте нужные данные. Без подтверждённой копии изменение схемы не выполняйте.
- Выполните правильную миграцию в копииЕсли действительно не хватает нового необязательного поля, для учебной таблицы допустим ALTER TABLE ... ADD COLUMN; пример ниже работает на отдельной базе и не исправляет произвольную схему. Для NOT NULL, индексов, внешних ключей и сложных ограничений используйте миграцию самого проекта, а не пример. При ошибке SQLite откатите транзакцию, сохраните журнал.
- Проверьте запрос и верните приложение в работуПовторите PRAGMA table_info, затем ранее падавший SELECT в тестовой базе. Убедитесь, что запись и чтение проходят без «no such column». Если исправляли путь к базе, перезапустите только нужный компонент по его регламенту и проверьте данные. При неудачной миграции остановите развертывание, верните код к прежней версии и согласованно восстановите проверенную копию.
#Команды и проверочные примеры
PRAGMA database_list;PRAGMA table_info(orders);CREATE TABLE orders(id INTEGER PRIMARY KEY, amount INTEGER);
ALTER TABLE orders ADD COLUMN tracking_code TEXT;
SELECT id, tracking_code FROM orders;#Как проверить результат
PRAGMA table_info показывает требуемое поле в правильной базе, обновлённое приложение успешно выполняет запрос, а контрольные строки сохранились. Повторите проверку после перезапуска приложения, чтобы исключить работу с другой копией файла.
#Если не помогло
Если столбец уже существует, проверьте реальный SQL: алиасы таблиц, кавычки, версию подготавливаемого запроса и возможный кэш схемы внутри приложения. При сложной миграции передайте дамп схемы и журнал мигратора разработчику вместо ручной правки.