使用 Ecto 在运行时创建 table

Create table at runtime with Ecto

根据这个问题 – – 可以使用 Module.create.

在 Elixir 中动态创建模型

是否也可以在运行时在数据库中为此模型创建一个 table,即不使用 Ecto 迁移文件?

PostgreSQLMySQL 适配器 Ecto 2.0+ 能够执行原始 SQL:

qry =
  """
  CREATE TABLE `users` (
    `id` int(11) NOT NULL AUTO_INCREMENT,
    `name` varchar(255) DEFAULT NULL,
    PRIMARY KEY (`id`)
  ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
  """

res = Ecto.Adapters.SQL.query!(Repo, qry, [])

Ecto.Adapters.SQL.query/4.

另一种(可能是首选)方法是将其委托给底层 mysql shell 可执行文件:

System.cmd("mysql", ["#{create_table_script}"])

在你的情况下(每月创建新报告 table)我会放弃创建数据库 table 的想法并考虑使用 ETS / DETS 组合。它们是键值存储(ETS - 内存中,DETS - 保存在磁盘上的数据 - 这是你基本上需要的),你可以阅读更多关于它们的信息 here.