是否有任何方法可以在Phoenix中動態創建和使用模型?我有一個應用程序存儲有關客戶端表格的元數據:他們設置了一些字段(列名稱和類型),然後將CSV文件發送給解析和存儲。從存儲的元數據中,我想生成一個模型,以便我可以使用Ecto來管理客戶端表並對其執行查詢。Phoenix Framework中的動態模型
我來自Django背景,我可以使用內置的ORM和type()
函數即時創建模型,然後使用它們而不必在應用程序中生成遷移或其他模型代碼。
在Python中,我將(大致)做:
class MetaModel(models.Model):
table_name = models.CharField(...)
model_name = models.CharField(...)
field_defs = JSONField(...)
def resolve_fields(self):
# takes values from `field_defs` and converts them into
# django field instances
def get_model(self):
class Meta:
app_label = 'dynamic'
db_table = self.table_name
fields = self.resolve_fields()
attrs = {'__module__': 'dynamic', 'Meta': Meta}
attrs.update(fields)
model = type(self.model_name, (models.Model,), attrs)
return model
def create_table(self):
with connection.schema_editor() as se:
model = self.get_model()
se.create_model(model)
就這樣,我能夠在數據庫中創建表,然後充分利用ORM與客戶端提供的數據工作。
我知道我可以用原始SQL做這件事,只是使用Ecto來運行命令和查詢,但我想讓它更加規範化,依賴於Ecto的內部,而不是編寫和維護一堆SQL模板。
任何建議(即使是「不行,你不能這樣做」)是超級有用的。謝謝!
這是真的很酷,你會如何去重新定義一個特定的模塊? – webdeb
明白了,您可以用相同的名稱/原子覆蓋模塊 – webdeb
這非常棒!非常感謝你! – vforgione