سؤال

حاليا أقوم بتقييم أطر الويب مع طبقة orm وتعثرت على مشكلة مثيرة للاهتمام. لقد استخدمت جداول مع عمود معرف في تطبيق Java EE (EJB3 / JPA) مع قواعد بيانات مختلفة. في SAPDB، يمكنني تحديد تسلسل واستخدام توضيح مولد تسلسل JPA للتعامل معها، بنفس الطريقة التي قمت بها على قاعدة بيانات Oracle سابقا. عندما تحولت إلى SQL Server 2005، اضطررت فجأة إلى استبدال الأمر بأكمله بشراح تعريف الهوية لأن هذا هو كيفية معالجة SQL Server توليد الهوية على ما يبدو. لقد شعرت بخيبة أمل Kinda، لم أعطني JPA التجريد أعلاه، وأعتقد أنه ليس القيد الوحيد الذي سأصل إليه باستخدام قواعد بيانات مختلفة.

الآن إلى سؤالي: لقد قرأت أنه في Web2py على سبيل المثال يجب تغيير جميع الجداول لاستخدام فهرس Auto_increment. هل يدعم مولدات التسلسل أو أعمدة الهوية كذلك؟ ماذا عن أطر الويب الأخرى؟ هل سيسمحون لي بمنفذ طلبي عبر قواعد بيانات إرث متعددة؟ وهذا يعني أن تعريفات الطاولة هي نفسها باستثناء عمود الهوية والاختلافات الطفيفة بين تعريف نوع البيانات للحصول على سلاسل (أتذكر تغيير بيانات إنشاء هناك ولكن لا أستطيع أن أتذكر ما كان ضروريا بالضبط)

هناك أيضا اختلاف في الحصول على المعرف - باستخدام مولد التسلسل، يمكنك الوصول إلى المعرف الذي تم إنشاؤه قبل الالتزام، مع Auto_incrent في MySQL، AFAIK، لا يمكنك ذلك.

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

المحلول

يمكن Sqlalchemy التعامل مع كلا الاتجاهين على ما يرام. بالنظر إلى إعلان مخطط مثل هذا:

class Foo(Base):
    id = Column(Integer, Sequence('foo_seq', optional=True), primary_key=True)
    ...

سيستخدم Sqlalchemy النموذج المدمج في قاعدة البيانات المدمجة في قاعدة البيانات إذا كان لديه واحد، وإلا فإنه سيحدد تسلسل. يدير أيضا جلب الهوية التي تم إنشاؤها، ولكن نظرا لأن API مقاما شائعا، فمن الواضح أنك لا تستطيع الوصول إليها قبل الإدراج. يمكنك من جديد جلب المعرف يدويا إذا كنت تريد ذلك. على سبيل المثال بالنسبة لل postgresql التي لها تسلسل، ولكن لديها أيضا زيادة تلقائية serial نوع البيانات الذي يدعمه التسلسلات، وهذا سيستخدم serial نوع البيانات. مع الإصدارات الأقدم، ستجلب تلقائيا قيمة التسلسل التالي لاستخدامها في إدراج، مع SQLAlchemy 0.6 Series and Postgres 8.3+ سيستخدم INSERT ... RETURNING ... ميزة لإدراج وجلب في واحد الذهاب.

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