是否有任何方法可以在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