برنامه نویسی

نحوه استفاده از Iris و PostgreSQL برای توسعه وب

Iris یک چارچوب وب سریع و سبک برای Go است که مجموعه ای غنی از ویژگی ها و موتوری با کارایی بالا را ارائه می دهد. PostgreSQL یک سیستم پایگاه داده رابطه ای قدرتمند و قابل اعتماد است که از انواع داده ها و توابع پیشرفته پشتیبانی می کند. آنها با هم می توانند پایه ای محکم برای ساخت برنامه های کاربردی وب مدرن تشکیل دهند.

اما چگونه می توانید Iris و PostgreSQL را به روشی ساده و ایمن به هم متصل کنید؟ چگونه می توانید عملیات رایج پایگاه داده را بدون نوشتن کد دیگ بخار زیاد انجام دهید؟ چگونه می توانید تراکنش ها، ایجاد طرحواره، ردیابی پرس و جو و مدیریت خطا را به شیوه ای ثابت مدیریت کنید؟

پاسخ میان افزار PG است، بسته ای برای Iris که دسترسی آسان و ایمن به پایگاه داده PostgreSQL را فراهم می کند. در این مقاله، نحوه استفاده از میان افزار PG را برای ایجاد یک REST API ساده برای مدیریت مشتریان به شما نشان خواهیم داد.

میان افزار PG چیست؟

میان افزار PG بسته ای برای چارچوب وب Iris است که دسترسی آسان و ایمن به پایگاه داده PostgreSQL را فراهم می کند. دارای ویژگی های زیر است:

  • از PostgreSQL 9.5 و بالاتر پشتیبانی می کند.
  • از پکیج pg و درایور pgx در زیر کاپوت استفاده می کند.
  • از تراکنش ها، ایجاد و اعتبارسنجی طرحواره، ردیابی پرس و جو و مدیریت خطا پشتیبانی می کند.
  • این امکان ثبت انواع سفارشی و مدل های جدول را با استفاده از یک شی طرحواره فراهم می کند.
  • این یک رابط مخزن عمومی برای عملیات معمول CRUD فراهم می کند.

چگونه میان افزار PG را نصب کنیم؟

برای نصب میان افزار PG باید از دستور زیر استفاده کنید:

go get github.com/iris-contrib/middleware/pg@master
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

چگونه از میان افزار PG استفاده کنیم؟

برای استفاده از میان افزار PG، باید مراحل زیر را دنبال کنید:

  1. بسته را در کد خود وارد کنید:
import (
    "github.com/kataras/iris/v12"

    "github.com/iris-contrib/middleware/pg"
)
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

  1. مدل های جدول پایگاه داده خود را به صورت ساختاری با آن تعریف کنید pg برچسب ها:
// The Customer database table model.
type Customer struct {
    ID   string `json:"id" pg:"type=uuid,primary"`
    Name string `json:"name" pg:"type=varchar(255)"`
}
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

را json تگ نحوه کدگذاری یا رمزگشایی فیلدهای ساختار به صورت JSON را مشخص می کند. را pg تگ نحوه نگاشت فیلدهای ساختار به ستون های جدول پایگاه داده را مشخص می کند. می توانید نوع ستون، محدودیت ها، شاخص ها و سایر گزینه ها را با استفاده از آن مشخص کنید pg برچسب زدن در مخزن pg بیشتر بخوانید.

  1. یک شی schema ایجاد کنید و مدل های خود را ثبت کنید:
schema := pg.NewSchema()
schema.MustRegister("customers", Customer{})
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

شی schema برای ذخیره ابرداده جداول و مدل های پایگاه داده شما استفاده می شود. شما باید مدل های خود را با شی schema با استفاده از عبارت ثبت کنید MustRegister روش. آرگومان اول نام جدول و آرگومان دوم نوع مدل است.

  1. یک نمونه میان افزار PG با گزینه های طرح و پایگاه داده ایجاد کنید:
opts := pg.Options{
    Host:          "localhost",
    Port:          5432,
    User:          "postgres",
    Password:      "admin!123",
    DBName:        "test_db",
    Schema:        "public",
    SSLMode:       "disable",
    Transactional: true,
    Trace:         true,
    CreateSchema:  true,
    CheckSchema:   true,
    ErrorHandler: func(ctx iris.Context, err error) {
        ctx.StopWithError(iris.StatusInternalServerError, err)
    },
}

