Ecto এবং Database Integration in Elixir
Ecto হল Elixir তে ব্যবহৃত একটি শক্তিশালী ডেটাবেস লাইব্রেরি যা ডেটাবেস ইন্টিগ্রেশন, মাইগ্রেশন, এবং স্কিমা পরিচালনা করতে ব্যবহৃত হয়। এটি Elixir প্রোগ্রামিং ভাষার জন্য একটি ফাংশনাল এবং ডিক্ল্যারেটিভ ডেটাবেস লাইব্রেরি, যা SQL এবং NoSQL ডেটাবেসের সাথে সহজে কাজ করতে সক্ষম।
এখানে, আমরা Ecto এর মাধ্যমে Database Integration কীভাবে করা হয়, সেটি বিস্তারিতভাবে আলোচনা করবো।
1. Ecto Overview
Ecto হল একটি database wrapper এবং query builder যা Elixir প্রোগ্রামিং ভাষার জন্য তৈরি করা হয়েছে। এটি আপনার ডেটাবেসের সাথে যোগাযোগ করতে সাহায্য করে, মডেল তৈরি করতে, কোয়েরি রচনা করতে এবং ডেটা পরিচালনা করতে।
- Ecto.Repo: ডেটাবেসের সাথে সংযোগ স্থাপন এবং ডেটা ইন্টেরেক্ট করার জন্য ব্যবহৃত হয়।
- Ecto.Schema: ডেটাবেস টেবিল বা কালেকশনগুলির জন্য স্কিমা তৈরি করতে ব্যবহৃত হয়।
2. Ecto সেটআপ এবং কনফিগারেশন
Ecto ইনস্টলেশন:
প্রথমে Ecto এবং Ecto.SQL এর ইনস্টলেশন প্রয়োজন।
আপনার Elixir প্রোজেক্টে Ecto ইনস্টল করতে mix.exs ফাইলে ডিপেনডেন্সি যোগ করুন:
defp deps do
[
{:ecto_sql, "~> 3.7"},
{:postgres, ">= 0.0.0"} # For PostgreSQL. For other databases, change the adapter
]
endএখানে, ecto_sql ব্যবহার করা হয়েছে কারণ আমরা SQL ডেটাবেস ব্যবহার করছি। আপনি যদি PostgreSQL ব্যবহার করেন, তবে postgres ডিপেনডেন্সি যুক্ত করা হয়েছে।
তারপর, ডিপেনডেন্সি ইনস্টল করতে mix deps.get চালান।
Repo কনফিগারেশন:
আপনার config/config.exs ফাইলে ডেটাবেস সংযোগের কনফিগারেশন করুন।
config :my_app, MyApp.Repo,
username: "postgres",
password: "postgres",
database: "my_app_db",
hostname: "localhost",
pool_size: 10এখানে, আপনার PostgreSQL ডেটাবেসের কনফিগারেশন যুক্ত করা হয়েছে।
3. Ecto.Schema এবং Database Table Mapping
Ecto.Schema:
Ecto.Schema ব্যবহার করে ডেটাবেস টেবিল বা কালেকশনগুলির স্কিমা তৈরি করা হয়। এটি Elixir এর structs এর মতো কাজ করে এবং টেবিলের কলামগুলির মান ধারণ করে।
Schema উদাহরণ:
defmodule MyApp.User do
use Ecto.Schema
import Ecto.Changeset
schema "users" do
field :name, :string
field :email, :string
field :age, :integer
timestamps() # Adds inserted_at and updated_at fields
end
def changeset(user, attrs) do
user
|> cast(attrs, [:name, :email, :age])
|> validate_required([:name, :email, :age])
end
endএখানে, MyApp.User স্কিমা তৈরি করা হয়েছে যা users টেবিলের জন্য। timestamps() ফাংশনটি inserted_at এবং updated_at ফিল্ডগুলো অটোমেটিকালি যোগ করে।
4. Ecto.Repo - Database Interaction
Ecto.Repo ডেটাবেসে ডেটা সন্নিবেশ, আপডেট, ডিলিট এবং কোয়েরি করার জন্য ব্যবহৃত হয়। এটি Elixir এর জন্য SQL Query Builder হিসাবে কাজ করে।
Repo কনফিগারেশন:
প্রথমে আপনার Repo মডিউল তৈরি করুন:
defmodule MyApp.Repo do
use Ecto.Repo,
otp_app: :my_app,
adapter: Ecto.Adapters.Postgres
endএখানে, Ecto.Repo ব্যবহার করা হয়েছে যা Postgres ডেটাবেসের জন্য অ্যাডাপ্টার হিসেবে কাজ করবে।
Repo মডিউলের মাধ্যমে ডেটাবেস অপারেশন:
Insert:
%MyApp.User{name: "Alice", email: "alice@example.com", age: 30}
|> MyApp.Repo.insert()এখানে, MyApp.User মডেলটির একটি নতুন ইনস্ট্যান্স তৈরি করে insert অপারেশন করা হয়েছে।
Query:
# Get all users
users = MyApp.Repo.all(MyApp.User)
# Get a user by ID
user = MyApp.Repo.get(MyApp.User, 1)
# Query with filters
young_users = MyApp.Repo.all(from u in MyApp.User, where: u.age < 30)এখানে, MyApp.Repo.all/1 এবং MyApp.Repo.get/2 ব্যবহার করে ডেটা রিট্রিভ করা হয়েছে। Ecto.Query এর মাধ্যমে filtering ও joining করা যায়।
Update:
user = MyApp.Repo.get(MyApp.User, 1)
changeset = MyApp.User.changeset(user, %{age: 31})
MyApp.Repo.update(changeset)এখানে, একটি user এর বয়স আপডেট করা হচ্ছে।
Delete:
user = MyApp.Repo.get(MyApp.User, 1)
MyApp.Repo.delete(user)এখানে, user টেবিলের একটি রেকর্ড ডিলিট করা হচ্ছে।
5. Ecto Migrations - Database Schema Management
Ecto Migrations ব্যবহার করে আপনি ডেটাবেস স্কিমা পরিবর্তন করতে পারেন। যেমন নতুন টেবিল তৈরি করা, কলাম যোগ করা, কলাম মুছে ফেলা, ইত্যাদি।
Migration উদাহরণ:
defmodule MyApp.Repo.Migrations.CreateUsers do
use Ecto.Migration
def change do
create table(:users) do
add :name, :string
add :email, :string
add :age, :integer
timestamps()
end
end
endএখানে, CreateUsers মাইগ্রেশনটি users টেবিল তৈরি করছে।
Migration রান করা:
mix ecto.migrateএটি সমস্ত মাইগ্রেশন রান করে এবং ডেটাবেসে পরিবর্তনগুলি প্রয়োগ করে।
6. Ecto Querying - Advanced Operations
Elixir তে Ecto.Query ব্যবহার করে আপনি আরও উন্নত কোয়েরি করতে পারেন যেমন joins, group by, aggregations, ইত্যাদি।
Join Example:
from(u in MyApp.User,
join: p in MyApp.Post,
on: p.user_id == u.id,
where: u.age > 25,
select: {u.name, p.title})
|> MyApp.Repo.all()এখানে, User এবং Post টেবিলের মধ্যে join অপারেশন করা হয়েছে।
Aggregation Example:
from(u in MyApp.User,
select: avg(u.age))
|> MyApp.Repo.one()এখানে, average age বের করা হচ্ছে।
7. Testing with Ecto
Elixir তে Ecto ব্যবহার করে টেস্টিং খুবই সহজ, কারণ আপনি sandbox mode ব্যবহার করে আপনার ডেটাবেসে টেস্ট ডেটা insert, update, delete করতে পারেন।
Test Setup:
defmodule MyApp.UserTest do
use ExUnit.Case
import Ecto.Query
alias MyApp.{Repo, User}
setup do
:ok = Ecto.Adapters.SQL.Sandbox.checkout(MyApp.Repo)
end
test "creating a user" do
changeset = User.changeset(%User{}, %{name: "Alice", email: "alice@example.com", age: 30})
{:ok, user} = Repo.insert(changeset)
assert user.name == "Alice"
end
endএখানে, Ecto.Adapters.SQL.Sandbox.checkout/1 ব্যবহৃত হচ্ছে যাতে টেস্টের মধ্যে ট্রানজেকশন পরিচালনা করা যায়।
সারসংক্ষেপ
- Ecto হল Elixir এর জন্য একটি শক্তিশালী ডেটাবেস লাইব্রেরি যা database interaction এবং schema management সহজ করে।
- Ecto.Repo এবং Ecto.Schema ব্যবহার করে ডেটাবেসের সাথে সহজেই সংযুক্ত হওয়া যায়, ডেটা ইনসার্ট, আপডেট, ডিল
িট এবং কোয়েরি করা যায়।
- Ecto Migrations ব্যবহৃত হয়ে ডেটাবেস স্কিমা আপডেট এবং পরিবর্তন করা যায়।
- Ecto.Query ব্যবহার করে জটিল কোয়েরি এবং ফিল্টারিং করা যায়।
- Test টেস্টিংয়ের জন্য Ecto এর সাথে sandbox mode ব্যবহার করা হয়, যাতে ডেটাবেসে কোনো স্থায়ী পরিবর্তন না হয়।
Ecto এর মাধ্যমে Elixir ডেভেলপাররা ডেটাবেসের সাথে সহজে কাজ করতে পারেন, যা অ্যাপ্লিকেশন ডেভেলপমেন্ট এবং পরিচালনা আরও কার্যকরী করে তোলে।
Read more