اذهب إلى المحتوى

لوحة المتصدرين

  1. Abdulmnoum Albraky

    Abdulmnoum Albraky

    الأعضاء


    • نقاط

      3

    • المساهمات

      89


  2. Mustafa Suleiman

    Mustafa Suleiman

    الأعضاء


    • نقاط

      3

    • المساهمات

      13209


  3. محمد الصالح4

    محمد الصالح4

    الأعضاء


    • نقاط

      2

    • المساهمات

      31


  4. Muthanna Alqaisi

    Muthanna Alqaisi

    الأعضاء


    • نقاط

      2

    • المساهمات

      78


المحتوى الأكثر حصولًا على سمعة جيدة

المحتوى الأعلى تقييمًا في 03/19/24 في كل الموقع

  1. 2 نقاط
  2. اشعر انني لا افهم بمفردي من الدروس اشعر انني بحاجه الى موجه هل من حل
    2 نقاط
  3. هل اساسيات البرمجه تكون مبهمت الفهم لحين التقدم في البرمجه بعدها تتضح الصوره استيعاب الاساسيات
    2 نقاط
  4. هناك أمر هام وجب التنويه إليه وهو أنه يجب تشغيل موجه الأوامر كمسؤول (Administrator) لكي يعمل الأمر المذكور في النقاش هنا. وبإمكانك إلغاء عملية الإغلاق قبل انتهاء الوقت المحدد باستخدام الأمر: shutdown /a وهناك خيارات أخرى لأمر shutdown: shutdown /r: إعادة تشغيل الجهاز. shutdown /h: إيقاف تشغيل الجهاز. shutdown /l: تسجيل الخروج من حساب المستخدم الحالي. لكن الأفضل استخدام الأمر shutdown /s لإغلاق الجهاز، حيث أنه يُغلق جميع البرامج والخدمات بشكل آمن.
    2 نقاط
  5. هل يكمن سحب الاموال بفيزا اخري غير ايزي باي؟ الي اعرفه انه شرط لسحب الاموال من مستقل انه الفيزا تكون مرتبطه بي باي بال هل اي فيزا م اي بنك ولا لازم ايزي باي وايه هي الفيز الي ممكن اربطها بي باي بال غير ايزي باي (بنك اهلي او بنك مصر او ايا كان) حاليا معايا فيزا yalla ومش بينفع انها ترتبط بي بايبال هل ممكن اسحب علي فيزا يلا علطول؟
    1 نقطة
  6. السلام عليكم استفسار للخبرة في HTML من حد ما عندهوش أي معرفة الموقع مش مرتب الحركة ما بين الخلاية ومحتاج أتنقلها بنفس الترتيب "بتنقل بالضغط على Tab" جربت ابحث قبل كده على جوجل وجاب لي كلمة ببحث بها وبرتب الأولويات والأرقام ولما عملت كده ما عرفتش أحفظ التعديل اللي عملته للأسف فلو هنا حد يقدر يساعد يبقى جزاكم الله خيرًا مرفق صورة للتوضيح صورة.bmp
    1 نقطة
  7. أكمل ملفات الفصل الدراسي لنظام إدارة المكتبة بلغة Java واكتب الوظيفة الرئيسية كما هو مطلوب في مستند المشروع
    1 نقطة
  8. كيف يمكنني استعراض الكود المصدري للصفحة عن طريق view source page
    1 نقطة
  9. جيد ولكن عليك أولاً التحقق من شرعية الأمر لأنه في بعض الدول، قد يكون استخدام Print Spooler API لرصد طباعة المستخدمين دون موافقتهم غير قانوني ويعتبر انتهاكًا للخصوصية. لدينا أكثر من طريقة ولعل أفضلها هي الأخيرة 1. الحصول على نسخة من ملف الطباعة يمكنك استخدام Node.js للوصول إلى مجلد `C:\Windows\System32\spool\PRINTERS` ومراقبته باستمرار لاكتشاف أي ملفات جديدة تم وضعها هناك بعد الطباعة. يمكنك استخدام مكتبة fs في Node.js للقراءة من المجلد ومراقبته. 2. الاشتراك في أحداث الطباعة يمكنك استخدام WMI (Windows Management Instrumentation) في Node.js للاشتراك في أحداث الطباعة في نظام التشغيل Windows. يمكنك استخدام واجهة WMI لتحديد أحداث الطباعة التي ترغب في مراقبتها. 3. تنفيذ أوامر مع Print Spooler API بمجرد اكتشاف ملفات الطباعة الجديدة، يمكنك استخدام مكتبة child_process في Node.js لتنفيذ أوامر تفاعل مع Print Spooler API. يمكنك استخدام هذه الأوامر لتحميل الملفات، أو إعادة توجيهها، أو أي عمليات أخرى ترغب في تنفيذها. وهذا مثال توضيحي : const { exec } = require('child_process'); const fs = require('fs'); // المجلد الذي يتم فيه حفظ ملفات الطباعة const printerSpoolDirectory = 'C:\\Windows\\System32\\spool\\PRINTERS'; // الدالة التي تقوم بقراءة ملفات الطباعة function readPrintedFiles() { fs.readdir(printerSpoolDirectory, (err, files) => { if (err) { console.error('خطأ في قراءة مجلد الطباعة:', err); return; } // فحص كل ملف في مجلد الطباعة files.forEach(file => { // إظهار اسم الملف console.log('ملف مطبوع:', file); // قراءة محتوى الملف إذا كان ذلك ممكنًا fs.readFile(`${printerSpoolDirectory}\\${file}`, 'utf8', (err, data) => { if (err) { console.error('خطأ في قراءة محتوى الملف:', err); return; } console.log('محتوى الملف:', data); }); }); }); } // استدعاء الدالة لقراءة الملفات المطبوعة readPrintedFiles(); ومع ذلك، يجب أن أكرر مرة أخرى أهمية التأكد من القانونية والأخلاقية لما تحاول القيام به، والتأكد من موافقة المستخدمين على مراقبة طباعتهم إذا كان هذا هو الهدف.
    1 نقطة
  10. Draw an activity diagram for the subject enrolment use case in a student Information system (SIS). Student can browse available subjects or search for a specific subject. Then the student can add the subiect to their schedule. Once the student confirm the enrolment the system will check sections availability and accordingly will confirm or cancel the enrolment.
    1 نقطة
  11. هل باستطعتى ان استفيد من خصائص جانغو و لارافيل معا فى موقع واحد او فى تطبيق واحد
    1 نقطة
  12. سلام عليكم ورحمة الله وبركاته انا عندي مشكلة، واتمنى ان اجد الحل باسرع وقت عندي مشكلة في شحن الابتوب حيث أن الشاحن يتصل ثم ينقطع عن الشحن عندما تزداد سرعة المروحة رغم سلامة البطارية
    1 نقطة
  13. لقد قمت بتنفيذ ما طلبته ولا زالت المشكله تظهر وهذا يحدث بشكل عام ليس له علاقه بالدوره
    1 نقطة
  14. فكرتك لاستخدام ملف الـ Print Spooler و Print Spooler API صحيحة، هنا مثال بسيط يوضح كيفية قراءة الملفات المطبوعة باستخدام Node.js و child_process: const { exec } = require('child_process'); // تعيين المسار الذي يحتوي على ملفات الطباعة المؤقتة const printSpoolerPath = 'C:\\Windows\\System32\\spool\\PRINTERS'; // قراءة الملفات المطبوعة exec(`dir /b ${printSpoolerPath}`, (error, stdout, stderr) => { if (error) { console.error(`حدث خطأ: ${error.message}`); return; } if (stderr) { console.error(`خطأ: ${stderr}`); return; } console.log(`الملفات المطبوعة: ${stdout}`); }); هذا مثال بسيط و عليك أن تبحث في الوثائق أكثر و تتعمق أكثر لتنفيذ المزيد من الوظائف مثل حذف الوظائف المطبوعة أو الوصول إلى المزيد من المعلومات المتعلقة بالطباعة.
    1 نقطة
  15. عليك أولاً إنشاء ملف Dart جديد في مشروعك وذلك الملف لعرض مجموعتي Firebase في جدول بيانات. ثم استيراد الحزم التالية في الملف: import 'package:cloud_firestore/cloud_firestore.dart'; import 'package:flutter/material.dart'; import 'package:data_table_2/data_table_2.dart'; الآن أنشيء نموذج بيانات لتمثيل البيانات في مجموعتي Firebase، فلو لديك مجموعتان "المستخدمون" و "المنتجات" ، فستحتاج إلى إنشاء نموذج بيانات لكل منهما. class User { String id; String name; String email; User({this.id, this.name, this.email}); factory User.fromFirestore(DocumentSnapshot snapshot) { return User( id: snapshot.id, name: snapshot['name'], email: snapshot['email'], ); } } class Product { String id; String name; double price; Product({this.id, this.name, this.price}); factory Product.fromFirestore(DocumentSnapshot snapshot) { return Product( id: snapshot.id, name: snapshot['name'], price: snapshot['price'], ); } } ثم استخدم FirebaseFirestore لجلب البيانات من مجموعتي "المستخدمون" و "المنتجات". final FirebaseFirestore firestore = FirebaseFirestore.instance; Stream<List<User>> getUsers() { return firestore .collection('users') .snapshots() .map((snapshot) => snapshot.docs.map((doc) => User.fromFirestore(doc))); } Stream<List<Product>> getProducts() { return firestore .collection('products') .snapshots() .map((snapshot) => snapshot.docs.map((doc) => Product.fromFirestore(doc))); } بعد ذلك استخدم DataTable2 لعرض البيانات في جدول بيانات. class MyHomePage extends StatefulWidget { @override _MyHomePageState createState() => _MyHomePageState(); } class _MyHomePageState extends State<MyHomePage> { List<User> users = []; List<Product> products = []; @override void initState() { super.initState(); getUsers().listen((event) { setState(() { users = event; }); }); getProducts().listen((event) { setState(() { products = event; }); }); } @override Widget build(BuildContext context) { return Scaffold( appBar: AppBar( title: Text('عرض مجموعات Firebase في جدول بيانات'), ), body: SingleChildScrollView( child: Column( children: [ DataTable2( columns: [ DataColumn(label: Text('اسم المستخدم')), DataColumn(label: Text('البريد الإلكتروني')), ], rows: users .map((user) => DataRow(cells: [ DataCell(Text(user.name)), DataCell(Text(user.email)), ])) .toList(), ), DataTable2( columns: [ DataColumn(label: Text('اسم المنتج')), DataColumn(label: Text('السعر')), ], rows: products .map((product) => DataRow(cells: [ DataCell(Text(product.name)), DataCell(Text(product.price.toString())), ])) .toList(), ), ], ), ), ); } } وبإمكانك الإعتماد على فلاتر لتصفية البيانات في جدول البيانات، كإضافة فلتر لعرض المستخدمين من بلد معين. class MyHomePage extends StatefulWidget {
    1 نقطة
  16. حسنا، بداية فال Print Spooler API هو واجهة برمجة التطبيقات التي يوفرها نظام التشغيل للتفاعل مع الطابعات وعمليات الطباعة، وتسمح هذه الواجهة بإضافة وإدارة الوظائف في طابعة معينة، والتحكم في الاعتبارات المطبوعة، ومراقبة حالة الطباعة، وتحديد الطابعة التي يجب استخدامها، وغير ذلك الكثير. لربط مشروعك به يمكنك استخدام لغة البرمجة التي تفضلها والتي تدعم استخدام هذه الواجهة، وبما أنك أشرت إلى استخدام Node.js فيمكنك البدء باالبحث عن وثائق الـ Print Spooler API المتوفرة لنظام التشغيل الذي تستخدمه (هذه الوثائق تحدد الوظائف والطرق المتاحة للتفاعل مع نظام الطباعة). ثم استخدام مكتبة Node.js للتفاعل مع الـ Print Spooler API مثل `child_process` لتشغيل الأوامر أو `edge` للتفاعل مع مكتبات الـ .NET الخاصة بـ Print Spooler API. يمكنك تنفيذ العمليات المطلوبة مثل إضافة وظائف طباعة، وإزالة وظائف، واستعراض حالة الطابعات، وما إلى ذلك. وبما أن عمليات الطباعة قد تأخذ وقتا، يمكنك متابعة استجابات الـ Print Spooler API واتخاذ الإجراءات المناسبة بناء على النتائج. لكن ستحتاج إلى الانتباه إلى الأمان عند التفاعل مع الـ API، حيث يجب التأكد من صحة وموثوقية البيانات المرسلة واستخدام الإجراءات الصحيحة لتفادي الهجمات أو المشاكل الأمنية المحتملة.
    1 نقطة
  17. نعم يوجد وبكل بساطة هو الامر shutdown حيث انه يمكنك كتابته كالتالي: shutdown /s /t 0 s لايقاف التشغيل /t يتم تحديد الوقت بعدها 0 تعني ايقاف تشغيل الكومبيوتر على الفور ومثلا ان كنت تريد ايقاف تشغيل الكومبيوتر ولكن بعد 5 دقايق فتقوم بتحويل الدقائق الى ثواني وتكتبها مكان الرقم 0 وهنا 5 دقائق عبارة عن 300 ثانية لذلك نكتب الامر التالي shutdown /s /t 300 اما اذا كنت تريد ايقاف تشغيله في وقت معين مثلا الساعة 7 مساءا ف عليك بكتابة الامر التالي echo shutdown /s /f | at 19:00 لاحظ اننا استخدمنا نظام ال 24 ساعة بالوقت لمعرفة ان كان القصد صباحا او مساءا هذا كل ما يخص ايقاف التشغيل عبر سطر الاوامر وبالتوفيق لك
    1 نقطة
  18. هل يمكنك ارسال صورة للصفحة ؟ وايضا العنوان الذى يتم توجيهك اليه ؟
    1 نقطة
  19. تُعد SQLite قاعدة بيانات SQL قائمة بحد ذاتها self-contained، ومعتمدة على الملفات file-based، وهي مُضمّنة في بايثون افتراضيًا، إذ من الممكن استخدامها في أي من تطبيقات بايثون دون الحاجة لتثبيت أي برمجيات إضافية. سنتعرف في هذا المقال على الوحدة sqlite3 في بايثون 3، إذ سننشئ اتصالاً مع قاعدة بيانات SQLite، كما سنضيف جدولاً إليها، وسندخل بعض البيانات إلى هذا الجدول ونقرأها ونعدّلها. سنتعامل في هذا المقال مع مثال لتطبيق جرد مخزون أسماك في حوض مُفترض، وبالتالي لا بُدّ من التعديل في حال إضافة أو إزالة سمكة من الحوض. مستلزمات العمل لتحقيق أقصى فائدة ممكنة من هذا المقال، يُفضّل أن تكون مُطّلعًا على البرمجة بلغة بايثون وعلى أساسيات لغة SQL، وفي هذا الصدد ننصحك بقراءة المقالات التالية قبل إكمال هذا المقال: مدخل إلى لغة بايثون البرمجية. تعلم أساسيات MySQL. الخطوة الأولى – إنشاء اتصال مع قاعدة بيانات SQLite عند إنشاء اتصال مع قاعدة بيانات SQLite، فإنّنا نصل بالنتيجة إلى بيانات موجودة في ملف ما على جهاز الحاسوب، حيث تُعد محركات قواعد بيانات SQL كاملة الميزات ويمكن استخدامها لأغراض متعددة، وسنتعامل في مقالنا الحالي مع قاعدة بيانات تُعنى بتعقّب مخزون الأسماك في حوض أسماك مُفترض. يمكن الاتصال بقاعدة البيانات SQLite باستخدام الوحدة sqlite3 في بايثون على النحو التالي: import sqlite3 connection = sqlite3.connect("aquarium.db") حيث تستورد التعليمة import sqlite3 الوحدة sqlite3، مما يمنح برنامج بايثون وصولًا إلى هذه الوحدة، بينمّا تعيد الدالة ()sqlite3.connect كائن اتصال Connection والذي سنستخدمه في التخاطب مع قاعدة البيانات SQLite الموجودة في الملف aquarium.db الذي يُنشأ تلقائيًا من قبل الدالة ()sqlite3.connect في حال عدم وجود ملف بنفس الاسم أصلًا في الحاسوب. يمكن التأكد من أنّ الكائن connection قد أُنشئ بنجاح عبر تشغيل الأمر التالي: print(connection.total_changes) وبتشغيل شيفرة بايثون السابقة، سيظهر لنا الخرج التالي: 0 إذ تمثّل سمة الكائن connection.total_changes إجمالي عدد السجلات (الأسطر) التي جرى تغييرها من قبل الكائن connection، ولكننا لم ننفّذ أي تعليمات SQL حتى الآن، ما يعني أنّ العدد 0 صحيح لعدد التغييرات الإجمالي total_changes حاليًا. وفي حال رغبتك بإعادة خطوات هذا المقال من البداية في أي وقت، يمكنك حذف الملف "aquarium.db" من حاسوبك. ملاحظة: من الممكن أيضًا الاتصال بقاعدة بيانات SQLite مُتصلة بالذاكرة مُباشرةً (وليس بملف) عبر تمرير السلسة النصية الخاصّة ":memory:" إلى الدالة ()sqlite3.connect كما يلي: sqlite3.connect(":memory:") من الجدير بالملاحظة أنّ هذا النوع من قواعد البيانات سيختفي بمجرّد إنهاء برنامج بايثون، ما يجعلها مناسبة للحالات التي نحتاج فيها إلى استخدام وضع الحماية مؤقتًا (البيئة التي يمكن للمطور من خلالها العمل على مشروع قاعدة بيانات دون تعريض البيانات للخطر في حالة حدوث خطأ ما) بغية اختبار أمر ما في SQLite دون الحاجة إلى البيانات بعد إنهاء البرنامج. الخطوة الثانية – إضافة بيانات إلى قاعدة البيانات SQLite الآن وبعد أن أنشأنا الاتصال مع قاعدة بيانات SQLite المُتمثلّة بالملف "aquarium.db"، أصبح من الممكن البدء بإدخال البيانات إلى قاعدة البيانات وقراءتها منها؛ إذ تُخزّن البيانات في قواعد بيانات SQLite ضمن جداول، التي تعرّف مجموعةً من الأعمدة قد تكون خالية تمامًا، أو محتوية على سجل واحد أو أكثر، بحيث يتضمّن كل سجل بيانات موافقة للأعمدة المُعرفّة في الجدول. سننشئ جدولًا باسم "fish" يتتبع البيانات التالية: ------------------------------------------------------ | tank_number | species | name | ------------------------------------------------------ | 1 | shark | Sammy | ------------------------------------------------------ | 7 | cuttlefish | Jamie | ------------------------------------------------------ سيتتبع الجدول "fish" قيم الاسم name والنوع species ورقم الخزّان tank_number لكل سمكة في الحوض، وقد ضمّنا مثالين لسجلات الأسماك، الأول لسمكة من نوع قرش shark باسم Sammy، والآخر لسمكة من النوع حبّار cuttlefish باسم Jamie. ومن الممكن إنشاء الجدول fish في SQLite اعتمادًا على الكائن connection المُنشأ في الخطوة الأولى من هذا المقال، على النحو التالي: cursor = connection.cursor() cursor.execute("CREATE TABLE fish (name TEXT, species TEXT, tank_number INTEGER)") إذ تعيد الدالة ()connection.cursor في الشيفرة السابقة كائن مؤشّر Cursor، والذي يمكنّنا من تنفيذ تعليمات SQL على قاعدة البيانات SQLite باستخدام الدالة ()cursor.execute، أمّا السلسة النصية "... CREATE TABLE fish" فهي تعليمة SQL تُنشئ جدولًا باسم fish مُتضمنًا الأعمدة الثلاث التي أشرنا إليها سابقًا وهي الاسم name، الذي يحتوي بيانات من النوع النصي TEXT، والنوع species الذي يحتوي أيضًا بيانات من النوع النصي TEXT، ورقم الخزان tank_number، الذي يحتوي بيانات من نوع عدد صحيح INTEGER. الآن وبعدما أنشأنا الجدول، أصبح من الممكن إدخال سجلات البيانات إليه: cursor.execute("INSERT INTO fish VALUES ('Sammy', 'shark', 1)") cursor.execute("INSERT INTO fish VALUES ('Jamie', 'cuttlefish', 7)") استدعينا في الشيفرة السابقة الدالة ()cursor.execute مرتين، المرة الأولى بغية إدخال السجل الخاص بالسمكة القرش المسماة Sammy إلى الخزان رقم "1"، والثانية لإدخال سمكة الحبار المسمّاة Jamie إلى الخزان رقم "7"، أمّا السلسة النصية "... INSERT INTO fish VALUES" فهي تعليمة SQL مسؤولة عن إدخال السجلات إلى الجدول. أمّا في الخطوة التالية فسنستخدم تعليمة SELECT من تعليمات SQL بغية التحقّق من السجلات المُدخلة إلى جدول الأسماك "fish". الخطوة الثالثة – قراءة بيانات من قاعدة البيانات SQLite أضفنا في الخطوة السابقة سجلين إلى جدول الأسماك "fish" في قاعدة البيانات SQLite، ومن الممكن جلب هذه السجلات باستخدام التعليمة SELECT من تعليمات SQL على النحو التالي: rows = cursor.execute("SELECT name, species, tank_number FROM fish").fetchall() print(rows) وحال تشغيل هذه الشيفرة، سيظهر الخرج التالي: [('Sammy', 'shark', 1), ('Jamie', 'cuttlefish', 7)] شغّلت الدالة ()cursor.execute -في الشيفرة السابقة- تعليمة SELECT بغية جلب قيم كل من أعمدة الاسم والنوع ورقم الخزان من جدول الأسماك "fish"، لتجلب الدالة ()fetchall كافّة نتائج التعليمة SELECT، ولدى تنفيذ التعليمة (print(rows ستظهر قائمةٌ مكونةٌ من سجلين، ولكل سجل ثلاثة مُدخلات يمثّل كل منها عمود من الأعمدة التي اخترناها من جدول الأسماك، إذ يتضمّن هذان السجلان البيانات التي أدخلناها في الخطوة الثانية، بمعنى أنّنا سنحصل على سجل لسمكة القرش "Sammy"، وسجل لسمكة الحبّار "Jamie"، وفي حال كان المطلوب جلب السجلات من جدول الأسماك التي تحقّق مجموعة من المعايير المُحدّدة، فمن الممكن استخدام العبارة WHERE على النحو التالي: target_fish_name = "Jamie" rows = cursor.execute( "SELECT name, species, tank_number FROM fish WHERE name = ?", (target_fish_name,), ).fetchall() print(rows) وعند تشغيل الشيفرة، سنحصل على الخرج التالي: [('Jamie', 'cuttlefish', 7)] تعمل التعليمة ()cursor.execute(<SQL statement>).fetchall في المثال السابق على جلب كافّة النتائج من التعليمة SELECT، بينما تعمل العبارة WHERE في التعليمة SELECT على ترشيح السجلات لتكون فقط تلك التي تكون فيها قيمة العمود name هي target_fish_name، ومن الجدير بالملاحظة أنّه من الممكن استخدام الموضع المؤقت ? بديلًا عن المتغير target_fish_name ضمن التعليمة SELECT، ومن المتوقّع في حالتنا أن يوافق سجلًا واحدًا هذا المعيار، إذ ستكون القيمة المعادة بعد الترشيح هي سجل سمكة الحبّار "Jamie". تنبيه: لا تستخدم عمليات بايثون على السلاسل النصية أبدًا في إنشاء تعليمات SQL ديناميكيًا، إذ يعرّضك استخدام هذه العمليات في تجميع السلاسل النصية لتعليمات SQL إلى خطر هجمات حقن استعلامات SQL المُستخدمة بغية سرقة أو تحريف أو تعديل البيانات المُخزّنة في قاعدة البيانات، وعوضًا عن ذلك استخدم الموضع المؤقت ? في تعليمات SQL عند رغبتك بتعويض القيم تلقائيًا من قبل برنامج بايثون، إذ نمرر مجموعةً من القيم المُجمّعة مثل وسيط ثاني في الدالة ()Cursor.execute لربط هذه القيم بتعليمات SQL، وهذا النمط من التعويض مشروح في مقالنا. الخطوة 4 – تعديل البيانات في قاعدة بيانات SQLite من الممكن تعديل السجلات في قاعدة البيانات SQLite باستخدام تعليمتي UPDATE و DELETE من تعليمات SQL. لنفترض على سبيل المثال أنّه قد نُقل القرش "Sammy" إلى الخزان رقم 2، فعندها من الممكن تعديل سجل هذه السمكة في الجدول "fish" للتعبير عن هذا التغيير على النحو التالي: new_tank_number = 2 moved_fish_name = "Sammy" cursor.execute( "UPDATE fish SET tank_number = ? WHERE name = ?", (new_tank_number, moved_fish_name) ) استخدمنا في الشيفرة السابقة تعليمة UPDATE من تعليمات SQL لتغيير رقم الخزان tank_number للسمكة Sammy إلى القيمة الجديدة "2"، إذ تضمن الجملة WHERE في التعليمة UPDATE أنّه لن تتغير قيمة رقم الخزان إلا عند تحقق شرط وهو أن يكون اسم السمكة هو Sammy أي "name = "Sammy، ومن الممكن التأكّد من تنفيذ التعديل بالشكل الصحيح من خلال تشغيل تعليمة SELECT التالية: rows = cursor.execute("SELECT name, species, tank_number FROM fish").fetchall() print(rows) وبتشغيل الشيفرة السابقة سنحصل على الخرج التالي: [('Sammy', 'shark', 2), ('Jamie', 'cuttlefish', 7)] فنلاحظ أنّ السجل الخاص بالسمكة "Sammy" يملك القيمة "2" مثل رقم للخزان ضمن العمود tank_number. الآن لنفترض أنّنا حرّرنا القرش Sammy إلى الطبيعة، وبالتالي لم يعد موجودًا في الحوض، عندها يتوجّب حذف السجل الخاص به من الجدول "fish"، لذا سنستخدم التعليمة DELETE من تعليمات SQL لحذف السجل المطلوب كما يلي: released_fish_name = "Sammy" cursor.execute( "DELETE FROM fish WHERE name = ?", (released_fish_name,) ) استخدمنا في الشيفرة السابقة التعليمة DELETE من تعليمات SQL لحذف سجل السمكة Sammy من النوع shark، إذ ضمنت الجملة WHERE في التعليمة DELETE أنّه لن يُحذف السجل إلّا عند تحقق شرط كون اسم السمكة هو Sammy أي "name = "Sammy، ومن الممكن التأكّد من تنفيذ الحذف بالشكل الصحيح من خلال تشغيل تعليمة SELECT التالية: rows = cursor.execute("SELECT name, species, tank_number FROM fish").fetchall() print(rows) وبتشغيل الشيفرة السابقة سنحصل على الخرج التالي: [('Jamie', 'cuttlefish', 7)] فنلاحظ أنّه قد حُذف فعلًا السجل الخاص بالسمكة Sammy من النوع shark، ولم يتبقَ سوى سجل سمكة Jamie من نوع الحبّار cuttlefish. الخطوة 5 – استخدام تعليمة with للإغلاق الآلي استخدمنا في هذا المقال كائنين رئيسين للتعامل مع قاعدة البيانات "aquarium.db" من النوع SQLite وهما: كائن اتصال باسم connection وكائن مؤشّر باسم cursor. يتوجّب إغلاق ملفات بايثون بعد الانتهاء من العمل عليها، وكذلك الأمر بالنسبة للكائنات مثل Connection و Cursor، إذ يجب إغلاقها عند الانتهاء من استخدامها، ومن الممكن استخدام العبارة with لمساعدتنا على إغلاق الكائنات Connection و Cursor تلقائيًا على النحو التالي: from contextlib import closing with closing(sqlite3.connect("aquarium.db")) as connection: with closing(connection.cursor()) as cursor: rows = cursor.execute("SELECT 1").fetchall() print(rows) تُعد الدالة closing من الدوال سهلة الاستخدام التي توفّرها الوحدة contextlib، فعند إنهاء التعليمة with، تضمن closing استدعاء الدالة ()close بغض النظر عن الكائن المُمرّر إليها، وفي مثالنا استخدمنا الدالة closing مرتين، الأولى لضمان الإغلاق التلقائي للكائن Connection المُعاد من الدالة ()sqlite3.connect، والثانية لضمان الإغلاق التلقائي للكائن Cursor المُعاد من الدالة ()connection.cursor، وبتشغيل الشيفرة السابقة سنحصل على الخرج التالي: [(1,)] وبما أنّ التعليمة "SELECT 1" هي تعليمة SQL تعيد دومًا سجلًا وحيدًا بعمود وحيد قيمتة "1"، فمن المنطقي في هذه الحالة الحصول على سجل يحتوي فقط القيمة "1" بمثابة قيمة معادة من الشيفرة. الخاتمة تمثّل الوحدة sqlite3 جزءًا فعّالًا من مكتبة بايثون المعيارية، إذ تمكنّنا من العمل مع قاعدة بيانات SQL محلية كاملة الميزات دون الحاجة لتثبيت أي برمجيات إضافية. استعرضنا في هذا المقال كيفية استخدام الوحدة sqlite3 للاتصال مع قاعدة بيانات SQLite، وكيفية إضافة البيانات إليها وقراءتها منها وتعديلها، كما نوهّنا لأخطار هجمات حقن استعلامات SQL، وبيّنا كيفية استخدام contextlib.closing لاستدعاء الدالة ()close تلقائيًا وتطبيقها على كائنات بايثون الموجودة ضمن عبارات with. ترجمة -وبتصرف- للمقال How To Use the sqlite3 Module in Python 3 لصاحبه DavidMuller. اقرأ أيضًا إضافة PHP MySQLi ونظام إدارة قواعد البيانات SQLite3 التعامل مع قواعد البيانات SQLite في تطبيقات Flask النسخةالعربية الكاملة لكتاب البرمجة بلغة بايثون
    1 نقطة
×
×
  • أضف...