RussianLDP Рейтинг@Mail.ru
WebMoney: 
WMZ Z294115950220 
WMR R409981405661 
WME E134003968233 
Visa 
4274 3200 2453 6495 

Small. Fast. Reliable.
Choose any three.

Frequently Asked Questions

Как я создаю поле AUTOINCREMENT?

Короткий ответ: колонка, объявленная INTEGER PRIMARY KEY, будет autoincrement.

Более длинный ответ: Если вы объявляете, что колонка таблицы INTEGER PRIMARY KEY, то каждый раз, когда вы вставляете NULL в ту колонку таблицы, NULL автоматически преобразовывается в целое число, которое является на единицу больше, чем самое большое значение той колонки по всем другим строкам в таблице или 1, если таблица пуста. Или, если самый большой существующий ключ целого числа 9223372036854775807 используется, неиспользованное значение ключа выбрано наугад. Например, предположите, что у вас есть таблица:

CREATE TABLE t1(a INTEGER PRIMARY KEY, b INTEGER);

С этой таблицей запрос

INSERT INTO t1 VALUES(NULL,123);

логически эквивалентен высказыванию:

INSERT INTO t1 VALUES((SELECT max(a) FROM t1)+1,123);

Есть функция, названная sqlite3_last_insert_rowid(), которая возвратит ключ целого числа для новой операции по вставке.

Обратите внимание на то, что ключ целого числа на единицу больше, чем самый большой ключ, который был в таблице до вставки. Новый ключ в настоящее время будет уникален по всем ключам в таблице, но это могло бы наложиться с ключами, которые были ранее удалены из таблицы. Чтобы создать ключи, которые уникальны по целой жизни таблицы, добавьте ключевое слово AUTOINCREMENT в определение INTEGER PRIMARY KEY. Тогда выбранный ключ будет на единицу больше, чем самый большой ключ, который когда-либо существовал в таблице. Если самый большой ключ ранее существовал в таблице, INSERT потерпит неудачу с кодом ошибки SQLITE_FULL.

(2)Какие типы данных поддерживает SQLite?

SQLite применяет динамическую типизацию . Содержание может быть сохранено как INTEGER, REAL, TEXT, BLOB или NULL.

(3) SQLite позволяет мне вставить последовательность в колонку базы данных целого числа!

Это особенность, а не ошибка. SQLite использует динамический контроль типов. Это не проводит в жизнь ограничения типа данных. Данные любого типа могут (обычно) вставляться в любую колонку. Можно поместить последовательности произвольной длины в колонки целого числа, числа с плавающей точкой в булевых колонках или даты в колонках символов. Тип данных , который вы назначаете на колонку в команде CREATE TABLE, не ограничивает, какие данные могут быть помещены в ту колонку. Каждая колонка в состоянии хранить строку произвольной длины. Есть одно исключение: Колонки типа INTEGER PRIMARY KEY могут хранить только 64-битное целое число со знаком. Ошибка происходит при попытке поместить что-нибудь кроме целого числа в столбец INTEGER PRIMARY KEY.

Но SQLite действительно использует заявленный тип колонки как намек, что вы предпочитаете значения в том формате. Так, например, если колонка будет иметь тип INTEGER, и вы пытаетесь вставить последовательность в ту колонку, SQLite попытается преобразовать последовательность в целое число. Если это возможно, это вставит целое число вместо этого. В противном случае это вставляет последовательность. Эту особенность называют близостью типа.

(4)Почему SQLite, позволяют мне использовать '0' и '0.0' как первичный ключ на двух различных строках той же таблицы?

Эта проблема происходит, когда ваш первичный ключ числовой тип. Измените тип данных своего первичного ключа к TEXT, и это должно работать.

У каждой строки должен быть уникальный первичный ключ. Для колонки с числовым типом SQLite думает, что '0' и '0.0' то же самое, потому что они выдерживают сравнение равенства друг другу численно (см. предыдущий вопрос). Следовательно, значения не уникальны.

(5)Могут многочисленные приложения обращаться к файлу единой базы данных в то же время?

У многократных процессов может быть та же самая база данных, открытая в то же время. Многократные процессы могут делать SELECT в то же время. Но только один процесс может вносить изменения в базу данных в любой момент времени, как бы то ни было.