p := pg.New(schema, opts)
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

ساختار گزینه ها پارامترهای پیکربندی را برای اتصال به پایگاه داده و استفاده از ویژگی های میان افزار تعریف می کند. برای برقراری ارتباط باید فیلدهای میزبان، پورت، کاربر، رمز عبور، dbname، schema و sslmode را مشخص کنید. همچنین می توانید ویژگی تراکنشی را فعال یا غیرفعال کنید، که هر کنترل کننده درخواست را در یک تراکنش پایگاه داده قرار می دهد. همچنین می‌توانید ویژگی ردیابی را فعال یا غیرفعال کنید، که هر درخواست اجرا شده توسط میان‌افزار را ثبت می‌کند. همچنین می‌توانید ویژگی createSchema را فعال یا غیرفعال کنید، که در صورتی که طرحواره در پایگاه داده وجود نداشته باشد، ایجاد می‌کند. همچنین می‌توانید ویژگی checkSchema را فعال یا غیرفعال کنید، که طرح را برای جداول و ستون‌های از دست رفته بررسی می‌کند و هرگونه مغایرت را گزارش می‌کند. شما همچنین می توانید یک تابع errorHandler را ارائه دهید، که هر گونه خطای رخ داده در طول اجرای میان افزار را کنترل می کند.

را New تابع یک نمونه میان افزار جدید PG با طرح و گزینه های داده شده ایجاد می کند.

  1. کنترل کننده میان افزار را به برنامه یا مسیرهای Iris خود وصل کنید:
app := iris.New()

postgresMiddleware := newPostgresMiddleware()

{
    customerAPI := app.Party("/api/customer", postgresMiddleware)
    customerAPI.Post("https://dev.to/", createCustomer)
    customerAPI.Get("/{id:uuid}", getCustomer)
    customerAPI.Put("/{id:uuid}", updateCustomer)
    customerAPI.Delete("/{id:uuid}", deleteCustomer)
}
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

کنترل کننده میان افزار تابعی است که یک زمینه عنبیه را می گیرد و کنترل کننده بعدی در زنجیره را فرا می خواند. می‌توانید با استفاده از آن، میان‌افزار را به برنامه یا مسیرهای Iris خود متصل کنید Use یا Party مواد و روش ها. در این مثال، ما یک Subrouter برای API مشتری ایجاد می کنیم و کنترل کننده میان افزار را روی آن اعمال می کنیم.

  1. استفاده کنید pg.DB یا pg.Repository توابع سطح بسته برای دسترسی به نمونه پایگاه داده یا رابط مخزن در کنترل کننده های شما:
func createCustomer(ctx iris.Context) {
    var payload = struct {
        Name string `json:"name"`
    }{}
    err := ctx.ReadJSON(&payload)
    if err != nil {
        ctx.StopWithError(iris.StatusBadRequest, err)
        return
    }

    // Get the current database instance through pg.DB middleware package-level function.
    // db := pg.DB(ctx)
    // [Work with db instance...]
    // OR, initialize a new repository of Customer type and work with it (type-safety).
    customers := pg.Repository[Customer](ctx)

    // Insert a new Customer.
    customer := Customer{
        Name: payload.Name,
    }
    err = customers.InsertSingle(ctx, customer, &customer.ID)
    if err != nil {
        ctx.StopWithError(iris.StatusInternalServerError, err)
        return
    }

    // Display the result ID.
    ctx.StatusCode(iris.StatusCreated)
    ctx.JSON(iris.Map{"id": customer.ID})
}

func getCustomer(ctx iris.Context) {
    // Get the id from the path parameter.
    id := ctx.Params().Get("id")

    // Get the repository of Customer type through pg.Repository middleware package-level function.
    customers := pg.Repository[Customer](ctx)

    // Get the customer by the id.
    customer, err := customers.SelectByID(ctx, id)
    if err != nil {
        if pg.IsErrNoRows(err) {
            ctx.StopWithStatus(iris.StatusNotFound)
        } else {
            ctx.StopWithError(iris.StatusInternalServerError, err)
        }

        return
    }

    // Display the retrieved Customer.
    ctx.JSON(customer)
}

