برنامه نویسی

تعاملات پایگاه داده در Go: از SQL تا NoSQL

Summarize this content to 400 words in Persian Lang

مقدمه

Go (Golang) به یک انتخاب محبوب برای ایجاد خدمات باطنی قوی و با کارایی بالا تبدیل شده است. یکی از نقاط قوت Go پشتیبانی عالی از عملیات پایگاه داده است، چه با پایگاه داده های سنتی SQL یا راه حل های مدرن NoSQL کار کنید. در این راهنما، نحوه تعامل با پایگاه‌های داده در Go را بررسی خواهیم کرد که هر دو رویکرد SQL و NoSQL را پوشش می‌دهد.

فهرست مطالب

تعاملات پایگاه داده SQL

تعاملات پایگاه داده NoSQL

بهترین شیوه ها و دام های رایج
نتیجه گیری

تعاملات پایگاه داده SQL

با استفاده از پایگاه داده / بسته sql

کتابخانه استاندارد Go این را فراهم می کند database/sql بسته، که یک رابط عمومی در اطراف پایگاه داده های SQL (یا SQL مانند) ارائه می دهد. این بسته برای استفاده در ارتباط با درایورهای خاص پایگاه داده طراحی شده است.

بیایید با یک مثال ساده با استفاده از SQLite شروع کنیم:

package main

import (
“database/sql”
“fmt”
“log”
)

func main() {
// Open the database
db, err := sql.Open(“sqlite3”, “./test.db”)
if err != nil {
log.Fatal(err)
}
defer db.Close()

// Create table
_, err = db.Exec(`CREATE TABLE IF NOT EXISTS users (
id INTEGER PRIMARY KEY AUTOINCREMENT,
name TEXT,
age INTEGER
)`)
if err != nil {
log.Fatal(err)
}

// Insert a user
result, err := db.Exec(“INSERT INTO users (name, age) VALUES (?, ?)”, “Alice”, 30)
if err != nil {
log.Fatal(err)
}

// Get the ID of the inserted user
id, err := result.LastInsertId()
if err != nil {
log.Fatal(err)
}
fmt.Printf(“Inserted user with ID: %d\n”, id)

// Query for the user
var name string
var age int
err = db.QueryRow(“SELECT name, age FROM users WHERE id = ?”, id).Scan(&name, &age)
if err != nil {
log.Fatal(err)
}
fmt.Printf(“User: %s, Age: %d\n”, name, age)
}

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

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

این مثال اصول کار با پایگاه های داده SQL در Go را نشان می دهد:

باز کردن اتصال پایگاه داده
ایجاد جدول
درج داده ها
پرس و جو داده ها

این database/sql بسته یک رابط سطح پایین برای پایگاه داده فراهم می کند و به شما کنترل خوبی بر پرس و جوها و عملیات شما می دهد.

کار با یک ORM: GORM

در حالی که database/sql بسته قدرتمند است، بسیاری از توسعه دهندگان ترجیح می دهند از ابزار Object-Relational Mapping (ORM) برای عملیات راحت تر پایگاه داده استفاده کنند. GORM یکی از محبوب ترین ORM ها برای Go است.

در اینجا مثالی از استفاده از GORM با SQLite آورده شده است:

package main

import (
“fmt”
“log”

“gorm.io/driver/sqlite”
“gorm.io/gorm”
)

type User struct {
ID uint
Name string
Age int
}

func main() {
// Open the database
db, err := gorm.Open(sqlite.Open(“test.db”), &gorm.Config{})
if err != nil {
log.Fatal(err)
}

// Auto Migrate the schema
db.AutoMigrate(&User{})

// Create a user
user := User{Name: “Bob”, Age: 25}
result := db.Create(&user)
if result.Error != nil {
log.Fatal(result.Error)
}
fmt.Printf(“Inserted user with ID: %d\n”, user.ID)

// Query for the user
var fetchedUser User
db.First(&fetchedUser, user.ID)
fmt.Printf(“User: %s, Age: %d\n”, fetchedUser.Name, fetchedUser.Age)

// Update the user
db.Model(&fetchedUser).Update(“Age”, 26)

// Delete the user
db.Delete(&fetchedUser)
}

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

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

