在调用不存在文件名的sqlite3 filename时,如何避免让sqlite3创建一个新的空数据库?

n3h0vuf2  于 2022-11-15  发布在  SQLite
关注(0)|答案(2)|浏览(200)

如果我使用

$ sqlite3 fileName
sqlite> .s
sqlite>_

并且没有名为FILENAME的文件,则SQLITE3将创建一个新的空数据库。有没有办法避免这种情况?理想情况下,如果找不到文件,我希望它重试几次,然后失败并显示错误消息。大概是这样的:

$ sqlite3 --failIfNoSuchFile --retry 3 fileName
sqlite> No such file, retrying ...
sqlite> No such file, retrying ...
sqlite> No such file, retrying ...
sqlite> Aborting...
Error: No file named fileName
$_

这样的事情有可能发生吗?
我问这个问题的原因是,我们已有的一个现有数据库被压缩,并被这个新的空白数据库取代,只是因为网络问题阻止了sqlite3从一开始就找到该文件,但并没有阻止它创建新的空文件(并压缩旧的文件)!至少,这是我们提出的解释数据库突然空闲的最有可能的理论(即使结构消失了,.s也不返回任何内容,文件大小为0)
有什么主意吗?
顺便说一句,在实际的上下文中,TCL脚本连接到数据库并插入数据。问题显示为“TABLE NOT FOUND”错误,并且我们发现数据库文件为空。

fumotvh3

fumotvh31#

我不知道有什么标志可以让Sqlite3来做这件事。在调用sqlite3之前,您可以让您的TCL脚本检查文件吗?
像这样的东西会奏效吗:

if {[file exists $dbName] == 1} {
    # call sqlite3 in here
    return 0
} else {
    error "database file not found: $dbName"
}
oxcyiej7

oxcyiej72#

在发布原始问题和答案之后,SQLite添加了mode URI文件名参数。如果数据库文件尚不存在,则设置mode=rw会阻止创建该文件:

# new.sqlite does not exist, and is not created
% sqlite3 "file:new.sqlite?mode=rw" "SELECT 1"
Error: unable to open database "file:new.sqlite?mode=rw": unable to open database file

# new.sqlite does not exist, but is automatically created (default behaviour)
% sqlite3 "file:new.sqlite?mode=rwc" "SELECT 1"
1

相关问题