使用phoenix框架,将自动生成:id, :integer
。
http://www.phoenixframework.org/docs/ecto-custom-primary-keys
但我希望它不会自动生成并使用自定义ID字段,例如:id, :string
,就像这样
http://ruby-journal.com/how-to-override-default-primary-key-id-in-rails/
设置
defmodule MyApp.Item do
use MyApp.Web, :model
# @primary_key {:id, :id, autogenerate: false}
schema "items" do
field :id, :string, autogenerate: false # some unique id string
field :type, :integer
它引发了** (ArgumentError) field/association :id is already set on schema
https://github.com/elixir-lang/ecto/blob/db1f9ccdcc01f5abffcab0b5e0732eeecd93aa19/lib/ecto/schema.ex#L1327
答案 0 :(得分:10)
我遇到了两个问题。
@primary_key {:id, :id, autogenerate: false}
和fields :id
子句都不能在模式定义中。这是解决方案
defmodule MyApp.Item do
use MyApp.Web, :model
@primary_key {:id, :string, []}
schema "items" do
# field :id, :string <- no need!
喜欢这个
defmodule MyApp.Repo.Migrations.CreateItem do
use Ecto.Migration
def change do
create table(:items, primary_key: false) do
add :id, :string, primary_key: true
最后,我可以执行mix ecto.migrate
并可以获得下面的表格定义
mysql> SHOW CREATE TABLE items;
| items | CREATE TABLE `builds` (
`id` varchar(255) NOT NULL,
官方文件肯定会说明这一点 http://www.phoenixframework.org/docs/ecto-custom-primary-keys
让我们首先看看迁移,priv / repo / migrations / 20150908003815_create_player.exs。我们需要做两件事。第一个是将第二个参数 - primary_key:false传递给table / 2函数,以便它不会创建primary_key。然后我们需要将primary_key:true传递给name字段的add / 3函数,以表示它将是primary_key。
但是一开始,您不想要列id
,您只需要迁移create table(:items, primary_key: false)
,并编辑架构
defmodule MyApp.Item do
use MyApp.Web, :model
# @primary_key {:id, :string, []}
@primary_key false # to avoid unnecessary IO scanning
schema "items" do
# field :id, :string <- no need!
虽然自我解决,但无论如何,谢谢