GORM یک انتزاع سطح بالاتر را بر روی عملیات پایگاه داده ارائه می دهد و به شما امکان می دهد به جای نوشتن پرس و جوهای SQL خام، مستقیماً با ساختارهای Go کار کنید. همچنین ویژگی هایی مانند انتقال خودکار، قلاب ها و انجمن ها را ارائه می دهد.

تعاملات پایگاه داده NoSQL

MongoDB با درایور رسمی Go

برای پایگاه‌های داده NoSQL، بیایید نحوه تعامل با MongoDB با استفاده از درایور رسمی Go را بررسی کنیم:

package main

import (
“context”
“fmt”
“log”
“time”

“go.mongodb.org/mongo-driver/bson”
“go.mongodb.org/mongo-driver/mongo”
“go.mongodb.org/mongo-driver/mongo/options”
)

type User struct {
Name string `bson:”name”`
Age int `bson:”age”`
}

func main() {
// Set client options
clientOptions := options.Client().ApplyURI(“mongodb://localhost:27017”)

// Connect to MongoDB
ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second)
defer cancel()
client, err := mongo.Connect(ctx, clientOptions)
if err != nil {
log.Fatal(err)
}

// Check the connection
err = client.Ping(context.TODO(), nil)
if err != nil {
log.Fatal(err)
}

fmt.Println(“Connected to MongoDB!”)

// Get a handle for your collection
collection := client.Database(“test”).Collection(“users”)

// Insert a user
user := User{Name: “Charlie”, Age: 35}
insertResult, err := collection.InsertOne(context.TODO(), user)
if err != nil {
log.Fatal(err)
}
fmt.Printf(“Inserted user with ID: %v\n”, insertResult.InsertedID)

// Find a user
var result User
filter := bson.M{“name”: “Charlie”}
err = collection.FindOne(context.TODO(), filter).Decode(&result)
if err != nil {
log.Fatal(err)
}
fmt.Printf(“Found user: %+v\n”, result)

// Update a user
update := bson.M{
“$set”: bson.M{
“age”: 36,
},
}
updateResult, err := collection.UpdateOne(context.TODO(), filter, update)
if err != nil {
log.Fatal(err)
}
fmt.Printf(“Updated %v user(s)\n”, updateResult.ModifiedCount)

// Delete a user
deleteResult, err := collection.DeleteOne(context.TODO(), filter)
if err != nil {
log.Fatal(err)
}
fmt.Printf(“Deleted %v user(s)\n”, deleteResult.DeletedCount)

// Disconnect
err = client.Disconnect(context.TODO())
if err != nil {
log.Fatal(err)
}
fmt.Println(“Connection to MongoDB closed.”)
}

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

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

این مثال عملیات اصلی CRUD (ایجاد، خواندن، به‌روزرسانی، حذف) را با MongoDB با استفاده از درایور رسمی Go نشان می‌دهد.

بهترین شیوه ها و دام های رایج

هنگام کار با پایگاه های داده در Go، این بهترین روش ها را در نظر داشته باشید:

از ادغام اتصال استفاده کنید: هر دو database/sql و اکثر درایورهای NoSQL ادغام اتصال را پیاده سازی می کنند. اطمینان حاصل کنید که به جای باز کردن اتصالات جدید برای هر عملیات، دوباره از اتصالات پایگاه داده استفاده کنید.
خطاها را به درستی مدیریت کنید: همیشه خطاهای بازگردانده شده توسط عملیات پایگاه داده را بررسی کنید و آنها را به طور مناسب مدیریت کنید.
از اظهارات آماده استفاده کنید: برای پایگاه های داده SQL، از عبارات آماده شده برای بهبود عملکرد و جلوگیری از حملات تزریق SQL استفاده کنید.
بستن منابع: همیشه مجموعه‌های نتایج، عبارات و اتصالات پایگاه داده را وقتی کارتان تمام شد، ببندید. این defer کلمه کلیدی برای این کار مفید است.
در صورت لزوم از معاملات استفاده کنید: برای عملیاتی که نیاز به چند مرحله دارد، از تراکنش ها برای اطمینان از سازگاری داده ها استفاده کنید.
مراقب مشکلات پرس و جو N+1 باشید: هنگام استفاده از ORM، از مشکل پرس و جو N+1 آگاه باشید و در صورت لزوم از بارگیری مشتاقانه استفاده کنید.
از زمینه برای وقفه استفاده کنید: از زمینه برای تنظیم وقفه های زمانی در عملیات پایگاه داده، به خصوص برای پرس و جوهای طولانی مدت استفاده کنید.

