البرمجة

استخدام SQLx في برمجة قاعدة بيانات PostgreSQL

عند قراءتي للكود المقدم، يبدو أن المشكلة تكمن في التعامل مع هيكل البيانات المخصص لتمثيل السجلات المسترجعة من قاعدة البيانات. في هذا السياق، يتم استخدام مكتبة sqlx للتعامل مع قاعدة البيانات PostgreSQL بلغة البرمجة Go.

عند استخدام الدالة db.Select() لاسترجاع البيانات من جدول films، يتوقع المكتبة أن يتم توفير قطعة من الذاكرة لتخزين البيانات المسترجعة. في هذه الحالة، يجب أن يكون النوع الممرر إلى db.Select() قائمة (slice) من هياكل البيانات التي يمكن تعبئتها بالبيانات من قاعدة البيانات.

ومع ذلك، يواجه المبرمج هنا مشكلة بسيطة في تعريف هيكل البيانات Film. يجب أن يتم تعريف الحقول في هيكل Film بحروف كبيرة (capitalized) لكي يكون لها القدرة على التعبئة من خلال مكتبة sqlx. يبدو أن الأسماء الحالية للحقول code وname مكتوبة بحروف صغيرة، لذا يتعذر على sqlx تعبئتها بالبيانات.

بالتالي، يجب تعديل تعريف هيكل Film ليكون كالتالي:

go
type Film struct { Code int `db:"code"` Name string `db:"name"` }

بعد هذا التعديل، يجب أن يتمكن البرنامج من استرجاع البيانات بنجاح. باستخدام الوسائل المتاحة، يمكنك الآن القيام بتعديلاتك واختبار الكود للتأكد من عمله بشكل صحيح.

المزيد من المعلومات

بعد تعديل هيكل البيانات Film كما ذكرت سابقًا، يمكن الآن استكمال البرنامج ليتمكن من استرجاع البيانات بنجاح. لكن قبل القيام بذلك، يمكن إجراء بعض التحسينات على الكود لجعله أكثر فعالية وقابلية للصيانة. فيما يلي بعض الاقتراحات:

  1. استخدام الثوابت لتعريف معلومات الاتصال بقاعدة البيانات بدلاً من كتابتها مباشرة في الكود. هذا يسهل عملية التغيير في حالة تغيير معلومات الاتصال.

  2. التحقق من الأخطاء بشكل صحيح ومعالجتها بشكل مناسب في الكود.

  3. تنظيم الكود وتقسيمه إلى وظائف (functions) صغيرة لتسهيل فهمه وصيانته في المستقبل.

بناءً على ذلك، يمكن تعديل الكود كما يلي:

go
package 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) }

بهذا التعديل، يكون الكود أكثر تنظيمًا وسهولة فهمًا، ويمكنه الآن استرجاع البيانات من قاعدة البيانات بنجاح بعد تصحيح هيكل البيانات كما تم الإشارة إليه سابقًا. يمكنك الآن تشغيل البرنامج والتأكد من عمله بشكل صحيح.

مقالات ذات صلة

زر الذهاب إلى الأعلى
إغلاق

أنت تستخدم إضافة Adblock

يرجى تعطيل مانع الإعلانات حيث أن موقعنا غير مزعج ولا بأس من عرض الأعلانات لك فهي تعتبر كمصدر دخل لنا و دعم مقدم منك لنا لنستمر في تقديم المحتوى المناسب و المفيد لك فلا تبخل بدعمنا عزيزي الزائر