SQLite использует блокировки чтения/записи, чтобы управлять доступом к базе данных. Под Win95/98/ME, которые испытывают недостаток в поддержке такой блокировки, вероятностное моделирование используется вместо этого. Но проявите осмотрительность: этот механизм блокировки не мог бы работать правильно, если файл базы данных сохранен в файловой системе NFS. Это вызвано тем, что блокировка файла fcntl() не работает на многих внедрениях NFS. Необходимо избежать помещать файлы базы данных SQLite на NFS, если многократные процессы могли бы попытаться получить доступ к файлу в то же время. На Windows в документации Microsoft говорится, что блокировка может не работать под файловыми системами FAT, если вы не управляете демоном Share.exe. Люди, у которых есть большой опыт с Windows, говорят мне, что блокировка сетевых файлов очень глючная и не надежная. Если то, что они говорят, верно, разделение базы данных SQLite между двумя или больше машинами Windows могло бы вызвать неожиданные проблемы.

Мы не знаем ни о каком другом встроенном движке базы данных SQL, который поддерживает столько же параллелизма, сколько SQLite. SQLite позволяет многократным процессам иметь файл базы данных, открытый сразу для многократных процессов, чтобы прочитать базу данных. Когда любой процесс хочет написать данные, он должен блокировать весь файл базы данных на время его обновления. Но это обычно занимает только несколько миллисекунд. Другие процессы просто ждут окончания записи. Другие встроенные СУБД SQL типично позволяют только единственному процессу соединяться с базой данных сразу.

Однако, ядра базы данных клиент-сервер (такие как PostgreSQL, MySQL или Oracle) обычно поддерживают более высокий уровень параллелизма и позволяют многократным процессам писать ту же самую базу данных в то же время. Это возможно в базе данных клиент-сервер, потому что всегда есть единственный хорошо управляемый серверный процесс, доступный, чтобы скоординировать доступ. Если у вашего приложения есть потребность в большом параллелизме, то необходимо рассмотреть использование базы данных клиент-сервер. Но опыт показывает, что для большинства приложений было нужно намного меньше параллелизма, чем их проектировщики воображают.

Когда SQLite пытается получить доступ к файлу, который блокирован другим процессом, поведение по умолчанию должно возвратить SQLITE_BUSY. Можно приспособить это поведение из кода на C, используя API sqlite3_busy_handler() или sqlite3_busy_timeout().

(6) SQLite поточно-безопасный?

Потоки злые. Избегайте их.

SQLite ориентирован на многопотоковое исполнение. Мы идем на эту уступку, так как многие пользователи принимают решение проигнорировать совет, данный в предыдущем параграфе. Но чтобы быть ориентированным на многопотоковое исполнение, SQLite должен быть собран с макросом препроцессора SQLITE_THREADSAFE = 1. Windows и предварительно собранные пакеты Linux собраны именно так. Если вы не уверены, что библиотека SQLite, с которой вы компонуете, собрана, чтобы быть ориентированной на многопотоковое исполнение, можно вызвать sqlite3_threadsafe().

SQLite ориентирован на многопотоковое исполнение, потому что он использует mutexes, чтобы преобразовать в последовательную форму доступ к структурам общих данных. Однако работа приобретения и выпуска этих mutexes замедлит SQLite немного. Следовательно, если вам не нужен SQLite, ориентированный на многопотоковое исполнение, необходимо отключить mutexes для максимальной производительности. См. документацию здесь.

В Unix вы не должны передать открытую базу данных SQLite через системный вызов fork() в дочерний процесс.

(7) Как перечислить все таблицы/индексы в базе данных SQLite

Если вы управляете sqlite3 командной строки, можно напечатать ".tables", чтобы получить список всех таблиц. Или можно напечатать ".schema", чтобы видеть полную схему базы данных, которая включает все таблицы и индексы. Любая из этих команд может сопровождаться образцом LIKE, который ограничит таблицы.

Из программы C/C++ (или скрипта на Tcl/Ruby/Perl/Python) можно получить доступ к именам таблиц и именам индексов, делая SELECT на специальной таблице под названием "SQLITE_SCHEMA". У каждой базы данных SQLite есть таблица SQLITE_SCHEMA, которая определяет схему для базы данных. SQLITE_SCHEMA похожа на это:

CREATE TABLE sqlite_schema (type TEXT, name TEXT, tbl_name TEXT,
                            rootpage INTEGER, sql TEXT);