مشکلات رایجی که باید از آنها اجتناب کرد:

نادیده گرفتن آسیب پذیری های تزریق SQL: همیشه از پرس و جوهای پارامتری یا عبارات آماده استفاده کنید.

عدم رسیدگی به خطاهای اتصال: خطاهای اتصال را بررسی کرده و رسیدگی کنید و در صورت لزوم منطق تلاش مجدد را اجرا کنید.

استفاده بیش از حد از قلاب های GORM: در حالی که راحت است، استفاده بیش از حد از قلاب های GORM می تواند منجر به مشکلاتی شود که اشکال زدایی آنها سخت است.

ایندکس نشدن درست: مطمئن شوید که طرح پایگاه داده شما به درستی برای الگوهای پرس و جو ایندکس شده است.

ذخیره سازی داده های حساس در متن ساده: همیشه داده های حساس را قبل از ذخیره در پایگاه داده رمزگذاری کنید.

نتیجه گیری

Go پشتیبانی قوی برای تعاملات پایگاه داده SQL و NoSQL ارائه می دهد. این که آیا شما کنترل سطح پایین را ترجیح می دهید database/sql، راحتی یک ORM مانند GORM یا کار با پایگاه های داده NoSQL مانند MongoDB، Go آن را برای شما تهیه کرد.

مقدمه

Go (Golang) به یک انتخاب محبوب برای ایجاد خدمات باطنی قوی و با کارایی بالا تبدیل شده است. یکی از نقاط قوت Go پشتیبانی عالی از عملیات پایگاه داده است، چه با پایگاه داده های سنتی SQL یا راه حل های مدرن NoSQL کار کنید. در این راهنما، نحوه تعامل با پایگاه‌های داده در Go را بررسی خواهیم کرد که هر دو رویکرد SQL و NoSQL را پوشش می‌دهد.

فهرست مطالب

  1. تعاملات پایگاه داده SQL

  2. تعاملات پایگاه داده NoSQL

  3. بهترین شیوه ها و دام های رایج
  4. نتیجه گیری

تعاملات پایگاه داده SQL

با استفاده از پایگاه داده / بسته sql

کتابخانه استاندارد Go این را فراهم می کند database/sql بسته، که یک رابط عمومی در اطراف پایگاه داده های SQL (یا SQL مانند) ارائه می دهد. این بسته برای استفاده در ارتباط با درایورهای خاص پایگاه داده طراحی شده است.

بیایید با یک مثال ساده با استفاده از SQLite شروع کنیم:

package main

import (
    "database/sql"
    "fmt"
    "log"
)

func main() {
    // Open the database
    db, err := sql.Open("sqlite3", "./test.db")
    if err != nil {
        log.Fatal(err)
    }
    defer db.Close()

    // Create table
    _, err = db.Exec(`CREATE TABLE IF NOT EXISTS users (
        id INTEGER PRIMARY KEY AUTOINCREMENT,
        name TEXT,
        age INTEGER
    )`)
    if err != nil {
        log.Fatal(err)
    }

    // Insert a user
    result, err := db.Exec("INSERT INTO users (name, age) VALUES (?, ?)", "Alice", 30)
    if err != nil {
        log.Fatal(err)
    }

    // Get the ID of the inserted user
    id, err := result.LastInsertId()
    if err != nil {
        log.Fatal(err)
    }
    fmt.Printf("Inserted user with ID: %d\n", id)

    // Query for the user
    var name string
    var age int
    err = db.QueryRow("SELECT name, age FROM users WHERE id = ?", id).Scan(&name, &age)
    if err != nil {
        log.Fatal(err)
    }
    fmt.Printf("User: %s, Age: %d\n", name, age)
}
وارد حالت تمام صفحه شوید

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

