DEV Community

loading...

Elixir ต่อฐานข้อมูลด้วย Ecto ตอนที่ 1

Weerasak Chongnguluam
Software Developer/Love to code/Teaching to code
Updated on ・1 min read

เริ่มตอนแรกด้วยการสร้าง Repo สำหรับเชื่อมต่อกับ DB

สำหรับบทความชุดนี้จะสมมติว่าคนอ่านนั้นสามารถสร้าง mix project เป็นแล้ว

เริ่มแรกเราเพิ่ม dependencies ให้กับ mix project ของเราก่อน

  # Run "mix help deps" to learn about dependencies.
  defp deps do
    [
      {:ecto, "~> 3.5.5"},
      {:ecto_sql, "~> 3.5.3"},
      {:myxql, "~> 0.4.5"}
    ]
  end
Enter fullscreen mode Exit fullscreen mode

มี 3 dependencies หลักๆคือ :ecto, :ecto_sql และ :myxql ที่เป็น adapter library ในการเชื่อมต่อกับ MySQL

จากนั้นให้เราสร้าง repository module ขึ้นมา โดยที่เราจะ use Ecto.Repo เพื่อทำให้ module นี้เราเป็น repository module พร้อมกับ configure ว่าให้ Repo ไปอ่านค่า config จาก otp app อะไร และใช้ adapter ไหนในการเชื่อม

ตัวอย่างโค้ดเป็นแบบนี้

defmodule EctoSample.Repo do
  use Ecto.Repo,
    otp_app: :ecto_sample,
    adapter: Ecto.Adapters.MyXQL
end
Enter fullscreen mode Exit fullscreen mode

จากนั้นเราก็ต้อง configure ค่าต่างๆเกี่ยวกับการ connect DB ที่ config/config.exs โดยให้ configurations อยู่ภายใต้ application environment ของ OTP App เราคือ :ecto_sample โค้ดที่คีย์ของ configuration คือ repository module เช่น

import Config

config :ecto_sample, EctoSample.Repo,
  database: "test",
  username: "root",
  password: "password",
  hostname: "localhost",
  port: 3306
Enter fullscreen mode Exit fullscreen mode

ส่วนข้อมูลที่เรากำหนดก็เป็น keyword list ที่ประกอบไปด้วย ชื่อ database, username, password, hostname และ port ที่เราต้องการเชื่อมต่อ

ต่อไปเราต้องเพิ่มให้ repository module นั้น start process ภายใต้ application's supervisor หลักโดยที่เปิดไฟล์ application module ขึ้นมา เพิ่ม EctoSample.Repo ไปเป็น children spec อีกอันแบบนี้

defmodule EctoSample.Application do
  @moduledoc false

  use Application

  @impl true
  def start(_type, _args) do
    children = [
      EctoSample.Repo
    ]

    opts = [strategy: :one_for_one, name: EctoSample.Supervisor]
    Supervisor.start_link(children, opts)
  end
end
Enter fullscreen mode Exit fullscreen mode

เท่านี้เราก็ได้ repository module ที่พร้อมจะ connect กับ DB และส่ง query แล้ว ทดสอบส่ง query ดูโดยรัน iex ขึ้นมาแบบนี้ iex -S mix แล้วเรียกฟังก์ชัน EctoSample.Repo.query แบบนี้

iex(1)> EctoSample.Repo.query("SHOW TABLES")

07:32:22.702 [debug] QUERY OK db=2.3ms queue=6.1ms idle=1461.2ms
SHOW TABLES []
{:ok,
 %MyXQL.Result{
   columns: ["Tables_in_test"],
   connection_id: 767,
   last_insert_id: nil,
   num_rows: 0,
   num_warnings: 0,
   rows: []
 }}
Enter fullscreen mode Exit fullscreen mode

ตอนแรกจบไว้เท่านี้ ต่อไปเดี๋ยวมาดูเรื่อง migration กัน

Buy Me A Coffee

Discussion (1)

Collapse
epsi profile image
E.R. Nurwijayadi

Thank youuuuuu.