【问题标题】:Why can't DBD::SQLite insert into a database through my Perl CGI script?为什么 DBD::SQLite 不能通过我的 Perl CGI 脚本插入数据库?
【发布时间】:2009-07-14 00:32:31
【问题描述】:

我在 DBD::SQLite 访问的 Perl CGI 脚本中运行 SQLite 数据库。这是在 Apache 上作为直接 CGI 运行的。

DBI 连接工作正常,并且可以运行选择。但是,当我尝试进行插入时,我得到一个模具并出现以下错误:

DBD::SQLite::st execute failed: unable to open database file(1) at dbdimp.c line 402 at index.cgi line 66

我已尝试将数据库文件权限更改为 666 以尝试解决此问题,但我仍然收到错误消息。

有什么建议吗?

【问题讨论】:

  • 能不能暂时把目录和文件权限设置成777再重新检查一下?
  • 啊哈!将目录权限更改为 777 修复了此问题。你知道这是为什么吗?
  • 你可能也忘记设置正确的目录权限了。

标签: perl apache sqlite dbi


【解决方案1】:

貌似目录需要写权限,原因是:

SQLite 需要能够在与数据库相同的目录中创建日志文件,然后才能进行任何修改。日志用于支持事务回滚。

发件人:seem to need write permission on db's parent directory

【讨论】:

    【解决方案2】:

    SQLite 在执行插入和更新时会暂时锁定整个文件(没有记录级锁定)。您确定要释放锁吗?

    SQLite 文献建议您启动一个事务,收集该事务中的所有即时插入和更新,然后提交。这避免了多次连续的文件锁定,并提高了性能。

    【讨论】:

      【解决方案3】:

      由于 SQLite 锁定了整个数据库文件,您可能希望使用基于超时的重试机制。当我问这个相关的question 时,我正在处理几乎相同的问题。

      我最终写了类似于 Mark Fowler 的 Attempt 的东西,如果 sub 抛出的异常与正则表达式匹配,我会重试:

      qr(already in a transaction|database is locked)i
      

      【讨论】:

        【解决方案4】:

        db 文件所在目录的路径应设置可​​执行位和可写位,以便从脚本中访问它。

        此外,如果您不希望 db 文件位于直接访问(即使不使用特殊服务器文件),它应该具有访问权限,例如 600,如果不应直接浏览包含目录(同样,即使不使用特殊服务器文件),它应该具有访问权限,例如700.

        我使用这个设置,它在本地和我托管我的站点的服务器上都可以正常工作。

        当然,如果存在,包含目录的权限不能是 700里面的其他文件应该可以通过 html、css 或 javascript 访问。它应该是 755。

        【讨论】:

          【解决方案5】:

          如果您不想按照 Todd Hunter 的回答中的说明对整个目录设置写权限,则可以将 journal_mode PRAGMA 设置为“MEMORY”。

          在这种情况下,请注意:

          MEMORY 日志模式将回滚日志存储在 volatile 内存。这节省了磁盘 I/O,但以牺牲数据库安全和 正直。如果使用 SQLite 的应用程序在运行过程中崩溃 当设置了 MEMORY 日志模式时的事务,那么数据库 文件很可能会损坏。

          所以这是否是一个好的解决方案取决于您的数据库以及它的使用方式。

          其他人也提到了temp_store pragma。我不需要设置它,但这可能取决于数据库的使用方式。

          所以在你的 Perl CGI 脚本中,你可以试试这个:

          $dbh->do("PRAGMA journal_mode = MEMORY");
          $dbh->do("PRAGMA temp_store   = MEMORY");
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2017-10-10
            • 2011-01-31
            • 2010-11-16
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多