如何使用Python

时间:2018-05-17 00:12:45

标签: python sqlite zipfile db-browser-sqlite

由于应用程序SQLite3,我创建了一个DB browser for SQLite数据库并使用密码保护它(" test")。 为了通过Python连接到我的数据库,我需要提供密码,但我无法弄清楚如何做到这一点。我尝试了以下代码:

conn=sqlite3.connect("mydatabase.db", Password="test")
cur=conn.cursor()

修改

我的SQLite3数据库已使用SQLCipher加密(参见图片)。 enter image description here 如果我运行以下代码:

conn=sqlite3.connect("mydatabase.db")
cur=conn.cursor()

我收到此错误:

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

如何通过密码传递密码以通过Python与我的db连接?

编辑2

这里简要总结一下我尝试实现的目标。我正在开发一个Python 3的应用程序,需要一个预先填充的数据库,但是这个数据库需要用密码保护。 经过广泛的研究,通过SQLite3连接加密的Python 3数据库似乎很复杂。库调用pysqlcipher存在但仅适用于Python 2.7。我的下一个问题可能过于宽泛,我提前道歉。是否存在另一个可存储的便携式数据库,允许我使用密码保护它并仍然可以访问Python? 为解决我的问题,我想到的另一个想法是使用zipfile库。这个link提到zipfile模块不支持加密,但不清楚加密是指SQLite3数据库还是zip文件。我的想法是将我未受保护的DB压缩到受保护的zip文件中,因为我似乎可以这样做(link)。 此编辑的目标是获得有关如何解决问题的新想法。感谢

2 个答案:

答案 0 :(得分:2)

您需要SQLCipher模块来读取该数据库。默认的SQLite3模块不支持它。见https://github.com/sqlitebrowser/sqlitebrowser/wiki/Encrypted-Databases

答案 1 :(得分:0)

如果您的数据库已使用SqlCipher加密,则需要在您的SO中安装sqlcipher Windows:Download

Linux:sudo pacman -S sqlcipher

sudo apt-get install sqlcipher

需要pysqlcipher3库之后:pip install pysqlcipher3

请参阅:https://github.com/rigglemania/pysqlcipher3

我的示例代码是:

from pysqlcipher3 import dbapi2 as sqlite3


class Database(object):
    def __init__(self, dbname):
        self.dbname = dbname

    def connDB(self):
        self.conn = sqlite3.connect(self.dbname)
        self.cursor = self.conn.cursor()
        self.cursor.execute("PRAGMA key='mypassword'")

    def createDB(self):
        self.connDB()
        self.cursor.execute(
            '''
            CREATE TABLE IF NOT EXISTS users (
            id INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
            name TEXT NOT NULL,
            login TEXT NOT NULL,
            passwd TEXT);
            '''
        )

        self.cursor.execute(
            '''
            INSERT INTO users (name, login, passwd)
            VALUES ("Admininstrator", "admin", "12345")
            '''
        )
        self.conn.commit()
        self.conn.close()

    def queryDB(self, sql):
        self.connDB()
        self.cursor.execute(sql)

        if sql[0:6].lower() == 'select':
            result = self.cursor.fetchall()
            self.conn.close()
            return result
        else:
            self.conn.commit()
            self.conn.close()