如何在SQLAlchemy引擎连接事件中获取sqlite文件名

0 投票
1 回答
591 浏览
提问于 2025-04-18 14:35

我正在使用以下代码为sqlcipher版本的sqlite设置密码。这个命令必须是发送给数据库的第一个命令。因此,我不能使用PRAGMA database_list;来获取文件名,因为我不知道这个sqlite文件是否被加密。

我需要通过文件名来区分哪些sqlite文件是加密的,或者在创建引擎时传递一些信息来区分。换句话说,我需要提前知道文件是否应该被加密,这样我才能决定是否发送PRAGMA key命令。

我尝试在dbapi_connectionconnection_record对象中寻找一些线索,以帮助我识别我正在处理哪个文件,但没有找到任何有用的信息。

@event.listens_for(Engine, "connect")
def set_sqlite_pragma(dbapi_connection, connection_record):
    from sqlite3 import Connection as sqliteConnection
    if isinstance(dbapi_connection,sqliteConnection):
        cursor = dbapi_connection.cursor()
        query  = "PRAGMA key='" + CIPHERSECRET + "'"
        cursor.execute(query)
        cursor.close()

1 个回答

0

SQLCipher数据库文件的前16个字节是一个随机的盐值,这和SQLite的默认值不一样,SQLite的默认值是SQLite format 3\000。你可以尝试读取前16个字节,看看里面是否有SQLite的常量,然后根据这个值来做决定。

撰写回答