این مثال اصول کار با پایگاه های داده SQL در Go را نشان می دهد:

  1. باز کردن اتصال پایگاه داده
  2. ایجاد جدول
  3. درج داده ها
  4. پرس و جو داده ها

این database/sql بسته یک رابط سطح پایین برای پایگاه داده فراهم می کند و به شما کنترل خوبی بر پرس و جوها و عملیات شما می دهد.

کار با یک ORM: GORM

در حالی که database/sql بسته قدرتمند است، بسیاری از توسعه دهندگان ترجیح می دهند از ابزار Object-Relational Mapping (ORM) برای عملیات راحت تر پایگاه داده استفاده کنند. GORM یکی از محبوب ترین ORM ها برای Go است.

در اینجا مثالی از استفاده از GORM با SQLite آورده شده است:

package main

import (
    "fmt"
    "log"

    "gorm.io/driver/sqlite"
    "gorm.io/gorm"
)

type User struct {
    ID   uint
    Name string
    Age  int
}

func main() {
    // Open the database
    db, err := gorm.Open(sqlite.Open("test.db"), &gorm.Config{})
    if err != nil {
        log.Fatal(err)
    }

    // Auto Migrate the schema
    db.AutoMigrate(&User{})

    // Create a user
    user := User{Name: "Bob", Age: 25}
    result := db.Create(&user)
    if result.Error != nil {
        log.Fatal(result.Error)
    }
    fmt.Printf("Inserted user with ID: %d\n", user.ID)

    // Query for the user
    var fetchedUser User
    db.First(&fetchedUser, user.ID)
    fmt.Printf("User: %s, Age: %d\n", fetchedUser.Name, fetchedUser.Age)

    // Update the user
    db.Model(&fetchedUser).Update("Age", 26)

    // Delete the user
    db.Delete(&fetchedUser)
}
وارد حالت تمام صفحه شوید

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

GORM یک انتزاع سطح بالاتر را بر روی عملیات پایگاه داده ارائه می دهد و به شما امکان می دهد به جای نوشتن پرس و جوهای SQL خام، مستقیماً با ساختارهای Go کار کنید. همچنین ویژگی هایی مانند انتقال خودکار، قلاب ها و انجمن ها را ارائه می دهد.

تعاملات پایگاه داده NoSQL

MongoDB با درایور رسمی Go

برای پایگاه‌های داده NoSQL، بیایید نحوه تعامل با MongoDB با استفاده از درایور رسمی Go را بررسی کنیم:

package main

import (
    "context"
    "fmt"
    "log"
    "time"

    "go.mongodb.org/mongo-driver/bson"
    "go.mongodb.org/mongo-driver/mongo"
    "go.mongodb.org/mongo-driver/mongo/options"
)

type User struct {
    Name string `bson:"name"`
    Age  int    `bson:"age"`
}

func main() {
    // Set client options
    clientOptions := options.Client().ApplyURI("mongodb://localhost:27017")

    // Connect to MongoDB
    ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second)
    defer cancel()
    client, err := mongo.Connect(ctx, clientOptions)
    if err != nil {
        log.Fatal(err)
    }

    // Check the connection
    err = client.Ping(context.TODO(), nil)
    if err != nil {
        log.Fatal(err)
    }

    fmt.Println("Connected to MongoDB!")

    // Get a handle for your collection
    collection := client.Database("test").Collection("users")

    // Insert a user
    user := User{Name: "Charlie", Age: 35}
    insertResult, err := collection.InsertOne(context.TODO(), user)
    if err != nil {
        log.Fatal(err)
    }
    fmt.Printf("Inserted user with ID: %v\n", insertResult.InsertedID)

    // Find a user
    var result User
    filter := bson.M{"name": "Charlie"}
    err = collection.FindOne(context.TODO(), filter).Decode(&result)
    if err != nil {
        log.Fatal(err)
    }
    fmt.Printf("Found user: %+v\n", result)

    // Update a user
    update := bson.M{
        "$set": bson.M{
            "age": 36,
        },
    }
    updateResult, err := collection.UpdateOne(context.TODO(), filter, update)
    if err != nil {
        log.Fatal(err)
    }
    fmt.Printf("Updated %v user(s)\n", updateResult.ModifiedCount)

    // Delete a user
    deleteResult, err := collection.DeleteOne(context.TODO(), filter)
    if err != nil {
        log.Fatal(err)
    }
    fmt.Printf("Deleted %v user(s)\n", deleteResult.DeletedCount)

    // Disconnect
    err = client.Disconnect(context.TODO())
    if err != nil {
        log.Fatal(err)
    }
    fmt.Println("Connection to MongoDB closed.")
}
وارد حالت تمام صفحه شوید

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

