عند قراءتي للكود المقدم، يبدو أن المشكلة تكمن في التعامل مع هيكل البيانات المخصص لتمثيل السجلات المسترجعة من قاعدة البيانات. في هذا السياق، يتم استخدام مكتبة sqlx
للتعامل مع قاعدة البيانات PostgreSQL بلغة البرمجة Go.
عند استخدام الدالة db.Select()
لاسترجاع البيانات من جدول films
، يتوقع المكتبة أن يتم توفير قطعة من الذاكرة لتخزين البيانات المسترجعة. في هذه الحالة، يجب أن يكون النوع الممرر إلى db.Select()
قائمة (slice) من هياكل البيانات التي يمكن تعبئتها بالبيانات من قاعدة البيانات.
ومع ذلك، يواجه المبرمج هنا مشكلة بسيطة في تعريف هيكل البيانات Film
. يجب أن يتم تعريف الحقول في هيكل Film
بحروف كبيرة (capitalized) لكي يكون لها القدرة على التعبئة من خلال مكتبة sqlx
. يبدو أن الأسماء الحالية للحقول code
وname
مكتوبة بحروف صغيرة، لذا يتعذر على sqlx
تعبئتها بالبيانات.
بالتالي، يجب تعديل تعريف هيكل Film
ليكون كالتالي:
gotype Film struct {
Code int `db:"code"`
Name string `db:"name"`
}
بعد هذا التعديل، يجب أن يتمكن البرنامج من استرجاع البيانات بنجاح. باستخدام الوسائل المتاحة، يمكنك الآن القيام بتعديلاتك واختبار الكود للتأكد من عمله بشكل صحيح.
المزيد من المعلومات
بعد تعديل هيكل البيانات Film
كما ذكرت سابقًا، يمكن الآن استكمال البرنامج ليتمكن من استرجاع البيانات بنجاح. لكن قبل القيام بذلك، يمكن إجراء بعض التحسينات على الكود لجعله أكثر فعالية وقابلية للصيانة. فيما يلي بعض الاقتراحات:
-
استخدام الثوابت لتعريف معلومات الاتصال بقاعدة البيانات بدلاً من كتابتها مباشرة في الكود. هذا يسهل عملية التغيير في حالة تغيير معلومات الاتصال.
-
التحقق من الأخطاء بشكل صحيح ومعالجتها بشكل مناسب في الكود.
-
تنظيم الكود وتقسيمه إلى وظائف (functions) صغيرة لتسهيل فهمه وصيانته في المستقبل.
بناءً على ذلك، يمكن تعديل الكود كما يلي:
gopackage main
import (
"log"
"github.com/jmoiron/sqlx"
_ "github.com/lib/pq"
)
// Constants for database connection
const (
host = "192.168.99.100"
port = 32768
user = "demas"
password = "root"
dbname = "mydb"
)
var schema = `
CREATE TABLE IF NOT EXISTS films (
code INT,
name VARCHAR(10)
)`
// Film struct represents a film record
type Film struct {
Code int `db:"code"`
Name string `db:"name"`
}
func main() {
// Connect to the database
db, err := sqlx.Open("postgres", getConnectionInfo())
if err != nil {
log.Fatal(err)
}
defer db.Close()
// Ensure table exists
_, err = db.Exec(schema)
if err != nil {
log.Fatal(err)
}
// Insert sample data
insertData(db)
// Retrieve and print films
films := getFilms(db)
log.Println("Films:")
for _, film := range films {
log.Printf("Code: %d, Name: %s\n", film.Code, film.Name)
}
}
// Function to insert sample data
func insertData(db *sqlx.DB) {
tx := db.MustBegin()
tx.MustExec("INSERT INTO films(code, name) VALUES($1, $2)", 10, "One")
tx.MustExec("INSERT INTO films(code, name) VALUES($1, $2)", 20, "Two")
err := tx.Commit()
if err != nil {
log.Fatal(err)
}
}
// Function to retrieve films from the database
func getFilms(db *sqlx.DB) []Film {
var films []Film
err := db.Select(&films, "SELECT * FROM films")
if err != nil {
log.Fatal(err)
}
return films
}
// Function to construct connection string
func getConnectionInfo() string {
return fmt.Sprintf("user=%s password=%s host=%s port=%d dbname=%s sslmode=disable", user, password, host, port, dbname)
}
بهذا التعديل، يكون الكود أكثر تنظيمًا وسهولة فهمًا، ويمكنه الآن استرجاع البيانات من قاعدة البيانات بنجاح بعد تصحيح هيكل البيانات كما تم الإشارة إليه سابقًا. يمكنك الآن تشغيل البرنامج والتأكد من عمله بشكل صحيح.