2017-01-09 37 views
1

我正在寫一個django項目,它廣泛使用了我正在編寫的python包(爲方便起見我們稱之爲foo)。開發一個使用第三方DBAL包的Django項目

python軟件包foo將主要包含從後端數據庫獲取數據的函數和類。我想以這樣一種方式編寫包,使其不依賴於django - 並且可以在django之外的其他項目中使用。

我正在考慮編寫軟件包,以便函數接受數據庫連接 - 並且類使用IoC作爲數據庫連接 - 這樣,我可以從django獲取數據庫連接並將其傳遞給DBAL包 - 使用它時在django中,當在django外部使用該包時,通過其他方式實例化數據庫連接。

我有兩個問題:

  1. 這是處理這個問題(即無陷阱)
  2. 在哪裏/我如何獲得的Django內的數據庫連接的一種可接受的方式?

回答

0

您可以從Django的一個光標對象,像這樣:

from django.db import connection 

def my_custom_sql(self): 
    with connection.cursor() as cursor: 
     cursor.execute("UPDATE bar SET foo = 1 WHERE baz = %s", [self.baz]) 
     cursor.execute("SELECT foo FROM bar WHERE baz = %s", [self.baz]) 
     row = cursor.fetchone() 

    return row 

這個例子是從自己的文件採取自定義的SQL查詢here

在被寫一個能夠接受的方式條款包,當然。首先,它只是一個寬鬆的Dependency Injection,使得單元測試更容易。

唯一的問題是你的包的用戶傳入的遊標可能不會呈現相同的接口。 SQLAlchemy遊標可能不具有與Django ORM遊標相同的屬性和方法。

我會說確保對象符合您所需的接口是一個可接受的負擔推到用戶,只要你徹底記錄什麼對象應該公開。

如果您發現這樣做會很有價值,您可以隨時爲最受歡迎的選項提供自定義解決方法。 (例如提供您自己的遊標適配器類)。

相關問題