Python 检查数据库文件是否有效,以及程序期望的是什么?

Python 检查数据库文件是否有效,以及程序期望的是什么?,python,sqlite,Python,Sqlite,当从Python(使用Python 2.6)连接到SQLite数据库时,有哪些策略可以确保程序打开了有效的数据库文件(这里的valid表示“匹配程序所期望的”) 我希望确保在一些打开检查之后,我可以(合理地)确保程序已打开一个数据库文件,该文件将按预期工作-理想情况下,如果文件是新的/空的,则创建所有内容,如果该文件是用于其他内容的数据库,则停止/警告,或者以其他方式损坏 我猜诀窍是将打开的文件的模式与程序中预期的模式进行比较? 如果是这样,你会怎么做? 否则,还应该做什么?在我想要类似内容的解

当从Python(使用Python 2.6)连接到SQLite数据库时,有哪些策略可以确保程序打开了有效的数据库文件(这里的valid表示“匹配程序所期望的”)

我希望确保在一些打开检查之后,我可以(合理地)确保程序已打开一个数据库文件,该文件将按预期工作-理想情况下,如果文件是新的/空的,则创建所有内容,如果该文件是用于其他内容的数据库,则停止/警告,或者以其他方式损坏

我猜诀窍是将打开的文件的模式与程序中预期的模式进行比较?
如果是这样,你会怎么做?

否则,还应该做什么?

在我想要类似内容的解决方案中,我倾向于将
.sql
文件保存在与代码相同的目录中,包含数据库的构建说明,使用类似于以下结构:

# setup
PRAGMA foreign_keys=ON;
PRAGMA journal_mode=TRUNCATE;
PRAGMA locking_mode=EXCLUSIVE;
PRAGMA synchronous=NORMAL;

# Locations
CREATE TABLE IF NOT EXISTS Locations (
    locID INTEGER PRIMARY KEY,
    locPath TEXT NOT NULL
);
# blah-blah
CREATE UNIQUE INDEX IF NOT EXISTS fldPath_idx
ON Folders(fldPath);
# and so on
请注意,所有SQL语句都以分号结尾,作为行的最后一个非空白字符,因为我有类似于以下方法的代码,可以确保在每次应用程序启动时运行模式:

def db_schema(self):
    cur= self._db.cursor()
    with io.open(self.SQLPATH, "r") as fp:
        sql_statement= ""
        for line in fp:
            line= line.rstrip()
            if line.startswith('#'): continue
            sql_statement+= line
            if line.endswith(";"):
                try:
                    cur.execute(sql_statement)
                except sql.OperationalError:
                    print("Failed:\n%s" % sql_statement)
                sql_statement= ""
    # file is done
    cur.close()
请注意,
CREATE TABLE IF NOT EXISTS
CREATE INDEX IF NOT EXISTS

的使用SQLite有一个可以在数据库中存储任意数字的。通常,您会使用它来跟踪您自己的模式版本-例如,应用程序的第一个版本是1,当您更改三个应用程序版本的模式时,您会将其设置为2,以检测您的代码是否完成了模式升级


但是,您可以将其设置为任何起始值。例如,先从3656672354开始,然后添加到其中,用于内部版本跟踪。任何其他数据库的值在该范围内的可能性几乎为零。

这看起来很简单,看起来它可以用于新的/空的或有效的文件。但是,如果连接了“错误”的文件,这会给其他数据库文件添加不需要的表,是吗?我想这不是一个可能的或主要的问题,但我只是想知道是否有一个好的方法来检测这种情况?是的,它可能会将不需要的表添加到另一个数据库中。您总是可以从数据库中获取一个,如果不是空的,并且它与它们应该是什么不一致,您可以避免运行模式创建代码。