如何在SQLAlchemy引擎连接事件中获取sqlite文件名
我正在使用以下代码为sqlcipher版本的sqlite设置密码。这个命令必须是发送给数据库的第一个命令。因此,我不能使用PRAGMA database_list;
来获取文件名,因为我不知道这个sqlite文件是否被加密。
我需要通过文件名来区分哪些sqlite文件是加密的,或者在创建引擎时传递一些信息来区分。换句话说,我需要提前知道文件是否应该被加密,这样我才能决定是否发送PRAGMA key
命令。
我尝试在dbapi_connection
和connection_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的常量,然后根据这个值来做决定。