在解決方案,我想類似的東西,我傾向於保持一個.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
。
這看起來很直觀,看起來像它將適用於新的/空的或有效的文件。但是,如果連接了「錯誤」文件,那麼可能會將不需要的表添加到其他數據庫文件,是的?我想這不是一個可能的或主要的問題,但我只是想知道是否有一種很好的方法來檢測這種情況呢? – DMA57361 2011-06-10 11:42:10
是的,它有冒險添加不需要的表到另一個數據庫。你總是可以從數據庫獲得[現有表的列表](http://www.sqlite.org/faq.html#q7),如果不是空的,它不同意它們應該是什麼,你可以避免運行架構創建代碼。 – tzot 2011-06-10 13:07:07