使用 Ecto 在运行时创建 table
Create table at runtime with Ecto
根据这个问题 – – 可以使用 Module.create
.
在 Elixir 中动态创建模型
是否也可以在运行时在数据库中为此模型创建一个 table,即不使用 Ecto 迁移文件?
PostgreSQL
和 MySQL
适配器 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, [])
另一种(可能是首选)方法是将其委托给底层 mysql
shell 可执行文件:
System.cmd("mysql", ["#{create_table_script}"])
在你的情况下(每月创建新报告 table)我会放弃创建数据库 table 的想法并考虑使用 ETS / DETS 组合。它们是键值存储(ETS - 内存中,DETS - 保存在磁盘上的数据 - 这是你基本上需要的),你可以阅读更多关于它们的信息 here.
根据这个问题 – Module.create
.
是否也可以在运行时在数据库中为此模型创建一个 table,即不使用 Ecto 迁移文件?
PostgreSQL
和 MySQL
适配器 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, [])
另一种(可能是首选)方法是将其委托给底层 mysql
shell 可执行文件:
System.cmd("mysql", ["#{create_table_script}"])
在你的情况下(每月创建新报告 table)我会放弃创建数据库 table 的想法并考虑使用 ETS / DETS 组合。它们是键值存储(ETS - 内存中,DETS - 保存在磁盘上的数据 - 这是你基本上需要的),你可以阅读更多关于它们的信息 here.