Для таблиц поле type всегда 'table', поле name будет названием таблицы. Таким образом, чтобы получить список всех таблиц в базе данных, используйте следующую команду SELECT:

SELECT name FROM sqlite_schema WHERE type='table' ORDER BY name;

Для индексов type = 'index', name это название индекса, а tbl_name это название таблицы, которой принадлежит индекс. Для таблиц и индексов поле sql это текст оригинального CREATE TABLE или CREATE INDEX, который составил таблицу или индекс. Для автоматически созданных индексов (используемых для реализации ограничения PRIMARY KEY или UNIQUE) sql = NULL.

Таблица SQLITE_SCHEMA не может быть изменена, используя UPDATE, INSERT или DELETE (кроме экстраординарных условий). Таблица SQLITE_SCHEMA автоматически обновляется командами CREATE TABLE, CREATE INDEX, DROP TABLE и DROP INDEX.

Временные таблицы не появляются в SQLITE_SCHEMA. Временные таблицы, их индексы и триггеры происходят в другой специальной таблице под названием SQLITE_TEMP_SCHEMA. Работает SQLITE_TEMP_SCHEMA точно так же, как SQLITE_SCHEMA за исключением того, что это видимо только приложению, которое составило временные таблицы. Чтобы получить список всех таблиц можно использовать команду, подобную следующей:

SELECT name FROM (SELECT * FROM sqlite_schema UNION ALL
       SELECT * FROM sqlite_temp_schema) WHERE type='table' ORDER BY name

(8) Какие известные пределы размера базам данных SQLite?

См. limits.html для полного обсуждения пределов SQLite.

(9) Каков максимальный размер VARCHAR в SQLite?

SQLite не проводит в жизнь длину VARCHAR. Можно объявить VARCHAR (10), и SQLite будет рад сохранить 500 миллионов символьных строк там. И это сохранит все 500 миллионов знаков в целости. Ваше содержание никогда не усечено. SQLite понимает тип столбца "VARCHAR(N)", чтобы совпасть с "TEXT", независимо от значения N.

(10) SQLite поддерживает тип BLOB?

SQLite позволяет вам хранить данные BLOB в любой колонке, даже колонках, которые, как объявляют, держат некоторый другой тип. BLOB могут даже использоваться в качестве PRIMARY KEY.

(11) Как я добавляю, удаляю или переименовываю колонки существующей таблицы в SQLite?

SQLite ограничил поддержку ALTER TABLE, которую можно использовать, чтобы добавить, переименовать или пропустить колонки или изменить название таблицы, как детализировано в ALTER TABLE.

Если вы хотите внести более сложные изменения в структуру или ограничения таблицы или ее колонок, необходимо будет пересоздать ее. Можно сохранить существующие данные во временной таблице, удалить старую, составить новую таблицу, затем скопировать данные из временной таблицы. Посмотрите здесь.

(12) Я удалил много данных, но файл базы данных не стал намного меньше. Действительно ли это ошибка?

Нет. Когда вы удаляете информацию из базы данных SQLite, неиспользуемое пространство добавляется к внутреннему "free-list" и снова используется в следующий раз, когда вы вставляете данные. Дисковое пространство не потеряно. Но при этом и не возвращено операционной системе.

Если вы удаляете много данных и хотите сократить файл базы данных, надо воспользоваться командой VACUUM. VACUUM восстановит базу данных с нуля. Это оставит базу данных с пустым свободным списком и файлом, который минимален в размере. Отметьте, однако, что VACUUM может занять время и может использовать до вдвое больше временного дискового пространства по сравнению с оригинальным файлом в ходе работы.

Альтернатива использованию команды VACUUM является автовакуумным режимом, позволенным если использовать auto_vacuum pragma.

(13) Я могу использовать SQLite в своем коммерческом продукте, не платя лицензионные платежи?

Да. SQLite это public domain. Никакая претензия собственности не предъявлена ни к какой части кода. Можно сделать что-либо, что вы хотите, с ним.

