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