【问题标题】:Reading sqlite file with Python: sqlite3.DatabaseError: file is encrypted or is not a database用 Python 读取 sqlite 文件:sqlite3.DatabaseError: file is encrypted or is not a database
【发布时间】:2015-09-03 22:38:53
【问题描述】:

我收到了一个需要用 Python 读取的 sqlite 文件。

我可以使用“DB Browser for SQLite”应用程序打开文件。我可以看到表结构并在该应用程序中执行选择语句。所以文件看起来没问题。 (我没有创建它,也不知道它是如何创建的。)

但是,当我尝试从 Python 中读取它时,我得到一个错误:

sqlite3.DatabaseError: 文件已加密或不是数据库

import sqlite3 as lite

sqlite3.sqlite_version
# '3.6.21'

con = lite.connect('path\file.sqlite') 
cur = con.cursor()    
cur.execute('SELECT * from mytable')

# sqlite3.DatabaseError: file is encrypted or is not a database

如果我使用文本编辑器打开文件,那么第一个单词是“SQLite 格式 3”,然后是不可读的文本。所以它是用版本 3 生成的?不确定是否需要转成db文件?

我不知道从这里去哪里。

【问题讨论】:

  • \f 是换页的控制字符。参考:en.wikipedia.org/wiki/Control_character#In_ASCII 您可以使用原始字符串或更好的是使用os.path.join
  • 如果我 CD 到目录并提供不带任何 \ 的文件名,则会出现同样的错误。另外,如果我提供的文件名不存在,那么错误会有所不同,所以我认为它正在查找文件。
  • 您可以使用 sqlite 浏览器将数据库转储到 SQL,至少您可以看到其中的内容并将其加载回 sqlite,希望以一种可以让您从 Python 打开它的方式。
  • 这有效:导出到 sql 然后再次导入。 Python 会打开它。奇怪!
  • 你的旧 Python 附带一个旧 SQLite,它显然不支持 DB Browser 使用的某些新功能。

标签: python sqlite


【解决方案1】:

当 SQLite 数据库采用与 Python 安装中的 SQLite 版本不兼容的新格式时,可能会出现此消息。

例如,我的股票 Python 报告:

>>> import sqlite3
>>> print sqlite3.sqlite_version
3.6.21

根据 MSYS2 file 命令,我要打开的文件是:

$ file testfile.sqlite
testfile.sqlite: SQLite 3.x database, last written using SQLite version 3008010

版本 3008010 => 3.8.10。

在 Windows 上,您可以通过从 SQLite Download Page 下载新的预构建 SQLite 版本(选择 32 位或 64 位以匹配您的 Python 安装)并删除其 @,就地升级 Python 安装中的 SQLite 版本。 987654325@ 代替 \PythonX\DLLs 目录中的旧地址。

【讨论】:

    猜你喜欢
    • 2021-06-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-20
    • 1970-01-01
    • 2017-08-27
    • 2018-07-14
    相关资源
    最近更新 更多