SQLite CLI (sqlite3)
Разработчики SQLite, компания Hwaci · лицензия Общественное достояние
Открывает файл базы SQLite приложения или сайта: агент смотрит и правит таблицы, выгружает их в CSV и загружает обратно, снимает копию базы и проверяет её целостность.
✓ Проверено 17.10.2026: Ubuntu 24.04 (x86_64) в одноразовом контейнере Docker на сервере, от root, Python 3 из образа: sqlite3 3.54.1 из архива sqlite-tools-linux-x64 со страницы загрузки sqlite.org и пакет Ubuntu sqlite3 3.45.1. Что именно проверяли
Какую задачу решает
Консольная программа для баз SQLite от разработчиков самой SQLite. База SQLite - это один файл, например app.db. Агент открывает его через sqlite3, выполняет запросы SQL, выгружает таблицу в CSV, загружает правки обратно и снимает копию базы перед изменениями.
- Выполняет запрос SQL одной командой: sqlite3 app.db "SELECT ..." печатает ответ и завершается, поэтому агент работает с базой из обычного скрипта.
- Выгружает таблицу в CSV (-header -csv) и загружает CSV в таблицу (.import --csv). В прогоне поля с запятыми, кавычками и переносом строки прошли туда и обратно без потерь.
- Снимает копию базы (.backup), проверяет целостность (PRAGMA integrity_check) и выводит всю базу текстом SQL (.dump) для восстановления. В прогоне у базы, собранной из .dump, совпали число строк и сумма количества.
- Открывает базу только для чтения (-readonly). Режим --safe по документации отключает .shell, .system, ATTACH, .import, .backup, readfile() и writefile(). Править саму базу в этом режиме можно.
Пример результата
Говоришь агенту
Сделай копию базы app.db и проверь её целостность. Потом выгрузи таблицу items в CSV, я поправлю количество, и загрузи мои правки обратно. Скажи, сколько строк поменялось.
Что получится
Мы прогнали этот сценарий на тестовой базе из 1000 строк. Команда .backup сняла копию app-copy.db, PRAGMA integrity_check ответила ok. Выгрузка -header -csv дала 1000 записей и строку заголовка, у 20 записей в заметке был перенос строки. В CSV поменяли количество у 7 строк, .import --csv --skip 1 загрузил файл в таблицу с теми же столбцами, а UPDATE перенёс правки в items. Функция changes() вернула 7, сверка с копией через ATTACH тоже нашла 7 отличий, повторная проверка целостности снова ответила ok.
Паспорт
- Кто делает
- Разработчики SQLite, компания Hwaci
- Сайт
- sqlite.org
- Исходный код
- github.com/sqlite/sqlite
- Инструкция
- sqlite.org/cli.html
- Лицензия
- Общественное достояние
- Версия
- 3.54.1 на 17.10.2026
- Системы
- macOS · Windows · Linux
- Где работает
- На компьютере, на сервере и в контейнере
- Цена
- Бесплатно
- Проверка
- Проверено 17.10
Установить агентом
Установи программу «SQLite CLI (sqlite3)». Работай по шагам и после каждого коротко говори, что сделал.
Что это за программа (каталог smyslokod.ru, официальные источники сверены 17.10.2026):
- официальный сайт: https://sqlite.org
- исходный код: https://github.com/sqlite/sqlite
- инструкция по установке: https://sqlite.org/cli.html
- актуальная версия на 17.10.2026: 3.54.1
- лицензия: Общественное достояние
- для работы нужно (в отдельных случаях): unzip - только для установки архивом на Linux: архив упакован в zip
- для работы нужно (в отдельных случаях): Homebrew - только для установки на Mac через brew
Правила:
1. Ничего не устанавливай и не меняй, пока я не скажу «да» на твой план.
2. Ставь только способами из этого промпта. Сторонние сборки, скрипты с форумов и из чужих репозиториев не бери.
3. Мои проекты не трогай: не меняй их файлы, виртуальные окружения и списки зависимостей (package.json, requirements.txt, pyproject.toml).
4. Команды с sudo, правку профиля оболочки (~/.zshrc, ~/.bashrc) и переменной PATH делай только после моего отдельного «да» на каждую.
5. Не проси у меня пароли и ключи и не выводи их. Если нужен пароль администратора, дай команду, я выполню её сам.
6. Перед любой записью в базу сними копию командой .backup рядом с ней, покажи человеку, какие строки поменяются (тот же запрос через SELECT), и жди «да».
7. Чтобы только посмотреть данные, открывай базу с ключом -readonly. Скрипт SQL, который написал не ты, запускай только на копии базы в отдельной папке или песочнице, с ключом --safe и без --nonce. Ключ отключает .shell, ATTACH, .import, readfile() и writefile(), а саму базу скрипт всё равно может изменить.
8. Через .read, .import и readfile() читай только файлы из папки задачи. Файлы с ключами и паролями открывай только после отдельного «да» человека.
9. Перед открытием проверь, что файл базы существует: при опечатке в имени sqlite3 создаёт новый пустой файл.
10. Если база принадлежит работающему приложению, спроси человека, можно ли писать в неё сейчас. Ошибку «database is locked» не обходи удалением файлов -journal и -wal.
Шаги:
0. Определи, где ты работаешь: мой компьютер, сервер или контейнер. Какая система и процессор, какие менеджеры пакетов есть (Homebrew, apt, winget, uv, pipx). Ставить нужно туда, где ты сам запускаешь команды.
- на компьютере: там, где лежит файл базы приложения или сайта.
- на сервере: работает в терминале без окон. Базу, с которой в этот момент работает приложение, лучше сначала скопировать командой .backup.
- в контейнере: мы проверяли в контейнере Ubuntu 24.04 от root: скачивание и распаковка архива заняли 2,4 секунды.
1. Проверь, не стоит ли программа уже: sqlite3 --version. Если стоит и запускается, ничего не ставь и переходи к шагу 5.
2. Обязательных зависимостей у программы нет, то, что нужно в отдельных случаях, перечислено выше. Проверь свободное место на диске: нужно Архив для Linux x86-64 весит 4 324 601 байт. Распакованные четыре программы заняли 8 527 048 байт, из них sqlite3 - 2 037 360 байт. Сама база занимает столько, сколько в ней данных: тестовая на 1000 строк весила 81 920 байт..
3. Составь план: каким одним способом из списка ниже будешь ставить, что появится на диске и сколько места займёт, что поменяется в системе и как потом удалить. Покажи план и жди моего «да».
Способы из официальных источников:
- macOS, Homebrew: brew install sqlite (Формула keg-only: в macOS уже есть своя sqlite3, поэтому brew не кладёт новую в PATH. Путь к ней показывает brew info sqlite. На 17.10.2026 формула ставила 3.54.0. Мы её не проверяли)
- macOS, архив со страницы загрузки sqlite.org: curl -LO https://sqlite.org/2026/sqlite-tools-osx-arm64-3540100.zip && mkdir -p ~/.local/bin && unzip -o sqlite-tools-osx-arm64-3540100.zip -d ~/.local/bin && xattr -d com.apple.quarantine ~/.local/bin/sqlite3 (Архив для Apple Silicon, для Mac на Intel на той же странице лежит osx-x64. Файлы без подписи, и страница загрузки велит снять с них карантин командой xattr. Мы не проверяли)
- Windows, архив со страницы загрузки sqlite.org: Invoke-WebRequest https://sqlite.org/2026/sqlite-tools-win-x64-3540100.zip -OutFile sqlite-tools.zip; Expand-Archive sqlite-tools.zip -DestinationPath $env:LOCALAPPDATA\sqlite (Архив для Windows x64 весит 6 984 432 байт, для ARM64 есть отдельный. Папку нужно добавить в PATH или запускать sqlite3.exe по полному пути. На Windows мы не проверяли)
- Linux, архив со страницы загрузки sqlite.org: curl -LO https://sqlite.org/2026/sqlite-tools-linux-x64-3540100.zip && mkdir -p ~/.local/bin && unzip -o sqlite-tools-linux-x64-3540100.zip -d ~/.local/bin (Архив 4 324 601 байт, сумма SHA3-256 указана рядом с файлом на странице загрузки. В нём четыре программы: sqlite3, sqldiff, sqlite3_analyzer и sqlite3_rsync. Папка ~/.local/bin должна быть в PATH, sudo не нужен. Мы ставили так и сверили сумму)
- Linux, apt (пакет Ubuntu sqlite3): sudo apt-get install sqlite3 (apt ставит версию из репозитория системы. В Ubuntu 24.04 мы получили 3.45.1 от января 2024 года)
4. Установи по согласованному плану. Если что-то идёт не так, как в плане, остановись и спроси.
5. Проверь результат:
- sqlite3 --version: программа запускается без ошибки;
- Во временной папке создай тестовую базу app.db с таблицей items на 1000 строк, у части строк в тексте запятые, кавычки и перенос строки. Сними копию .backup, проверь целостность, выгрузи таблицу в CSV, поменяй количество у 7 строк, загрузи CSV в таблицу с теми же столбцами и перенеси правки через UPDATE. Сверь число изменённых строк с копией, проверь целостность снова, собери базу заново из .dump и сравни итоги. Делай это во временной папке и не трогай мои файлы.
cd /tmp && curl -LO https://sqlite.org/2026/sqlite-tools-linux-x64-3540100.zip
cd /tmp && python3 -c "import hashlib; h=hashlib.sha3_256(open('sqlite-tools-linux-x64-3540100.zip','rb').read()).hexdigest(); print(h); assert h=='555635de98534d87a67ee2e6e1b0d79f494b1b33b223477d3e7a8ea0c66e416f'"
cd /tmp && mkdir -p ~/.local/bin && unzip -o sqlite-tools-linux-x64-3540100.zip -d ~/.local/bin && export PATH=$HOME/.local/bin:$PATH && sqlite3 --version
mkdir -p /work/app && cd /work/app && python3 -c "import sqlite3,random; random.seed(7); c=sqlite3.connect('app.db'); c.execute('CREATE TABLE items(id INTEGER PRIMARY KEY, title TEXT NOT NULL, qty INTEGER NOT NULL, note TEXT)'); c.execute('CREATE INDEX items_title ON items(title)'); c.executemany('INSERT INTO items VALUES (?,?,?,?)', [(i,'Позиция %04d'%i,random.randint(0,500),'запятая, \"кавычки\" и\nперенос строки' if i%50==0 else ('тестовая запись '+str(i) if i%7==0 else None)) for i in range(1,1001)]); c.commit()"
export PATH=$HOME/.local/bin:$PATH && cd /work/app && sqlite3 app.db ".backup app-copy.db" && sqlite3 app.db "PRAGMA integrity_check;"
export PATH=$HOME/.local/bin:$PATH && cd /work/app && sqlite3 -header -csv app.db "SELECT * FROM items ORDER BY id;" > items.csv
cd /work/app && python3 -c "import csv; r=list(csv.reader(open('items.csv',newline='',encoding='utf-8'))); [x.__setitem__(2,str(int(x[2])+1)) for x in r[1:] if int(x[0]) in (3,14,159,265,358,979,1000)]; csv.writer(open('items-fixed.csv','w',newline='',encoding='utf-8')).writerows(r)"
export PATH=$HOME/.local/bin:$PATH && cd /work/app && sqlite3 app.db ".import --csv items-fixed.csv items_fixed" && sqlite3 app.db "PRAGMA table_info(items_fixed);"
export PATH=$HOME/.local/bin:$PATH && cd /work/app && sqlite3 app.db "CREATE TABLE items_new(id INTEGER PRIMARY KEY, title TEXT NOT NULL, qty INTEGER NOT NULL, note TEXT);" && sqlite3 app.db ".import --csv --skip 1 items-fixed.csv items_new" && sqlite3 app.db "SELECT typeof(qty), count(*) FROM items_new GROUP BY 1;"
export PATH=$HOME/.local/bin:$PATH && cd /work/app && sqlite3 app.db "SELECT count(*) FROM items i JOIN items_new n ON n.id = i.id WHERE n.qty <> i.qty;"
export PATH=$HOME/.local/bin:$PATH && cd /work/app && sqlite3 app.db "UPDATE items SET qty = n.qty FROM items_new n WHERE n.id = items.id AND n.qty <> items.qty; SELECT changes();"
export PATH=$HOME/.local/bin:$PATH && cd /work/app && sqlite3 app.db "ATTACH 'app-copy.db' AS old; SELECT count(*) FROM items i JOIN old.items o ON o.id = i.id WHERE o.qty <> i.qty;"
export PATH=$HOME/.local/bin:$PATH && cd /work/app && sqlite3 app.db "DROP TABLE items_fixed; DROP TABLE items_new; PRAGMA integrity_check;"
export PATH=$HOME/.local/bin:$PATH && cd /work/app && sqlite3 app.db .dump > dump.sql && sqlite3 restored.db < dump.sql && sqlite3 restored.db "SELECT count(*), sum(qty) FROM items;" && sqlite3 app.db "SELECT count(*), sum(qty) FROM items;"
export PATH=$HOME/.local/bin:$PATH && cd /work/app && cp app.db ro-test.db && sqlite3 -readonly ro-test.db "DELETE FROM items;"; echo $?; sqlite3 ro-test.db "SELECT count(*) FROM items;"
export PATH=$HOME/.local/bin:$PATH && cd /work/app && sqlite3 --safe app.db ".shell echo shell-ran"; echo $?; sqlite3 --safe app.db "SELECT writefile('/work/app/w.txt','x');"; echo $?; test -e /work/app/w.txt || echo no-file
export PATH=$HOME/.local/bin:$PATH && cd /work/app && sqlite3 ap.db "SELECT count(*) FROM items;"; echo $?; ls -l ap.db; echo 'not a database' > notdb.db && sqlite3 notdb.db "SELECT 1;"; echo $?
export PATH=$HOME/.local/bin:$PATH; cd /work/app || exit 1; python3 -c "import sqlite3,time; c=sqlite3.connect('app.db',isolation_level=None); c.execute('BEGIN IMMEDIATE'); c.execute('UPDATE items SET qty=qty WHERE id=1'); time.sleep(3); c.execute('COMMIT')" & pid=$!; sleep 1; sqlite3 app.db "UPDATE items SET note='lock test' WHERE id=2;"; echo $?; sqlite3 -cmd ".timeout 10000" app.db "UPDATE items SET note='lock test' WHERE id=2; SELECT changes();"; wait $pid
apt-get update && apt-get -y install sqlite3 && /usr/bin/sqlite3 --version && apt-get -y purge sqlite3
rm -f ~/.local/bin/sqlite3 ~/.local/bin/sqldiff ~/.local/bin/sqlite3_analyzer ~/.local/bin/sqlite3_rsync && hash -r && command -v sqlite3 || echo removed
- если ты работаешь в папке моего проекта, покажи git status: от установки в проекте не должно появиться изменений.
6. Итог одним сообщением: что установлено, какой версии и куда, сколько места заняло, что поменялось в системе и как всё удалить (macOS, Homebrew: brew uninstall sqlite; macOS и Linux, архив со страницы загрузки sqlite.org: rm -f ~/.local/bin/sqlite3 ~/.local/bin/sqldiff ~/.local/bin/sqlite3_analyzer ~/.local/bin/sqlite3_rsync; Windows, архив со страницы загрузки sqlite.org: Remove-Item -Recurse $env:LOCALAPPDATA\sqlite; Linux, apt (пакет Ubuntu sqlite3): sudo apt-get purge sqlite3).
Если на любом шаге ошибка, не чини наугад: покажи текст ошибки и скажи, что, по-твоему, случилось. Частые проблемы: https://smyslokod.ru/cli/sqlite3#problemyПромпт собран из официальных инструкций, сверенных 17.10.2026. Агент сначала проверит, что уже стоит, покажет план с местом на диске и способом удаления и без твоего «да» ничего не поставит.
Как ставят вручную
Способы из официальных источников, у каждого ссылка на первоисточник.
macOS · Homebrew · источник
brew install sqlite
Формула keg-only: в macOS уже есть своя sqlite3, поэтому brew не кладёт новую в PATH. Путь к ней показывает brew info sqlite. На 17.10.2026 формула ставила 3.54.0. Мы её не проверяли
macOS · архив со страницы загрузки sqlite.org · источник
curl -LO https://sqlite.org/2026/sqlite-tools-osx-arm64-3540100.zip && mkdir -p ~/.local/bin && unzip -o sqlite-tools-osx-arm64-3540100.zip -d ~/.local/bin && xattr -d com.apple.quarantine ~/.local/bin/sqlite3
Архив для Apple Silicon, для Mac на Intel на той же странице лежит osx-x64. Файлы без подписи, и страница загрузки велит снять с них карантин командой xattr. Мы не проверяли
Windows · архив со страницы загрузки sqlite.org · источник
Invoke-WebRequest https://sqlite.org/2026/sqlite-tools-win-x64-3540100.zip -OutFile sqlite-tools.zip; Expand-Archive sqlite-tools.zip -DestinationPath $env:LOCALAPPDATA\sqlite
Архив для Windows x64 весит 6 984 432 байт, для ARM64 есть отдельный. Папку нужно добавить в PATH или запускать sqlite3.exe по полному пути. На Windows мы не проверяли
Linux · архив со страницы загрузки sqlite.org · источник
curl -LO https://sqlite.org/2026/sqlite-tools-linux-x64-3540100.zip && mkdir -p ~/.local/bin && unzip -o sqlite-tools-linux-x64-3540100.zip -d ~/.local/bin
Архив 4 324 601 байт, сумма SHA3-256 указана рядом с файлом на странице загрузки. В нём четыре программы: sqlite3, sqldiff, sqlite3_analyzer и sqlite3_rsync. Папка ~/.local/bin должна быть в PATH, sudo не нужен. Мы ставили так и сверили сумму
Linux · apt (пакет Ubuntu sqlite3) · источник
sudo apt-get install sqlite3
apt ставит версию из репозитория системы. В Ubuntu 24.04 мы получили 3.45.1 от января 2024 года
Как удалить
- macOS, Homebrew:
brew uninstall sqlite - macOS и Linux, архив со страницы загрузки sqlite.org:
rm -f ~/.local/bin/sqlite3 ~/.local/bin/sqldiff ~/.local/bin/sqlite3_analyzer ~/.local/bin/sqlite3_rsync - Windows, архив со страницы загрузки sqlite.org:
Remove-Item -Recurse $env:LOCALAPPDATA\sqlite - Linux, apt (пакет Ubuntu sqlite3):
sudo apt-get purge sqlite3
Что нужно для работы
- unzip (в отдельных случаях) - только для установки архивом на Linux: архив упакован в zip
- Homebrew (в отдельных случаях) - только для установки на Mac через brew
Системы
- macOS - архивы для Mac на Apple Silicon и на Intel есть на странице загрузки, ещё есть формула Homebrew. В macOS уже стоит своя sqlite3. На Mac мы не проверяли.
- Windows - архив для Windows x64 и ARM64 на странице загрузки. На Windows мы не проверяли.
- Linux - мы проверяли на Ubuntu 24.04 x86-64 архив со страницы загрузки и пакет sqlite3 из Ubuntu. Готовый архив для Linux есть только под x86-64.
Где запускать
Ставить нужно туда, где работает агент: на твой компьютер, сервер или в контейнер.
- На компьютере - там, где лежит файл базы приложения или сайта.
- На сервере - работает в терминале без окон. Базу, с которой в этот момент работает приложение, лучше сначала скопировать командой .backup.
- В контейнере - мы проверяли в контейнере Ubuntu 24.04 от root: скачивание и распаковка архива заняли 2,4 секунды.
Сколько ресурсов нужно
- Место на диске
- Архив для Linux x86-64 весит 4 324 601 байт. Распакованные четыре программы заняли 8 527 048 байт, из них sqlite3 - 2 037 360 байт. Сама база занимает столько, сколько в ней данных: тестовая на 1000 строк весила 81 920 байт.
- Память
- Отдельно не мерили.
- Сеть
- Для работы с базой сеть не нужна: в прогоне все команды задачи не открыли ни одного соединения. Скачивание архива шло к sqlite.org (194.195.208.62 и 2600:3c02::f03c:95ff:fe07:695). Команда apt-get update ходила к archive.ubuntu.com, security.ubuntu.com и deb.nodesource.com. Последний - источник Node.js в образе нашей песочницы, к sqlite3 он отношения не имеет. Установка пакета sqlite3 обращалась только к адресам Ubuntu. Плюс DNS контейнера 127.0.0.11. Доступ из России мы не проверяли.
Вся задача из примера (копия, выгрузка, загрузка, правка, сверка и сборка из .dump) на базе из 1000 строк заняла 567 мс.
Лицензия и платные замены
Лицензия Общественное достояние. Авторы передали код и документацию SQLite в общественное достояние: копировать, менять, продавать и встраивать можно для любых целей, лицензия не нужна. Если компании нужен юридический документ о праве пользоваться SQLite, Hwaci продаёт его отдельно (Warranty of Title). Текст лицензии
Цена: Бесплатно. Программа бесплатная, код в общественном достоянии.
Платные замены
Платную замену мы не указываем: sqlite3 - официальная бесплатная программа разработчиков SQLite.
Бесплатные замены
- DuckDB - Консольная программа для расчётов SQL по выгрузкам, в каталоге у неё своя карточка. Для правки базы SQLite приложения мы её не проверяли.
- Модуль sqlite3 в Python - Работа с той же базой из кода на Python, модуль входит в стандартную библиотеку. В прогоне им создавали тестовую базу и сверяли результат.
О чём помнить
- Безопасность. Агент запускает sqlite3 в терминале сам (exec). Команды .shell и .system внутри sqlite3 запускают любую программу с правами пользователя, это тоже exec: в прогоне .shell echo выполнилась. Кроме базы, через .read, .import и функцию readfile() sqlite3 читает любой файл, путь к которому укажет агент, если у пользователя есть на него права, в том числе файл с ключами (read). Команды .backup, .output, .once, .dump с перенаправлением и функция writefile() пишут файлы по пути, который задаёт агент (write): в прогоне writefile() создала файл. Необратимые действия (acts) тоже есть: DELETE, DROP TABLE и UPDATE без явной транзакции (BEGIN) по документации фиксируются, как только команда закончилась, и корзины у базы нет. Внутри BEGIN правку до COMMIT можно отменить через ROLLBACK. Команда .open --new по документации стирает базу без вопроса. Запись в базу запрещает ключ -readonly. Ключ --safe по документации отключает .shell, .system, ATTACH, .import, .backup, .output, readfile() и writefile(). UPDATE, DELETE и DROP в самой базе он пропускает. В прогоне под --safe отказали .shell и writefile(). Полной изоляции файлов ключ не даёт. Перенаправление вывода оболочкой (sqlite3 --safe app.db .dump > dump.sql) работает и с ним. По документации ключ --nonce вместе с командой .nonce с тем же значением снимает запрет для следующей команды, и документация называет такой обход опасным. Входа в учётные записи и ключей sqlite3 не просит.
- Если файла базы нет, sqlite3 создаёт новый. В прогоне опечатка в имени (ap.db вместо app.db) дала ошибку «no such table: items» и пустой файл ap.db размером 0 байт.
- Если другая программа держит блокировку записи, правка базы может завершиться ошибкой «database is locked». В прогоне UPDATE без ожидания сразу вернул код 1. Команда с -cmd ".timeout 10000" дождалась конца чужой записи за 2,9 секунды и выполнилась.
- .import в таблицу, которой ещё нет, создаёт её по первой строке CSV, и в прогоне у всех столбцов тип оказался пустым. Чтобы числа легли числами, создай таблицу с типами заранее и загружай с --skip 1, тогда заголовок CSV не станет строкой данных.
- В macOS уже есть своя sqlite3, а пакет sqlite3 в Ubuntu 24.04 даёт 3.45.1 от 2024 года. Проверь версию командой sqlite3 --version, прежде чем пользоваться новыми возможностями из документации.
- В выпуске 3.54.0 программу sqlite3_analyzer объявили устаревшей, её заменяет команда .diskused. В архиве она пока лежит.
Частые проблемы
Error: database is locked
Другая программа, например само приложение, держит блокировку, которая мешает этой команде. Ожидание по умолчанию не включено: в прогоне UPDATE сразу завершился с кодом 1. Повтори с ожиданием: sqlite3 -cmd ".timeout 10000" app.db "...". В прогоне так команда дождалась чужой записи и выполнилась.
attempt to write a readonly database
База открыта с ключом -readonly, или у пользователя нет права на запись в файл или папку. Если правка нужна и человек сказал «да», открой базу без -readonly. Если ключа нет, проверь права командой ls -l на файл и его папку.
file is not a database (26)
sqlite3 открыла файл другого формата: текст, архив или испорченную базу. Проверь, тот ли файл открыт. Первые байты базы SQLite - строка «SQLite format 3», её видно командой head -c 16 файл.
no such table: items, хотя таблица точно есть
Опечатка в имени файла базы: sqlite3 создал новый пустой файл и ищет таблицу в нём. Проверь путь к базе, удали появившийся пустой файл и повтори с правильным именем.
Проверка
✓ Проверено 17.10.2026: Ubuntu 24.04 (x86_64) в одноразовом контейнере Docker на сервере, от root, Python 3 из образа: sqlite3 3.54.1 из архива sqlite-tools-linux-x64 со страницы загрузки sqlite.org и пакет Ubuntu sqlite3 3.45.1.
- Когда
- 17.10.2026
- Среда
- Ubuntu 24.04 (x86_64) в одноразовом контейнере Docker на сервере, от root, Python 3 из образа: sqlite3 3.54.1 из архива sqlite-tools-linux-x64 со страницы загрузки sqlite.org и пакет Ubuntu sqlite3 3.45.1
- Объём
- Установили и прогнали задачу на тестовых данных
- Что именно сделали
- Одноразовый контейнер Ubuntu 24.04 без данных и ключей, sqlite3 в нём не было. Архив sqlite-tools-linux-x64-3540100.zip скачали с sqlite.org, сумма SHA3-256 совпала с указанной на странице загрузки. Команда unzip -o распаковала четыре программы в ~/.local/bin, на скачивание и распаковку ушло 2,4 секунды. sqlite3 --version вывела 3.54.1 2026-10-16.
- Скрипт сам создал тестовую базу app.db: таблица items на 1000 строк с номером, названием, количеством и заметкой. У каждой 50-й строки в заметке были запятая, кавычки и перенос строки.
- sqlite3 app.db ".backup app-copy.db" сняла копию, она совпала с базой построчно. PRAGMA integrity_check ответила ok. sqlite3 -header -csv app.db "SELECT * FROM items ORDER BY id;" > items.csv дала 1000 записей и строку заголовка. Все поля, включая 20 заметок с переносом строки, совпали с базой.
- Скрипт на Python поменял количество у 7 строк в CSV и сохранил items-fixed.csv. Команда .import --csv в новую таблицу создала столбцы без типа. Тогда создали таблицу items_new с теми же столбцами и типами и загрузили файл командой .import --csv --skip 1 items-fixed.csv items_new: количество у всех 1000 строк легло числом.
- UPDATE items SET qty = n.qty FROM items_new n ... перенёс правки, changes() вернула 7. Сверка с копией через ATTACH 'app-copy.db' AS old нашла те же 7 отличий. После DROP вспомогательных таблиц integrity_check снова ответила ok. База, собранная из .dump, дала те же 1000 строк и ту же сумму количества 243490. Python отдельно проверил, что поменялись ровно 7 строк. Все команды задачи шли под записью соединений и не открыли ни одного, на всё ушло 567 мс.
- Защита: sqlite3 -readonly отказалась удалять строки с ошибкой attempt to write a readonly database, строк осталось 1000. С --safe команда .shell и функция writefile() завершились ошибкой, файл не появился. Без --safe обе сработали.
- Ошибки: опечатка ap.db вместо app.db дала no such table: items и пустой файл ap.db размером 0 байт. Текстовый файл вместо базы дал file is not a database. Пока другая программа держала запись 3 секунды, sqlite3 сразу ответила database is locked с кодом 1, а с -cmd ".timeout 10000" дождалась и выполнила правку.
- Удаление и другой способ: apt-get install sqlite3 поставила из Ubuntu 3.45.1, apt-get purge sqlite3 её убрала. Четыре файла архива удалили из ~/.local/bin, после hash -r команды sqlite3 в системе не осталось. Все проверки скрипт сделал сам и только после них напечатал TASK_OK.
| Дата | Версия | Объём | Где | Итог |
|---|---|---|---|---|
| 17.10.2026 | 3.54.1 | задача | контейнер, Linux | получилось |
| 17.10.2026 | 3.54.1 | задача | контейнер, Linux | получилось |
«Проверено» ставим, только когда сами поставили программу и прогнали её на задаче. Сверка ссылок и вывод версии так не называются.
Похожие программы
- DuckDBСчитает итоги по таблицам в CSV, Excel и Parquet запросом SQL, без отдельного сервера базы данных. Агент сводит выгрузки и сохраняет результат в Excel или CSV.
- MillerСводит, фильтрует и соединяет выгрузки CSV, TSV и JSON одной командой. Агент посчитает итоги по группам, уберёт повторы, разрежет таблицу на файлы и переведёт её в JSON или Markdown.
Программу делают её авторы. Мы сверяем официальные источники и описываем, что ей нужно, но код остаётся чужим. Перед установкой посмотри план агента: что он поставит и что поменяет в системе.