این مثال عملیات اصلی CRUD (ایجاد، خواندن، به‌روزرسانی، حذف) را با MongoDB با استفاده از درایور رسمی Go نشان می‌دهد.

بهترین شیوه ها و دام های رایج

هنگام کار با پایگاه های داده در Go، این بهترین روش ها را در نظر داشته باشید:

  1. از ادغام اتصال استفاده کنید: هر دو database/sql و اکثر درایورهای NoSQL ادغام اتصال را پیاده سازی می کنند. اطمینان حاصل کنید که به جای باز کردن اتصالات جدید برای هر عملیات، دوباره از اتصالات پایگاه داده استفاده کنید.

  2. خطاها را به درستی مدیریت کنید: همیشه خطاهای بازگردانده شده توسط عملیات پایگاه داده را بررسی کنید و آنها را به طور مناسب مدیریت کنید.

  3. از اظهارات آماده استفاده کنید: برای پایگاه های داده SQL، از عبارات آماده شده برای بهبود عملکرد و جلوگیری از حملات تزریق SQL استفاده کنید.

  4. بستن منابع: همیشه مجموعه‌های نتایج، عبارات و اتصالات پایگاه داده را وقتی کارتان تمام شد، ببندید. این defer کلمه کلیدی برای این کار مفید است.

  5. در صورت لزوم از معاملات استفاده کنید: برای عملیاتی که نیاز به چند مرحله دارد، از تراکنش ها برای اطمینان از سازگاری داده ها استفاده کنید.

  6. مراقب مشکلات پرس و جو N+1 باشید: هنگام استفاده از ORM، از مشکل پرس و جو N+1 آگاه باشید و در صورت لزوم از بارگیری مشتاقانه استفاده کنید.

  7. از زمینه برای وقفه استفاده کنید: از زمینه برای تنظیم وقفه های زمانی در عملیات پایگاه داده، به خصوص برای پرس و جوهای طولانی مدت استفاده کنید.

مشکلات رایجی که باید از آنها اجتناب کرد:

  1. نادیده گرفتن آسیب پذیری های تزریق SQL: همیشه از پرس و جوهای پارامتری یا عبارات آماده استفاده کنید.
  2. عدم رسیدگی به خطاهای اتصال: خطاهای اتصال را بررسی کرده و رسیدگی کنید و در صورت لزوم منطق تلاش مجدد را اجرا کنید.
  3. استفاده بیش از حد از قلاب های GORM: در حالی که راحت است، استفاده بیش از حد از قلاب های GORM می تواند منجر به مشکلاتی شود که اشکال زدایی آنها سخت است.
  4. ایندکس نشدن درست: مطمئن شوید که طرح پایگاه داده شما به درستی برای الگوهای پرس و جو ایندکس شده است.
  5. ذخیره سازی داده های حساس در متن ساده: همیشه داده های حساس را قبل از ذخیره در پایگاه داده رمزگذاری کنید.

نتیجه گیری

Go پشتیبانی قوی برای تعاملات پایگاه داده SQL و NoSQL ارائه می دهد. این که آیا شما کنترل سطح پایین را ترجیح می دهید database/sql، راحتی یک ORM مانند GORM یا کار با پایگاه های داده NoSQL مانند MongoDB، Go آن را برای شما تهیه کرد.

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

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

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

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