Проверьте, что файл базы данных действителен и что ожидает программа? - PullRequest
4 голосов
/ 10 июня 2011

При подключении к базе данных SQLite из Python (используя Python 2.6), какие стратегии существуют, чтобы программа открыла действительный файл базы данных (где действительный здесь означает «соответствует тому, что ожидает программа»)?

Я хотел бы убедиться, что после некоторых проверок открытия я могу (разумно) быть уверенным, что программа открыла файл базы данных, который будет работать, как и ожидалось - в идеале CREATE все, если файл был новым / пустым и остановка / предупреждение, если файл является базой данных для чего-то другого, или иным образом поврежден.

Полагаю, хитрость в том, чтобы сравнить схему открытого файла с ожидаемой схемой в программе?
Если так, как бы вы поступили?
Иначе, что еще нужно сделать?

Ответы [ 2 ]

3 голосов
/ 11 июня 2011

SQLite имеет прагму user_version , которая будет хранить любое произвольное число в базе данных для вас. Обычно вы используете это для отслеживания вашей собственной версии схемы - например, первая версия приложения равна 1, а когда вы изменяете схему версии трех приложений позже, вы устанавливаете ее на 2, чтобы определить, что обновление кода выполнено вашим кодом.

Однако вы можете установить любое начальное значение. Например, начните с 3656672354 и добавьте его для внутреннего отслеживания версий. Вероятность того, что любая другая база данных имеет значение в этом диапазоне, практически равна нулю.

3 голосов
/ 10 июня 2011

В решениях, где мне нужно что-то подобное, я стараюсь держать файл .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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...