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



любые идеи о том, что происходит?

1059   7  

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

    Ничего не найдено.