我已經定義了一個名爲File的新列類型,它應該讓我只在數據庫中存儲文件名。然後我會將實際文件存儲在文件系統的根目錄+子文件夾+名稱中。如何在運行時將變量傳遞給SQLAlchemy ORM定義?
File(root, subfolder="", max_length=100, **kwargs)
我遇到的問題是,我想在PasteDeploy配置文件中定義根。我如何在運行時定義這個,以便我可以訪問配置?
我已經定義了一個名爲File的新列類型,它應該讓我只在數據庫中存儲文件名。然後我會將實際文件存儲在文件系統的根目錄+子文件夾+名稱中。如何在運行時將變量傳遞給SQLAlchemy ORM定義?
File(root, subfolder="", max_length=100, **kwargs)
我遇到的問題是,我想在PasteDeploy配置文件中定義根。我如何在運行時定義這個,以便我可以訪問配置?
對我來說這聽起來像你的模式需要更多的思考。即使您實現了自定義列類型,該類型仍然必須映射到您的引擎支持的SQL列類型。對於文件夾和文件名,這是最自然的兩列varchar
列。那麼,爲什麼不使用兩個字段,path
和filename
,這兩個字段都是String(256)
在你的班級?
至於可配置的根,這聽起來像你想指定path
相對於這個根,所以你可以只在一個地方改變它。除了配置文件中存儲的一件事外,在數據庫中擁有大部分配置對我來說都是一種代碼異味。我認爲最好是將根作爲其他配置表中的一列,並使用ForeignKey
來指向那個根。
爲什麼不避免自定義列類型的複雜性,只是將文件路徑存儲爲列,並提供一些可以爲您加載文件數據的屬性或混合屬性?
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設置的方法是執行下列操作之一:在從設置/配置對象應用程序的啓動
request.registry.settings
。pyramid.threadlocal.get_current_request()
訪問活動請求,然後您可以從中獲取設置。爲我清除了一些東西,謝謝! – GhotiPhud
感謝您的解釋,我找不出正確的方式來配置數據庫模式。這將使金字塔部署之外的事情變得更加有用。 – GhotiPhud
在金字塔中,通常在INI文件中具有與部署相關的所有配置。這不是一種代碼味道。想象一下,如果你想將生產環境複製到開發服務器中。首先,你做一個數據庫的備份/恢復。接下來,您將複製存儲所有文件的根文件夾。最後,使用數據庫和根文件夾的位置修改dev INI文件。完成。無需SQL UPDATE。 – sayap