csql هي مكتبة Python لمساعدتك في الكتابة بشكل أكثر سهولة استفسارات SQL. يمكنك كتابة استفساراتك على هيئة أجزاء صغيرة قائمة بذاتها ، ومعاينة النتائج دون سحب مجموعة النتائج بالكامل من قاعدة البيانات الخاصة بك ، ثم الرجوع إليها في الاستعلامات المستقبلية.

هناك أيضًا ميزات مفيدة للتعامل مع معلمات قاعدة البيانات بشكل صحيح.

حالة الاستخدام المقصودة هي لتحليل البيانات واستكشافها. هناك جزء خاص من التنفيذ الحالي يقودني إلى عدم تشجيع استخدام هذا في تطبيق منتج: لهذا السيناريو ، لا يزال بإمكانك استخدام هذا لإنشاء SQL في خطوة إنشاء أو شيء من هذا القبيل.

PyPI version

مثال:

 من عند  csql 

استيراد س

، المعلمات استيراد الباندا مثل PD من عند التاريخ والوقت استيراد تاريخ يخدع

= اتصالك بقاعدة البيانات ()

ابدأ باستعلام مباشر:

  ص 

= المعلمات( تم إنشاؤها على = تاريخ( 2020 ، 1 ، 1 )) q1 = س ( لامدا : F””” تحديد customers.id ، أولاً (customers.name) كاسم ، أولاً (تم إنشاؤه على) كما تم إنشاؤه على ، مجموع (قيمة المبيعات) كمبيعات من عند عملاء الانضمام إلى المبيعات على العملاء. id=sales.customer_id حيث تم إنشاؤه على> { ص } } بواسطة customers.id “” ، ص ) طباعة( q1 . preview_pd ( يخدع ))

1
هوية شخصية اسم تم إنشاؤها على المبيعات

111 جون سميث 2020-02-05 32.0

2 112 ايمي تشانغ 2020-05-01 101.5 3 115

تران ثانه 2020-03-02 100000.0


ستسحب المعاينة 10 صفوف إلى أ) تحقق من سلامة نتيجة ما كتبته للتو ، و ب) تحقق من صحة ملف SQL الخاص بك


الآن ، حاول إنشاء بعض الاستعلامات الجديدة التي تبني على استفساراتك السابقة :

 

q2 = س

( لامدا : F””” تحديد ntile (100) أكثر (الطلب حسب المبيعات) كـ ntile_100 ، اسم، مبيعات من عند { q1 } “” ) طباعة( q2 . preview_pd ( يخدع ))

1
ntile_100 اسم
مبيعات

29 يوحنا حداد

32.0

2

50

ايمي تشانغ 101.5

3

99 تران ثانه

100000.0

  q3  

= س

( لامدا : F””” تحديد ntile_100 ، دقيقة (مبيعات) ، ماكس (مبيعات) من عند { q2 } المجموعة بواسطة ntile_100 ترتيب بواسطة ntile_100 “” “) # هذه المرة ، سنقوم بسحب النتيجة كاملة بدلاً من مجرد المعاينة: نتيجة = PD . read_sql ( q3 . PD () ، يخدع = يخدع ) طباعة(نتيجة)

ntile_100

دقيقة (مبيعات) ماكس (مبيعات)

28

29 25

33.3

49 50 98 120 98 99 5004 100000.0

رائع! ولكن ، كيف تعمل؟

الفكرة الأساسية هي تحويل استفساراتك إلى CTE من خلال تتبع ما يبني فوق ما. على سبيل المثال ، بالنسبة إلى الاستعلام الأخير المعروض ،

مع _subQuery0 مثل ( تحديد عملاء

. معرف ، أولاً ( عملاء . اسم) باسم الاسم الأول (تم إنشاؤه على) كـ تم إنشاؤه على ، مجموع(مبيعات.القيمة) كمبيعات من عملاء الانضمام إلى مبيعات على العملاء . هوية شخصية = مبيعات.هوية الزبون حيث تم إنشاؤها على > : 1 العملاء . المعرف ) ، _subQuery1 مثل ( حدد ntile ( 100 ) أكثر من ( ترتيب حسب المبيعات) كـ ntile_100 ، الاسم ، المبيعات من {q1}) حدد ntile_100 ، دقيقة (مبيعات) ، ماكس (مبيعات) من {q2} المجموعة حسب ntile_100 ترتيب حسب ntile_100

وهو بالضبط نوع من الوحشية التي لا يمكن السيطرة عليها ولا يمكن التلاعب بها أن هذه المكتبة مصممة لمساعدتك على تجنبها.

      ملاحظات التصميم: 

ربما أكون مفرطًا في التفاؤل بشأن هذا الأمر ، لكنني أعتقد حاليًا أن هذا يجب أن يعمل مع معظم لهجات SQL. لا يحاول تحليل SQL الخاص بك ، ويستخدم CTEs المدعومة على نطاق واسع ، ويمرر معلمات النمط الرقمي. كما أنه غير مرتبط فعليًا بـ

  •   المهام / التجارب المستقبلية:  

  • توثيق واجهة برمجة التطبيقات (في الوقت الحالي ، فقط اقرأ الاختبارات) تنفيذ أنظمة معاينة أخرى بخلاف الباندا ؟)

    ما هو ذلك “الجزء المخترق من التنفيذ الحالي”؟

    يسعدني أن تسأل. انظر فيما يجري هنا:

     

    س ( لامدا

    : f “” حدد 1 من { استعلام آخر }

      "" 

    )

    نحن بحاجة إلى

  • احصل على SQL بطريقة يمكننا إدخال التبعيات فيها
  • تكاد تكون سلسلة الاستيفاء كافية لهذا الغرض. لسوء الحظ ، تفتقر Python إلى القدرة على “ربط” سلسلة الاستيفاء بالقدر المطلوب. على سبيل المثال ، في Javascript أو Julia ، سيكون من الممكن تحديد دالة استيفاء سلسلة أو سلسلة ماكرو مثل

      س  

    `حدد 1 من $ { otherQuery }

    ` )

    وسوف يرضي كل ما سبق.

    ومع ذلك ، تفتقر Python إلى هذه القدرة ، ولا يضيفها PEP ‘ من المحتمل أن تهبط في أي وقت قريب ، إن وجدت (انظر:
    https://www.python.org/dev/peps/pep-0501/ )

    كحل بديل ، فإن استراتيجيتي الحالية هي طلب

    يبدو أن هذا يعمل في معظم الحالات البسيطة والتنفيذ ليس معقدًا. ومع ذلك فهي لا تزال هشة وقليلة (عمليًا ، أكبر عيب وجدته هو أنه لن يعمل في REPL.)

    ٪٪ item_read_more_button ٪٪

    ترك الرد

    من فضلك ادخل تعليقك
    من فضلك ادخل اسمك هنا