2012-09-01 59 views
1

我已經定義了一個名爲File的新列類型,它應該讓我只在數據庫中存儲文件名。然後我會將實際文件存儲在文件系統的根目錄+子文件夾+名稱中。如何在運行時將變量傳遞給SQLAlchemy ORM定義?

File(root, subfolder="", max_length=100, **kwargs) 

我遇到的問題是,我想在PasteDeploy配置文件中定義根。我如何在運行時定義這個,以便我可以訪問配置?

回答

2

對我來說這聽起來像你的模式需要更多的思考。即使您實現了自定義列類型,該類型仍然必須映射到您的引擎支持的SQL列類型。對於文件夾和文件名,這是最自然的兩列varchar列。那麼,爲什麼不使用兩個字段,pathfilename,這兩個字段都是String(256)在你的班級?

至於可配置的根,這聽起來像你想指定path相對於這個根,所以你可以只在一個地方改變它。除了配置文件中存儲的一件事外,在數據庫中擁有大部分配置對我來說都是一種代碼異味。我認爲最好是將根作爲其他配置表中的一列,並使用ForeignKey來指向那個根。

+0

感謝您的解釋,我找不出正確的方式來配置數據庫模式。這將使金字塔部署之外的事情變得更加有用。 – GhotiPhud

+0

在金字塔中,通常在INI文件中具有與部署相關的所有配置。這不是一種代碼味道。想象一下,如果你想將生產環境複製到開發服務器中。首先,你做一個數據庫的備份/恢復。接下來,您將複製存儲所有文件的根文件夾。最後,使用數據庫和根文件夾的位置修改dev INI文件。完成。無需SQL UPDATE。 – sayap

3

爲什麼不避免自定義列類型的複雜性,只是將文件路徑存儲爲列,並提供一些可以爲您加載文件數據的屬性或混合屬性?

class Data(Base): 
    path = Column(String) 

def myview(request): 
    data = Data(path='foo') 

    root_path = request.registry.settings['data_root'] 
    with open(os.path.join(root_path, data.path), 'rb') as fp: 
     file_data = fp.read() 
    # ... 

很明顯,如果你願意,你可以將一些功能包裝到數據的方法上。

反正訪問INI設置的方法是執行下列操作之一:在從設置/配置對象應用程序的啓動

  1. 請求期間,您可以通過設置從request.registry.settings
  2. 在請求期間,您可以通過pyramid.threadlocal.get_current_request()訪問活動請求,然後您可以從中獲取設置。
+0

爲我清除了一些東西,謝謝! – GhotiPhud