SQLite: база данных только для чтения
у меня есть база данных SQLite, которую я использую для веб-сайта. Проблема в том, что когда я пытаюсь INSERT INTO это, я получаю PDOException
SQLSTATE[HY000]: General error: 8 attempt to write a readonly database
Я SSH'D в сервер и проверил разрешения, и база данных имеет разрешения
-rw-rw-r--
Я не так хорошо знаком с разрешениями * nix, но я уверен, что это означает
- не директорию
- владелец имеет права на чтение/запись (это я, по
ls -l) - группа имеет права на чтение/запись
- все остальные имеют только права на чтение
я также посмотрел везде, где я знал, чтобы использовать sqlite3 программа, и не нашел ничего соответствующего.
потому что я не знал, с какими разрешениями PDO пытается открыть базу данных, я сделал
chmod o+w supplies.db
теперь я получаю еще один PDOException:
SQLSTATE[HY000]: General error: 14 unable to open database file
но это происходит только тогда, когда я пытаюсь выполнить INSERT запрос после база данных открыта.
любые идеи о том, что происходит?
7 ответов:
проблема, как оказалось, заключается в том, что драйвер PDO SQLite требует, чтобы если вы собираетесь выполнить операцию записи (
INSERT,UPDATE,DELETE,DROPи т. д.), то в папке находится база данных, должна иметь разрешения на запись, а также сам файл базы данных.Я нашел эту информацию в комментарий в самом низу страницы руководства по драйверу PDO SQLite.
Это может произойти, когда владельцем самого файла SQLite является не то же, что и пользователь, выполняющий скрипт. Подобные ошибки могут возникать, если весь путь к каталогу (то есть каждый каталог по пути) не может быть записан.
кому принадлежит файл SQLite? Ты?
от кого работает скрипт? Апачи или никто?
для меня проблема была SELinux enforcement, а не разрешения. Ошибка "только для чтения базы данных" исчезла, как только я отключено принудительное исполнение, следуя предложению, сделанному Стивом В. в комментарии к принято отвечать.
echo 0 >/selinux/enforceпри выполнении этой команды все работало по назначению (CentOS 6.3).
конкретная проблема, с которой я столкнулся, была во время установки графита. Я трижды проверил, что пользователь apache владел и мог писать обоим своим графитом.БД и его родительский каталог. Но пока я не" исправил " SELinux, все, что я получил, было трассировкой стека в результате: DatabaseError: попытка написать базу данных только для чтения
Это может быть вызвано SELinux. Если вы не хотите полностью отключать SELinux, вам нужно установить каталог БД fcontext в httpd_sys_rw_content_t.
semanage fcontext -a -t httpd_sys_rw_content_t "/var/www/railsapp/db(/.*)?" restorecon -v /var/www/railsapp/db
Я получил ту же ошибку от IIS под windows 7. Чтобы исправить эту ошибку, мне пришлось добавить разрешения на полный доступ к учетной записи IUSR для файла базы данных sqlite. Вам не нужно изменять разрешения, если вы используете sqlite под webmatrix вместо IIS.
Я получил эту ошибку, когда я пытался написать в базу данных на Android системы.
по-видимому, sqlite3 нужны не только разрешения на запись в файл базы данных и содержащий каталог (как уже сказал @austin-hyde в своем ответе), но и переменная окружения
TMPDIRдолжен указывать на каталог (возможно, для записи).в моей системе Android я установил его в
TMPDIR="/data/local/tmp"и теперь мой скрипт работает, как ожидалось :)
Я получил это в моем браузере, когда я изменил с помощью http://localhost до http://my.местный.интеллектуальная собственность.адрес а затем изменил обратно на localhost - необходимо было остаться с IP-адресом, как только я изменил его один раз
Comments