2013-03-18 70 views
0

我需要向數據庫寫入很多簡單的記錄,並使用orm方法,因爲它非常慢,所以我決定嘗試原始SQL。我寫了代碼,這裏是:使用原始數據庫時數據庫沒有變化

for row in rows: 
    name = row.split('\t')[0].lower() 
    print name 
    try: 
     cursor.execute("INSERT INTO domain_browser_domain (name) VALUES (%s)", [name]) 
    except django.db.utils.IntegrityError: 
     continue 

問題是......它實際上並沒有寫入任何數據庫。字段name被定義爲唯一,所以當execute方法不在try塊中時,它返回IntegrityError,因爲數據庫中已經有一些記錄。

+0

哪個DBMS?在一些你必須明確提交 – Jacopofar 2013-03-18 13:32:23

+0

那麼你得到什麼數據庫錯誤? – Sergio 2013-03-18 13:33:20

+0

我沒有得到任何python例外。我使用SQLite。 – 2013-03-18 14:31:52

回答

0

你似乎已經回答了你自己的問題。您無法將新行插入數據庫,因爲它違反了數據庫本身內的完整性約束。這不是Django阻止你做某事的一個實例。相反,Django正在解釋從數據庫返回的錯誤。

+0

還有很多數據實際上不在表格中,但它們也沒有寫入數據庫。 – 2013-03-18 14:36:25

0

我想你需要在name變量中的每個值之後加逗號。由於您的查詢是現在構建它最終會看起來像這樣:

INSERT INTO domain_browser_domain (name) VALUES (one two three)沒有逗號。

您需要在執行它之前格式化您的查詢。

打印語句的輸出是什麼?

0

使用transaction.commit_unless_managed()cursor.execute()。一切正常,但它的表現仍然非常糟糕。我讀過的地方是,因爲SQLite每次執行代碼時都會打開文件,並在剛剛關閉文件之後立即打開文件。因此,如果您真的需要加快執行操作 - 只需使用bulk_create()方法,則在documentation中進行了說明。