تعاملات پایگاه داده در 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 را پوشش میدهد.
فهرست مطالب
-
تعاملات پایگاه داده 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 آن را برای شما تهیه کرد.