2010-01-26 74 views
31

如何處理SQLAlchemy中的錯誤?我對SQLAlchemy比較陌生,現在還不知道。在SQLAlchemy中處理錯誤

之前,我使用SQLAlchemy的,我會做這樣的事情

status = db.query("INSERT INTO users ...") 
if (!status): 
    raise Error, db.error 

但現在我在SQLAlchemy的編碼我,我不喜歡的東西

user = User('Boda Cydo') 
session.add(user) 
session.commit() 

沒有任何錯誤檢查!

我不喜歡這種沒有錯誤檢查的編碼風格。

請諮詢如何檢查和處理SQLAlchemy中的錯誤!

此致,Boda Cydo。

+0

看看例如在sqlalchemy.org http://www.sqlalchemy.org/trac/wiki/UsageRecipes/UniqueConstraintExceptionHandling – 2010-01-26 14:22:48

回答

54

你舉的例子說:

status = db.query("INSERT INTO users ...") 
if (!status): 
    raise Error, db.error 

這似乎意味着,要引發異常,如果有對查詢的一些錯誤(與raise Error, db.error)。然而,sqlalchemy已經爲你做了 - 所以

user = User('Boda Cydo') 
session.add(user) 
session.commit() 

是一樣的。 Check-and-raise部分已經在SQLAlchemy中。

這裏是錯誤的SQLAlchemy本身可以提高,從help(sqlalchemy.exc)help(sqlalchemy.orm.exc)採取的列表:

  • sqlalchemy.exc
    • ArgumentError - 時提供了無效或有衝突的函數參數引發。 此錯誤通常對應於施工時間狀態錯誤。
    • CircularDependencyError - 當檢測
    • CompileError循環依賴由拓撲排序引發 - 凸起時SQL編譯期間
    • ConcurrentModificationError
    • DBAPIError發生錯誤 - 凸起當數據庫操作的執行失敗。 如果在執行SQL 語句時發生錯誤提升操作,則該語句及其參數將在statementparams屬性中的 例外對象上可用。 包裝的異常對象在orig屬性中可用。 其類型和屬性是特定於DB-API實現的。
    • DataError包裝DB-API DataError
    • DatabaseError - 包裝DB-API DatabaseError
    • DisconnectionError - 在原始DB-API連接上檢測到斷開連接。 將由PoolListener引發,以便主機池強制斷開連接。
    • FlushError
    • IdentifierError - 當一個模式名稱超出了字符數上限
    • IntegrityError募集 - 包裝了DB-API IntegrityError
    • InterfaceError - 包裝一個DB-API InterfaceError
    • InternalError - 包裝DB-API InternalError
    • InvalidRequestError - SQLAlchemy被要求做一些它不能做的事情。此錯誤通常對應於運行時狀態錯誤。
    • NoReferenceError - 引發ForeignKey表示引用無法解析。
    • NoReferencedColumnError - 由ForeignKey提出時引用Column無法找到。
    • NoReferencedTableError - 由ForeignKey引用時,提到的Table無法找到。
    • NoSuchColumnError - 從RowProxy請求不存在的列。
    • NoSuchTableError - 表格不存在或對連接不可見。
    • NotSupportedError - 包裝一個DB-API NotSupportedError
    • OperationalError - 包裝DB-API OperationalError
    • ProgrammingError - 包裝DB-API ProgrammingError
    • SADeprecationWarning - 根據不推薦使用的API的使用情況發佈一次。
    • SAPendingDeprecationWarning - 根據不推薦使用的API的使用情況發佈一次。
    • SAWarning - 在運行時發佈。
    • SQLAlchemyError - 通用錯誤類。
    • SQLError - 執行數據庫操作失敗時引發。
    • TimeoutError - 在連接池超時獲取連接時引發。
    • UnboundExecutionError - 試圖在沒有數據庫連接的情況下執行SQL。
    • UnmappedColumnError
  • sqlalchemy.orm.exc
    • ConcurrentModificationError - 行已被修改工作單位之外。
    • FlushError - 在flush()期間檢測到無效條件。
    • MultipleResultsFound - 需要單個數據庫結果,但找到了多個結果。
    • NoResultFound - 數據庫結果是必需的,但沒有找到。
    • ObjectDeletedError - 刷新()操作無法重新檢索對象的行。
    • UnmappedClassError - 一個未知類的請求映射操作。
    • UnmappedColumnError - 在未知列上請求映射操作。
    • UnmappedError - TODO
    • UnmappedInstanceError - 對未知實例請求映射操作。
2

的SQLAlchemy將提高對錯誤的異常....

+0

你能告訴更多? – bodacydo 2010-01-26 00:35:57

+0

異常有兩個不同的模塊 - sqlalchemy.exc和sqlalchemy.orm.exc。 發生錯誤時會自動產生異常,這與您的示例中的代碼不同,您必須自己執行該代碼。 – tholo 2010-01-26 03:44:49