Ошибка SQLite «попытка записи базы данных только для чтения» во время вставки? - PullRequest
112 голосов
/ 23 июля 2010

У меня есть база данных 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 запрос после , база данных открыта.

Есть идеи о том, что происходит?

Ответы [ 8 ]

285 голосов
/ 25 июля 2010

Проблема, как выясняется, заключается в том, что драйвер PDO SQLite требует, чтобы, если вы собираетесь выполнить операцию записи (INSERT, UPDATE, DELETE, DROP и т. Д.), То Папка, в которой находится база данных, должна иметь разрешения на запись, а также фактический файл базы данных.

Я нашел эту информацию в комментарии в самом низу страницы справки драйвера PDO SQLite .

13 голосов
/ 23 июля 2010

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

Кому принадлежит файл SQLite? Вы

Кто такой скрипт? Апач или никто?

5 голосов
/ 24 января 2013

Для меня проблема заключалась в применении SELinux , а не в разрешениях.Ошибка «только для чтения базы данных» исчезла, как только я отключил принудительное выполнение, после предложения, сделанного Стивом В. в комментарии к принятому ответу.* После выполнения этой команды все работало как задумано (CentOS 6.3).

Конкретная проблема, с которой я столкнулся, была во время установки Graphite.Я трижды проверил, что пользователь apache принадлежит и может писать как в мой файл graphite.db, так и в его родительский каталог.Но до тех пор, пока я не «исправил» SELinux, все, что я получил, было трассировкой стека: DatabaseError: попытка написать базу данных только для чтения

3 голосов
/ 14 декабря 2016

Это может быть вызвано SELinux. Если вы не хотите полностью отключать SELinux, вам нужно установить для каталога db 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
1 голос
/ 03 апреля 2017

Я получил эту ошибку при попытке записи в базу данных в системе Android.

Очевидно, что sqlite3 нужны не только разрешения на запись в файл базы данных и содержащий каталог (как уже говорилось в @ austin-hyde вего ответ), но также и переменная окружения TMPDIR должна указывать на (возможно, доступный для записи) каталог.

В моей системе Android я установил для него значение TMPDIR="/data/local/tmp", и теперь мой скрипт выполняется так, как ожидается:)

Редактировать:

Если вы не можете установить переменные среды, вы можете использовать один из других методов, перечисленных здесь: https://www.sqlite.org/tempfiles.html#temporary_file_storage_locations как PRAGMA temp_store_directory = 'directory-name';

1 голос
/ 09 марта 2014

Я получил ту же ошибку от IIS под Windows 7. Чтобы исправить эту ошибку, мне пришлось добавить полный доступ к учетной записи IUSR для файла базы данных sqlite. Вам не нужно менять разрешения, если вы используете sqlite в webmatrix вместо IIS.

0 голосов
/ 12 апреля 2019

Итак, я исправил проблему, поместив файл базы данных (* .db) в подпапку.

  • Подпапка и файл базы данных в ней должны входить в группу www-data.
  • В группе www-данных вы должны иметь право записывать в подпапку и файл базы данных.
0 голосов
/ 31 августа 2016

Я получил это в своем браузере, когда перешел с использования http://localhost на http://145.900.50.20 (где 145.900.50.20 - мой локальный IP-адрес), а затем изменил обратно на localhost - необходимо остаться с IP-адресом, как только я изменился на этот раз

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...