将SQLite数据库模式更改为读写

时间:2009-10-05 07:52:21

标签: sqlite

如何将SQLite数据库从只读更改为读写?

当我执行更新语句时,我总是得到:

  

SQL错误:尝试编写只读数据库

SQLite文件是文件系统上的可写文件。

15 个答案:

答案 0 :(得分:57)

此错误消息可能有多种原因:

  • 多个进程同时打开数据库(see the FAQ)。

  • 有一个压缩和加密数据库的插件。它不允许修改数据库。

  • 最后,another FAQ说:“确保包含数据库文件的目录对执行CGI脚本的用户也是可写的。”我认为这是因为引擎需要在目录中创建更多文件。

  • 整个文件系统可能只读,例如在崩溃后。

  • 在Unix系统上,另一个进程可以替换整个文件。

答案 1 :(得分:5)

我通过在/ db目录上的所有文件上将所有者从root更改为我来解决这个问题。

只需对该文件夹执行ls -l,如果任何文件管理器归root所有,只需将其更改为您,使用:sudo chown user file

答案 2 :(得分:4)

如果使用Android。

确保您已向EXTERNAL_STORAGE AndroidManifest.xml添加了写入AndroidManifest.xml的权限。

将此行添加到<application>代码上方和外部的<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/> 文件中。

EXTERNAL_STORAGE

这将允许您的应用程序写入SD卡。如果您的{{1}}是您在设备上存储数据库的地方,这将有所帮助。

答案 3 :(得分:3)

当您的数据库已被一个应用程序访问,并且您尝试使用其他数据库访问它时,通常会发生此错误。

答案 4 :(得分:2)

我今天也遇到了这个问题。

这是由Windows Mobile上的ActiveSync引起的 - 我正在处理的文件夹已同步,因此AS进程不时抓取DB文件导致此错误。

答案 5 :(得分:2)

在Linux命令shell中,我做了:

chmod 777 <db_folder>

包含数据库文件的位置。

有效。现在我可以访问我的数据库并进行插入查询。

答案 6 :(得分:1)

在Linux上,为包含数据库文件的整个文件夹授予读/写权限。

此外,SELinux可能会阻止写入。您需要设置正确的权限。

在我的SELinux管理GUI(在Fedora 19上),我选中了标有httpd_unified(统一HTTPD处理所有内容文件)的行上的方框,我很高兴。

答案 7 :(得分:1)

(此错误消息通常具有误导性,通常是一般权限错误)

在Windows上

  • 如果直接针对数据库发布SQL,请确保用于运行SQL的任何应用程序都以管理员身份运行
  • 如果应用程序正在尝试更新,则其用于访问数据库的帐户可能需要包含数据库文件的文件夹的权限。例如,如果IIS正在访问数据库,则IUSR和IIS_IUSRS可能都需要适当的权限(您可以通过以下方式来临时获得这些帐户对文件夹的完全控制权,检查是否可行,然后适当地使用该权限)

答案 8 :(得分:1)

要分享我遇到的此错误的个人经验,该错误最终会同时解决这两个问题。不一定与您的问题有关,但此错误似乎太普遍了,可以归因于数不胜数的事情。

  1. 数据库实例在另一个应用程序中打开。我的数据库似乎处于“锁定”状态,因此它过渡到只读模式。通过停止共享数据库的应用程序的第二个实例,我能够对其进行跟踪。

  2. 目录树权限-请确保用户帐户不仅具有文件级别的权限,而且还具有直到/级别的整个上层目录的权限。

谢谢

答案 9 :(得分:0)

从命令行输入数据库文件所在的文件夹,然后执行以下命令:

chmod 777 databasefilename

这将为所有用户授予所有权限。

答案 10 :(得分:0)

在Windows上:

tl; dr:再次尝试打开文件。

我们的系统遇到了这个问题,它绝对不是一个权限问题,因为程序本身可以在大多数时间从多个线程打开数据库,但偶尔也会(只在Windows上,而不是在OSX),即使程序中的所有其他线程都没有遇到任何困难,线程也会遇到这些错误。

我们最终发现失败的线程只是那些试图在另一个线程关闭它之后立即打开数据库的线程(在3毫秒内)。我们推测这个问题是由于Windows(或Windows下的sqlite实现)并不总是在关闭文件时立即清理文件资源。我们通过在打开时对数据库运行测试写入查询来解决这个问题(例如,创建然后删除具有愚蠢名称的表)。如果创建/删除失败,我们等待50毫秒并再次尝试,重复直到我们成功或5秒钟。

有效;显然,只需要足够的时间让资源冲到磁盘上。

答案 11 :(得分:0)

在项目路径终端 django_project#

sudo chown django:django *

答案 12 :(得分:0)

我在 ESP32 上使用 SQLite,这里的所有答案都“非常奇怪”.... 当我查看 ESP 闪存上的数据时,我注意到整个数据库只有一个文件(还有一个临时文件)。

在这个 db 文件中,我们当然有用户表,也有系统表,例如“sqlite_master”,其中包含表的定义。 因此,似乎很难相信这可能是“chmod”问题,因为如果文件是只读的,即使创建表也是不可能的,因为 SQLite 将无法写入“sqlite_master”数据...... 所以我认为我们的朋友 user143482 正在尝试访问“只读”表。在 SQLite 源代码中,我们可以看到一个名为 tabIsReadOnly 的函数,并带有以下注释:

 /* Return true if table pTab is read-only.
 **
 ** A table is read-only if any of the following are true:
 **
 **   1) It is a virtual table and no implementation of the xUpdate method
 **      has been provided
 **
 **   2) It is a system table (i.e. sqlite_master), this call is not
 **      part of a nested parse and writable_schema pragma has not 
 **      been specified
 **
 **   3) The table is a shadow table, the database    connection is in
 **      defensive mode, and the current sqlite3_prepare()
 **      is for a top-level SQL statement.
 */

答案 13 :(得分:-1)

编辑数据库:编辑数据库时遇到问题。我最终不得不  sudo chown'非root用户名'ts3server.sqlitedb
只要它不是root,我就可以编辑该文件。用户名是我的非root帐户的用户名。

自动启动TeamSpeak:作为非root帐户
    crontab -e
@reboot / ts3server / aka /home/ts3server/ts3server_startscript.sh start的路径

答案 14 :(得分:-1)

在Ubuntu上,将所有者更改为Apache组并授予正确的权限(不,它不是777):

sudo chgrp www-data <path to db.sqlite3>
sudo chmod 664 <path to db.sqlite3>

<强>更新

您也可以设置用户的权限。

sudo chown www-data:www-data <path to db.sqlite3>