2012-06-27 310 views
19

我正在使用SQlAlchemy。我想刪除數據庫中有效存在的所有記錄,但我不想刪除表/數據庫。如何清理數據庫,使用sqlalchemy刪除所有記錄?

我試着用下面的代碼。

con = engine.connect() 
trans = con.begin() 

con.execute(table.delete()) 
trans.commit() 

看來,它不是非常有效的一個,因爲我遍歷所有存在於數據庫表。 有人可以建議我這樣做的更好和有效的方式嗎?

任何形式的幫助在這裏非常感謝。

+0

對於某些數據庫存在 '截斷' 的語句。它重新創建表並且工作得更快,而不是事務性的。您可以使用engine.execute('''truncate tablename''')來執行原始SQL。 – varela

+0

@Varela感謝您分享您的想法我想以適用於所有數據庫的方式編寫方法/函數。由於'truncate'依賴於數據庫,因此它不是我的第一選擇。 – Rakesh

+1

然後沒有什麼比這更好的了,你不能省略遍歷表並刪除可能適用於所有DB的唯一語句。 – varela

回答

22

如果您的模型依賴於現有的數據庫模式(通常使用autoload=True),則無法避免刪除每個表中的數據。 MetaData.sorted_tables就派上用場了:

for tbl in reversed(meta.sorted_tables): 
    engine.execute(tbl.delete()) 

如果你的模型做定義完整的架構,沒有什麼比drop_all/create_all簡單(如已經指出的@ jadkik94)。

此外,TRUNCATE反正不適用於ForeignKeys所引用的表格,這會明顯限制使用量。

+0

嗨。出於某種原因,我的'meta.tables'或'meta.sorted_tables'是一個空列表。我有'meta = sqlalchemy.MetaData(bind = engine)'。爲什麼數據庫有表時顯示爲空? –

+1

如果你沒有定義綁定到這個'meta'的模型,那就沒有任何東西。但是如果你不想定義模型,並想從數據庫中「反映」它們,你需要調用['MetaData.reflect'](http://docs.sqlalchemy.org/en/rel_0_7/core/ schema.html#sqlalchemy.schema.MetaData.reflect)first – van

+0

哇,謝謝你的幫忙!還有一個問題,如果你不介意的話。現在爲了得到表格實例,我可以執行'meta.tables ['tasks']',但這意味着我必須記住類名('Tasks')和表名'tasks'。有什麼辦法可以避免這種情況? –

7

對我來說,把tbl.drop(engine)工作,但不是engine.execute(tbl.delete())

SQLAlchemy的0.8.0b2和 的Python 2.7.3

相關問題