【发布时间】:2018-04-01 20:54:45
【问题描述】:
有没有办法在 Phoenix 中动态创建和使用模型?我有一个存储有关客户表的元数据的应用程序:他们设置了一些字段(列名和类型),然后将 CSV 文件发送给我以进行解析和存储。从存储的元数据中,我想生成一个模型,以便我可以使用 Ecto 管理客户端表并对其执行查询。
我来自 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 模板.
任何建议(即使是“不,你不能那样做”)都非常有帮助。谢谢!
【问题讨论】:
标签: elixir phoenix-framework ecto