(14) Как я использую строковый литерал, который содержит вложенную одинарную кавычку (')?

Стандарт SQL определяет, что одинарных кавычек в последовательностях избегают, помещая две одинарных кавычки подряд. SQL работает как язык программирования Паскаль в этом отношении. Пример:

INSERT INTO xyz VALUES('5 O''clock');

(15) Что такое ошибка SQLITE_SCHEMA, и почему я получаю ее?

Ошибка SQLITE_SCHEMA возвращена, когда подготовленный SQL-оператор больше не действителен и не может быть выполнен. Когда это происходит, запрос должен быть повторно собран из SQL использованием sqlite3_prepare() API. Ошибка SQLITE_SCHEMA может произойти только, используя sqlite3_prepare() и sqlite3_step() для выполнения SQL. Вы никогда не будете получать ошибку SQLITE_SCHEMA из sqlite3_exec(). И при этом вы не получите ошибку, если вы подготовите запрос, используя sqlite3_prepare_v2() вместо sqlite3_prepare().

sqlite3_prepare_v2() создает подготовленный запрос, который автоматически повторно соберет себя, если схема изменится. Самый легкий способ иметь дело с ошибками SQLITE_SCHEMA состоит в том, чтобы всегда использовать sqlite3_prepare_v2() вместо sqlite3_prepare().

(17) Я получаю некоторые предупреждения компилятора, когда я собираю SQLite. Разве это не проблема? Разве это не указывает на плохое качество кода?

Гарантия качества в SQLite сделана, используя тестирование полного охвата, а не предупреждениями компилятора или другими статическими инструментами анализа кода. Другими словами, мы проверяем, что SQLite на самом деле получает правильный ответ, а не просто удовлетворяет стилистическим ограничениям. Большая часть кодовой базы SQLite посвящена просто тестированию. Десятки тысяч пробегов набора тестов SQLite отдельных тестовых сценариев и многие из тех тестовых сценариев параметризуются так, чтобы сотни миллионов тестов, включающих миллиарды SQL-операторов, были запущены и оценены для правильности до каждого выпуска. Разработчики используют кодовые инструменты освещения, чтобы проверить, что все пути через код проверены. Каждый раз, когда ошибка найдена в SQLite, новые тестовые сценарии написаны, чтобы показать ошибку так, чтобы ошибка не могла незаметно повториться в будущем.

Во время тестирования библиотека SQLite собрана со специальной инструментовкой, которая позволяет сценариям тестирования моделировать большое разнообразие неудач, чтобы проверить, что SQLite приходит в себя правильно. Выделение памяти тщательно прослежено, и никакие утечки памяти не происходят, даже после сбоев выделения памяти. Специальный слой VFS используется, чтобы моделировать катастрофы операционной системы и перебои в питании, чтобы гарантировать, что транзакции атомные через эти события. Механизм для того, чтобы сознательно ввести ошибки I/O показывает, что SQLite эластичен к таким сбоям. Как эксперимент, попытайтесь вызвать эти виды ошибок на других движках базы данных SQL и посмотрите, что происходит!

Мы также управляем SQLite с использованием Valgrind в Linux и проверяем, что это не обнаруживает проблем.

Некоторые люди говорят, что мы должны устранить все предупреждения, потому что мягкие предупреждения маскируют реальные предупреждения, которые могли бы возникнуть в будущих изменениях. Это достаточно верно. Но в ответ, разработчики замечают, что все предупреждения были уже исправлены при сборке используемого для развития SQLite (различные версии GCC, MSVC и clang). Предупреждения компилятора обычно являются только результатом действий компиляторов или вариантов времени компиляции, которые разработчики SQLite не используют сами.

(18) Нечувствительное к регистру соответствие знаков Unicode не работает.

Конфигурация по умолчанию SQLite поддерживает только нечувствительные к регистру сравнения знаков ASCII. Причина этого состоит в том, что, делая полные нечувствительные к регистру сравнения и замены регистра Unicode, надо реализовать таблицы и логику, которая почти удвоила бы размер библиотеки SQLite. Разработчики SQLite рассуждают, что у любого применения, для которого нужна полная поддержка Unicode, вероятно, уже, есть необходимые таблицы и функции и таким образом, SQLite не должен занимать место, чтобы дублировать эту способность.

Вместо того, чтобы оказать полную поддержку Unicode по умолчанию, SQLite обеспечивает способность скомпоновать для внешнего сравнения Unicode и подпрограмм преобразования. Применение может перегрузить встроенное сопоставление последовательности NOCASE (через sqlite3_create_collation()) и встроенные функции like(), upper() и lower() (через sqlite3_create_function()). Исходный код SQLite включает расширение "ICU", которое делает эти перегрузки. Или разработчики могут написать свои собственные перегрузки на основе их собственного Unicode-распорядка сравнения, уже содержащегося в рамках их проекта.

(19) INSERT действительно медленный, я могу только сделать небольшое количество INSERT в секунду

На самом деле SQLite легко сделает 50,000 или больше INSERT в секунду на среднем настольном компьютере. Но это только сделает несколько дюжин транзакций в секунду. Операционная скорость ограничивается скоростью вашего дисковода. Транзакция обычно требует двух полных вращений подложки диска, которая на дисководе на 7200 об/мин ограничивает вас приблизительно 60 транзакциями в секунду.

Операционная скорость ограничивается скоростью дисковода, потому что (по умолчанию) SQLite на самом деле ждет, пока данные действительно безопасно не сохранятся на поверхности диска, прежде чем транзакция закроется. Если вы внезапно теряете питание или если ваша OS терпит крах, ваши данные, все еще целы. Для получения дополнительной информации об атомной передаче в SQLite см. здесь.

По умолчанию каждый оператор INSERT это своя собственная транзакция. Но если вы окружаете многократные операторы INSERT BEGIN... COMMIT, все вставки сгруппированы в единственную транзакцию. Время, чтобы передать ее амортизируется по всем прилагаемым запросам вставки и таким образом время на вставки значительно уменьшается.

Другой выбор состоит в том, чтобы управлять PRAGMA synchronous=OFF. Эта команда заставит SQLite не ждать точной записи данных, это заставит операции записи казаться намного быстрее. Но если вы теряете питание посреди транзакции, ваш файл базы данных мог быть поврежден.

(20) Я случайно удалил некоторую важную информацию из своей базы данных SQLite. Как я могу возвратить ее?

Если вы имеете резервную копию своего файла базы данных, возвращаете информацию от вашей резервной копии.

Если у вас нет резервной копии, восстановление очень трудное. Вы могли бы быть в состоянии найти частичные данные о последовательности в дампе двоичных данных сырого файла базы данных. Восстановление числовых данных также может быть возможно специальными инструментами, хотя никакие такие инструменты нам неизвестны. SQLite иногда собирается с выбором SQLITE_SECURE_DELETE, который переписывает все удаленное содержание с нолями. Если это так, тогда восстановление явно невозможно. Восстановление также невозможно, если вы управляли VACUUM после того, как данные были удалены. Если SQLITE_SECURE_DELETE не используется, и VACUUM не управляли, то часть удаленного содержания могла бы все еще быть в файле базы данных в областях, отмеченных для повторного использования. Но там не существуют никакие процедуры или инструменты, о которых мы знаем, чтобы помочь вам возвратить те данные.

(21) Что за ошибка SQLITE_CORRUPT? Что означает для базы данных "malformed"? Почему я получаю эту ошибку?

Ошибка SQLITE_CORRUPT возвращена, когда SQLite обнаруживает ошибку в структуре, формате или других элементах управления файла базы данных.

SQLite не портит файлы базы данных без внешней помощи. Если ваше приложение развалилось посреди обновления, ваши данные в безопасности. База данных безопасна, даже если ваша OS зависнет. Сопротивление катастрофе в SQLite было экстенсивно изучено, проверено и засвидетельствовано годами реального опыта миллиардами пользователей.

Однако, есть много вещей, которые внешние программы или ошибки в ваших аппаратных средствах или OS могут сделать, чтобы испортить файл базы данных. Посмотрите здесь.

Можно использовать PRAGMA integrity_check, чтобы сделать более быстрый, но менее полный тест на целостность БД.

Можно использовать PRAGMA quick_check, чтобы сделать полное, но длительное тестирование на целостность БД.

В зависимости от того, как ужасно ваша база данных испорчена, можно быть в состоянии возвратить некоторые данные при помощи CLI, чтобы сдампить схему и содержание к файлу и затем воссоздать.

(22) SQLite поддерживает внешние ключи?

С version 3.6.19 (2009-10-14) SQLite поддерживает ограничения внешнего ключа. Но осуществление ограничений внешнего ключа выключено по умолчанию (для обратной совместимости). Чтобы позволить ограничительное осуществление внешнего ключа, управляйте PRAGMA foreign_keys=ON или соберите с -DSQLITE_DEFAULT_FOREIGN_KEYS=1.

(23) Я получаю ошибку компилятора, если я использую SQLITE_OMIT_... варианты времени компиляции, строя SQLite.

Варианты времени компиляции SQLITE_OMIT_... работают только строя из канонических исходных файлов. Они не работают, когда вы строите из SQLite объединения или из предварительно обработанных исходных файлов.

Возможно построить специальное объединение, которое будет работать с предопределенным набором SQLITE_OMIT_... Инструкции для этого есть здесь.

(24) Мое выражение WHERE column1="column1" не работает. Это заставляет вернуть каждую строку таблицы, не только те, где у column1 есть значение "column1".

Используйте одинарные кавычки, не двойные кавычки, вокруг строковых литералов в SQL. Это то, чего требует стандарт SQL. Ваше выражение оператора Where должно выглядеть так: column1='column1'

SQL использует двойные кавычки вокруг идентификаторов (имена столбцов или имена таблиц), которые содержат специальные символы или являются ключевыми словами. Таким образом, двойные кавычки это способ экранировать имя идентификатора. Следовательно, когда вы говорите column1="column1", это эквивалентно column1=column1, который, очевидно, всегда верен.

(25) Как диаграммы синтаксиса (иначе диаграммы "railroad" diagrams) создаются для SQLite?

Каждая диаграмма написана от руки, используя язык Pikchr. Эти рукописные технические требования преобразовываются в SVG и вставляются в файлы HTML как часть процесса сборки документации.

Много исторических версий документации SQLite использовали различный процесс для создания диаграмм синтаксиса. Исторический процесс был основан на Tcl/Tk и описан на http://wiki.tcl-lang.org/21708. Более новый Pikchr-синтаксис введен 2020-09-26.

(26)Стандарт SQL требует, чтобы ограничение UNIQUE было проведено в жизнь, даже если один или больше столбцов в ограничении NULL, но SQLite не делает этого. Это не ошибка?

Возможно, вы обращаетесь к следующему заявлению от SQL92:
A unique constraint is satisfied if and only if no two rows in a table have the same non-null values in the unique columns.
То заявление неоднозначно, имея по крайней мере две возможных интерпретации:
  1. Ограничение на уникальность данных удовлетворено, если и только если никакие две строки в таблице не имеют те же самые значения и имеют ненулевые значения в уникальных колонках.
  2. Ограничение на уникальность данных удовлетворено, если и только если ни у каких двух строк в таблице нет тех же самых значений в подмножестве уникальных колонок, которые не являются пустыми.
SQLite следует интерпретации (1), как делает PostgreSQL, MySQL, Oracle и Firebird. Верно, что Informix и Microsoft SQL Server используют интерпретацию (2), однако мы, разработчики SQLite, считаем, что интерпретация (1) является самым естественным чтением требования, и мы также хотим максимизировать совместимость с другими движками базы данных SQL, а большинство других ядер базы данных также ориентируются именно на (1).

(27) Каков Export Control Classification Number (ECCN) для SQLite?

После тщательного обзора Commerce Control List (CCL) мы убеждены, что об основном общественном достоянии, исходный код SQLite не описан никаким ECCN, следовательно ECCN, нужно сообщить как EAR99.

Вышеупомянутое верно для основного общественного достояния SQLite. Если вы расширяете SQLite, добавляя новый код, или если вы статически связываете SQLite со своим приложением, возможно надо изменить ECCN в вашем особом случае.

(28) Мой запрос не возвращает имя столбца, которое я ожидаю. Действительно ли это ошибка?

Если колонки вашего набора результатов имеют пункты AS, то SQLite, как гарантируют, будет использовать идентификатор направо от ключевого слова AS как имя столбца. Если набор результатов не использует пункт AS, то SQLite свободен назвать колонку как хочет. Посмотрите sqlite3_column_name().

(29) Куда моя база данных делась? Или как моя база данных стала пустой?

Если не открыто с флагами, чтобы предотвратить это, база данных SQLite создается, если это еще не существует. Недавно созданные базы данных первоначально пусты. Это может смутить людей, которые непреднамеренно открывают различные файлы базы данных в различных контекстах из-за опечатки в имени файла или из-за использования относительного пути, который используется с отличающимися текущими каталогами для вводных процессов.