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

时间:2011-06-10 09:32:05

标签: python sqlite

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

我想确保在进行一些开放检查后,我可以(合理地)确定程序已经打开了一个可以按预期工作的数据库文件 - 理想情况是CREATE如果文件是新的/ {如果文件是其他内容的数据库,则为空并停止/警告。

我猜测诀窍是将打开的文件架构与程序中的预期架构进行比较? 如果是这样,你会怎么做? 否则,还应该做些什么?

2 个答案:

答案 0 :(得分:3)

在我想要类似的东西的解决方案中,我倾向于将.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 EXISTSCREATE INDEX IF NOT EXISTS

答案 1 :(得分:3)

SQLite有一个pragma user_version,可以为您存储数据库中的任意数字。通常情况下,您可以使用它来跟踪自己的架构版本 - 例如,应用程序的第一个版本为1,当您更改架构后,将三个应用程序版本设置为2以检测架构升级已由您的代码完成。

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