كيفية إضافة مرشح تلقائي لعلاقة مع SQLAlchemy؟

StackOverflow https://stackoverflow.com/questions/267861

  •  06-07-2019
  •  | 
  •  

سؤال

أنا أستخدم SQLAlchemy 0.5rc، وأرغب في إضافة مرشح تلقائي إلى العلاقة، بحيث في كل مرة تحاول جلب سجلات لهذه العلاقة، فإنها تتجاهل السجلات "البعيدة" إذا تم وضع علامة عليها على أنها "محذوفة_منطقيًا" "(حقل منطقي للجدول الفرعي)

على سبيل المثال ، إذا كان للكائن "الوالد" علاقة "أطفال" لها 3 سجلات ، ولكن يتم حذف أحدهم منطقياً ، عندما أستفسر عن "Parent" أود أن تجلب SQLA الكائن الأصل مع طفلان فقط. .
كيف أفعل ذلك؟عن طريق إضافة شرط "و" إلى المعلمة الأولية للعلاقة؟(على سبيل المثال"Children.parent_id == Parent.id and Children.logically_deleted == False"، ولكن هل يصح كتابة "و" بهذه الطريقة؟)

يحرر:
تمكنت من القيام بذلك بهذه الطريقة

children = relation("Children", primaryjoin=and_(id == Children.parent_id, Children.logically_deleted==False))

ولكن هل هناك طريقة لاستخدام سلسلة كربط أساسي بدلاً من ذلك؟

هل كانت مفيدة؟

المحلول

الدالة and_() هي الطريقة الصحيحة لإجراء عمليات الاقتران المنطقية في SQLAlchemy، جنبًا إلى جنب مع العامل &، ولكن كن حذرًا مع الأخير لأنه يحتوي على قواعد أسبقية مفاجئة، أي.أسبقية أعلى من عوامل المقارنة.

يمكنك أيضًا استخدام سلسلة كصلة أساسية مع مُنشئ text()، ولكن ذلك سيؤدي إلى قطع التعليمات البرمجية الخاصة بك مع أي اسم مستعار للجدول يأتي مع التحميل السريع والارتباطات.

بالنسبة للحذف المنطقي، قد يكون من الأفضل تعيين الفصل بأكمله عبر تحديد يتجاهل القيم المحذوفة:

mapper(Something, select([sometable], sometable.c.deleted == False))

نصائح أخرى

ولكن هل هناك طريقة لاستخدام سلسلة كربط أساسي بدلاً من ذلك؟

يمكنك استخدام ما يلي:

children = relationship("Children", primaryjoin="and_(Parent.id==Children.parent_id, Children.logically_deleted==False)"

لقد نجح هذا بالنسبة لي!

أقوم حاليًا بتطوير الإصدار 0.4.something مرة أخرى فقط، ولكن إليك الطريقة التي أقترح بها ذلك:

db.query(Object).filter(Object.first==value).filter(Object.second==False).all()

أعتقد أن هذا ما تحاول القيام به، أليس كذلك؟

(ملحوظة:مكتوب في متصفح ويب، وليس رمزًا حقيقيًا!)

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top