长生不老药,凤凰,埃克托:无法向我的表添加数据



我正试图将行添加到我创建的表"users"中,但我收到了以下错误:

iex(3)> user = %User{username: "mel", email: "mail"}
%Theme01.User{
__meta__: #Ecto.Schema.Metadata<:built, "user">,
id: nil,
email: "mail",
username: "mel",
clocks: #Ecto.Association.NotLoaded<association :clocks is not loaded>,
inserted_at: nil,
updated_at: nil
}
iex(4)> user = Repo.insert(User)
** (FunctionClauseError) no function clause matching in Ecto.Repo.Schema.insert/4
The following arguments were given to Ecto.Repo.Schema.insert/4:
# 1
Theme01.Repo
# 2
Theme01.Repo
# 3
Theme01.User
# 4
{%{
adapter: Ecto.Adapters.Postgres,
cache: #Reference<0.388300084.2616328193.258496>,
opts: [
repo: Theme01.Repo,
timeout: 15000,
pool_size: 10,
pool: DBConnection.ConnectionPool
],
pid: #PID<0.402.0>,
repo: Theme01.Repo,
sql: Ecto.Adapters.Postgres.Connection,
stacktrace: true,
telemetry: {Theme01.Repo, :debug, [:theme01, :repo, :query]}
},
[
stacktrace: [
{Ecto.Repo.Supervisor, :tuplet, 2,
[file: 'lib/ecto/repo/supervisor.ex', line: 162]},
{Theme01.Repo, :insert, 2, [file: 'lib/theme01/repo.ex', line: 2]},
{:elixir, :"-eval_external_handler/1-fun-2-", 4,
[file: 'src/elixir.erl', line: 298]},
{:erl_eval, :do_apply, 7, [file: 'erl_eval.erl', line: 748]},
{:erl_eval, :expr, 6, [file: 'erl_eval.erl', line: 492]},
{:elixir, :eval_forms, 3, [file: 'src/elixir.erl', line: 288]},
{Module.ParallelChecker, :verify, 1,
[file: 'lib/module/parallel_checker.ex', line: 107]},
{IEx.Evaluator, :eval_and_inspect, 3,
[file: 'lib/iex/evaluator.ex', line: 329]},
{IEx.Evaluator, :eval_and_inspect_parsed, 3,
[file: 'lib/iex/evaluator.ex', line: 303]},
{IEx.Evaluator, :parse_eval_inspect, 3,
[file: 'lib/iex/evaluator.ex', line: 292]},
{IEx.Evaluator, :loop, 1, [file: 'lib/iex/evaluator.ex', line: 187]},
{IEx.Evaluator, :init, 4, [file: 'lib/iex/evaluator.ex', line: 32]},
{:proc_lib, :init_p_do_apply, 3, [file: 'proc_lib.erl', line: 240]}
]
]}
Attempted function clauses (showing 2 out of 2):
def insert(repo, name, -%Ecto.Changeset{} = changeset-, tuplet)
def insert(repo, name, -%{__struct__: _} = struct-, tuplet)
(ecto 3.9.1) lib/ecto/repo/schema.ex:303: Ecto.Repo.Schema.insert/4
iex:4: (file)

这是我的表的模式:

defmodule Theme01.User do
use Ecto.Schema
import Ecto.Changeset
alias Theme01.Clock
schema "user" do
field :email, :string
field :username, :string
has_many(:clocks, Clock)
timestamps()
end
@doc false
def changeset(user, attrs) do
user
|> cast(attrs, [:username, :email])
|> validate_required([:username, :email])
end
end

这是迁移函数

defmodule Theme01.Repo.Migrations.CreateUser do
use Ecto.Migration
def change do
create table("users") do
add :username, :string, null: false
add :email, :string, null: false
timestamps()
end
create unique_index(:users, [:username])
end
end

我已经被困在这上面太久了,任何帮助都将不胜感激

我已经检查了我的表是否存在,当我在psql中运行\dt时,它们确实会出现。我还检查了我的config/dev.exs是否设置为正确的数据库。

Repo.insert(User)尝试将原子User(请参见标题框(插入到表中。

相反,您要创建一个Ecto.Changeset,然后将其插入到数据库中,有点像下面这样。

%User{}
|> User.changeset(attrs)
|> Repo.insert()

最新更新