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

DMA*_*361 5 python sqlite

当从Python(使用Python 2.6)连接到SQLite数据库时,有什么策略可以确保程序打开有效的数据库文件(这里的有效意味着“与程序期望的匹配”)?

我想确保在进行一些打开检查后,我可以(合理地)确保程序已打开一个将按预期工作的数据库文件 - 理想情况CREATE下,如果文件是新的/空的,则停止/警告文件是其他东西的数据库,或者以其他方式损坏。

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

tzo*_*zot 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
Run Code Online (Sandbox Code Playgroud)

只需注意所有 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()
Run Code Online (Sandbox Code Playgroud)

CREATE TABLE IF NOT EXISTS注意和的使用CREATE INDEX IF NOT EXISTS