func updateCustomer(ctx iris.Context) {
    // Get the id from the path parameter.
    id := ctx.Params().Get("id")

    var payload = struct {
        Name string `json:"name"`
    }{}
    err := ctx.ReadJSON(&payload)
    if err != nil {
        ctx.StopWithError(iris.StatusBadRequest, err)
        return
    }

    // Get the repository of Customer type through pg.Repository middleware package-level function.
    customers := pg.Repository[Customer](ctx)

    // Update the customer by the id and name.
    customer := Customer{
        ID: id,
        Name: payload.Name,
    }
    _, err = customers.UpdateOnlyColumns(ctx, []string{"name"}, customer)
    // OR customers.Update(ctx, customer)
    if err != nil {
        if pg.IsErrNoRows(err) {
            ctx.StopWithStatus(iris.StatusNotFound)
        } else {
            ctx.StopWithError(iris.StatusInternalServerError, err)
        }

        return
    }

    // Display a success message.
    ctx.StatusCode(iris.StatusOK)
    ctx.JSON(iris.Map{"message": "Customer updated successfully"})
}

func deleteCustomer(ctx iris.Context) {
    // Get the id from the path parameter.
    id := ctx.Params().Get("id")

    // Get the repository of Customer type through pg.Repository middleware package-level function.
    customers := pg.Repository[Customer](ctx)

    // Delete the customer by the id.
    _, err := customers.Delete(ctx, Customer{ID: id})
    if err != nil {
        if pg.IsErrNoRows(err) {
            ctx.StopWithStatus(iris.StatusNotFound)
        } else {
            ctx.StopWithError(iris.StatusInternalServerError, err)
        }

        return
    }

    // Display a success message.
    ctx.StatusCode(iris.StatusOK)
    ctx.JSON(iris.Map{"message": "Customer deleted successfully"})
}
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

را pg.DB تابع نمونه پایگاه داده فعلی مرتبط با زمینه عنبیه را برمی گرداند. شما می توانید از این نمونه برای انجام هر گونه عملیات پایگاه داده با استفاده از pg بسته API. را pg.Repository تابع یک رابط مخزن عمومی را برای نوع مدل داده شده مرتبط با زمینه عنبیه برمی گرداند. شما می توانید از این رابط برای انجام عملیات معمول CRUD با استفاده از روش های type-safe استفاده کنید. در این مثال، ما از رابط مخزن برای درج و انتخاب مشتریان استفاده می کنیم.

چگونه مثال را اجرا کنیم؟

برای اجرای مثال، باید:

  1. مخزن میان افزار PG را کلون کنید و به آن بروید _examples/basic پوشه
  2. با استفاده از وابستگی ها را نصب کنید go mod tidy.
  3. یک سرور PostgreSQL راه اندازی کنید و یک پایگاه داده با نام ایجاد کنید test_db.
  4. با استفاده از فایل main.go را اجرا کنید go run main.go.
  5. از ابزاری مانند Postman یا curl برای آزمایش نقاط پایانی API استفاده کنید:
# Create a new customer
curl -X POST -H "Content-Type: application/json" -d '{"name":"Alice"}' http://localhost:8080/api/customer

# Get a customer by id
curl -X GET http://localhost:8080/api/customer/1f8c9a7c-6b7c-4f0e-8a1d-9f2a9c3b7b8e

# Update a customer by id
curl -X PUT -H "Content-Type: application/json" -d '{"name":"Bob"}' http://localhost:8080/api/customer/1f8c9a7c-6b7c-4f0e-8a1d-9f2a9c3b7b8e

# Delete a customer by id
curl -X DELETE http://localhost:8080/api/customer/1f8c9a7c-6b7c-4f0e-8a1d-9f2a9c3b7b8e
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

نتیجه

در این مقاله نحوه استفاده از میان افزار PG برای اتصال Iris و PostgreSQL را به روشی ساده و ایمن به شما نشان داده ایم. ما همچنین نحوه استفاده از ویژگی‌های میان‌افزار PG مانند تراکنش‌ها، ایجاد و اعتبارسنجی طرحواره، ردیابی پرس و جو و مدیریت خطا را نشان داده‌ایم. ما همچنین نحوه استفاده از میان افزار PG را برای ایجاد یک REST API ساده برای مدیریت مشتریان نشان داده ایم.

امیدواریم میان افزار PG برای شما مفید و آسان باشد. اگر بازخورد یا سؤالی دارید، لطفاً با خیال راحت یک مشکل یا یک درخواست کشش را در GitHub باز کنید. ممنون که خواندید!🙏

نوشته های مشابه

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

دکمه بازگشت به بالا