使用 Ecto 在运行时创建表

Edu*_*oel 4 elixir ecto

根据这个问题——Phoenix Framework 中的动态模型——可以在 Elixir 中使用Module.create.

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

Ale*_*kin 5

PostgreSQL和2.0+ 的MySQL适配器Ecto具有执行原始 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, [])
Run Code Online (Sandbox Code Playgroud)

Ecto.Adapters.SQL.query/4.

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

System.cmd("mysql", ["#{create_table_script}"])
Run Code Online (Sandbox Code Playgroud)

  • Ecto 3+ 的新链接:[`Ecto.Adapters.SQL.query/4`](https://hexdocs.pm/ecto_sql/Ecto.Adapters.SQL.html#query!/4) 该函数已从ecto 包到 ecto_sql 包 (2认同)