2016-11-06 71 views
1

我最近在使用python orm peewee時遇到了交易問題。我使用這個orm保存了兩個book實例,並且在兩個節省之間我引發了一個異常,所以我除了沒有將它們保存到數據庫,但它不起作用。誰能解釋爲什麼?我是python的新手,謝謝。Peewee交易似乎不起作用

這個代碼如下:

from peewee import * 

def get_db(): 
    return SqliteDatabase("test.db") 

class Book(Model): 
    id = PrimaryKeyField() 
    name = CharField() 
    class Meta: 
     database = get_db() 

def test_transaction(): 
    book1 = Book(name="book1") 
    book2 = Book(name="book2") 

    db = get_db() 
    db.create_tables([Book], safe=True) 

    try: 
     with db.transaction() as tran: 
      book1.save() 
      raise ProgrammingError("test") 
      book2.save() 
    except: 
     pass 

    for book in Book.select(): 
     print(book.name) 


if __name__ == '__main__': 
    test_transaction() 
+0

錯字,我期待(我的英文很差,:))。此外,輸出是book1,但預期的結果是沒有輸出。 –

回答

1

的問題是,當你調用「get_db()」你是新實例化的數據庫對象。數據庫是有狀態的,因爲它們管理給定線程的活動連接。所以你基本上得到的是兩個不同的數據庫,一個是你的模型與之相關的,另一個是你的連接和交易。當您致電db.transaction()時,交易正在進行,但不是您認爲的交易。

將代碼更改爲如下所示,它會按照您的預期工作。

book1 = Book(name='book1') 
book2 = Book(name='book2') 

db = Book._meta.database 
# ... 
+0

Coleifer,謝謝你的解釋。它工作,我現在知道它。 –