Elixir: PostgreSQL のデータを削除 (Delete)

Julia のプログラムを、ChatGPT と Gemini に渡して得られた結果です。

## Julia のプログラム

```jl:postgre_delete.jl
#
#	postgre_delete.jl
#
#						Mar/16/2024
# --------------------------------------------------------------------
using LibPQ
# --------------------------------------------------------------------
println("*** 開始 ***")
key_in = ARGS[1]
println(key_in)
#
str_connect = "dbname=city  host=127.0.0.1 user=scott password=tiger123 port=5432"
conn = LibPQ.Connection(str_connect)
command = "delete from cities where id = '" * key_in * "'"
println(command)
rr = execute(conn, command)
println(rr)
#
close(conn)
#
println("*** 終了 ***")
# --------------------------------------------------------------------
```

## ChatGPT が作成したプログラム

目視で NG と分かる結果でした。

```exs:lib/postgre_delete.ex
# postgre_delete.exs

# --------------------------------------------------------------------
defmodule PostgreDelete do
  def main(args) do
    IO.puts("*** 開始 ***")
    [key_in] = args
    key_in = String.trim(key_in)
    IO.puts(key_in)

    str_connect = "dbname=city host=127.0.0.1 user=scott password=tiger123 port=5432"
    {:ok, conn} = LibPQ.connect(str_connect)

    command = "delete from cities where id = '#{key_in}'"
    IO.puts(command)

    {:ok, _} = LibPQ.execute(conn, command)

    LibPQ.close(conn)

    IO.puts("*** 終了 ***")
  end
end

# --------------------------------------------------------------------
PostgreDelete.main(System.argv())
```

## Gemini が作成したプログラム
環境変数を読み込むようになっており、元のプログラムと同等ではありませんでした。

```exs:lib/postgre_delete.ex
defmodule PostgresDelete do

  # 環境変数からデータベース接続情報を読み込む
  @database Application.get_env(:my_app, :database)
  @user Application.get_env(:my_app, :user)
  @password Application.get_env(:my_app, :password)

  def main(key_in) do
    IO.puts("*** 開始 ***")
    IO.puts("#{key_in}")

    # Ecto.Adapters.Postgres を使って接続を確立する
    {:ok, conn} = Ecto.Adapters.Postgres.connect(
      database: @database,
      user: @user,
      password: @password,
      hostname: "localhost",
      port: 5432
    )

    # Ecto.Query を使って削除クエリを作成する
    query = Ecto.Query.delete(Cities, i: :id)
    query = query |> Ecto.Query.where([i: key_in])

    # クエリを実行し、結果を処理する
    {:ok, _} = Ecto.Repo.delete(conn, query)
    IO.puts("レコードが削除されました。")

    # 接続を閉じる
    Ecto.Adapters.Postgres.disconnect(conn)

    IO.puts("*** 終了 ***")
  end
end

# 例
key_in = "123"
PostgresDelete.main(key_in)
```

## 私が作成したプログラム

```exs:lib/postgre_delete.ex
defmodule PostgreDelete do

  def main([]) do
    IO.puts "*** 開始 ***"
    [key_in] = System.argv()
    IO.puts key_in
#
    {:ok, pid} = Postgrex.start_link(hostname: "localhost", username: "scott", password: "tiger123", database: "city")
#
    command = "delete from cities where id = '#{key_in}'"
    IO.puts command
    Postgrex.query!(pid, command, [])
#
    aa = Postgrex.query!(pid, "SELECT * FROM cities", [])

    IO.inspect aa
#
    IO.puts "*** 終了 ***"
  end

end
```

```exs:mix.exs
（省略）
	{:postgrex, "~> 0.17.5"},
（省略）
```

実行結果

```text
$ mix run -e "PostgreDelete.main([])" t3463
*** 開始 ***
t3463
delete from cities where id = 't3463'
%Postgrex.Result{
  command: :select,
  columns: ["id", "name", "population", "date_mod"],
  rows: [
    ["t3461", "広島", 32561, ~D[2013-04-30]],
    ["t3462", "福山", 81295, ~D[2013-08-10]],
    ["t3464", "呉", 73612, ~D[2013-02-09]],
    ["t3465", "尾道", 52391, ~D[2013-08-04]],
    ["t3466", "竹原", 95187, ~D[2013-01-21]],
    ["t3467", "三次", 31246, ~D[2013-07-23]],
    ["t3468", "大竹", 85791, ~D[2013-11-26]],
    ["t3469", "府中", 24139, ~D[2013-10-15]]
  ],
  num_rows: 8,
  connection_id: 36374,
  messages: []
}
*** 終了 ***
```