เริ่มตอนแรกด้วยการสร้าง 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
มี 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
จากนั้นเราก็ต้อง 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
ส่วนข้อมูลที่เรากำหนดก็เป็น 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
เท่านี้เราก็ได้ 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: []
}}
ตอนแรกจบไว้เท่านี้ ต่อไปเดี๋ยวมาดูเรื่อง migration กัน
Top comments (1)
Thank youuuuuu.