صناعة السيارات في تزايد السمة مع منطق العرف في SQLAlchemy

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

سؤال

لدي بسيط "الفواتير" الطبقة مع "عدد" السمة التي يجب أن تم التطبيق عندما يقوم المستخدم بحفظ الفاتورة.هناك بعض القيود:

1) التطبيق هو (رقيقة) ملقم-عميل واحد ، لذلك مهما كان يعين عدد يجب أن ابحث عن التصادم
2) الفواتير لديه "نسخة" سمة جدا, لذلك أنا لا يمكن استخدام بسيط DBMS مستوى autoincrementing المجال

أنا أحاول بناء هذا باستخدام نوع مخصص من شأنها أن ركلة في كل الوقت يحصل على فاتورة حفظها.كلما process_bind_param يسمى مع أي قيمة من المفرد من نوع لتحديد عدد وتجنب الاصطدامات.هل هذا لائق الحل ؟ على أي حال, أنا أعاني من مشكلة..هنا هو بلدي نوع مخصص:

class AutoIncrement(types.TypeDecorator):
   impl = types.Unicode

   def copy(self):
       return AutoIncrement()

   def process_bind_param(self, value, dialect):
       if not value:
           # Must find next autoincrement value
           value = "1" # Test value :)
       return value

مشكلتي الآن هي أنني عندما حفظ فاتورة تعداد مجموعات "1" مثل القيمة عن رقم الفاتورة سبيل المثال لا الحصول على تحديث مع عدد جديد..هذا هو المتوقع ؟ أنا في عداد المفقودين شيء ما ؟ شكرا جزيلا على وقتك!

(SQLA 0.5.3 على بيثون 2.6 باستخدام كيو 8.3)

تحرير: مايكل باير قال لي أن هذا السلوك المتوقع منذ TypeDecorators لا تتعامل مع القيم الافتراضية.

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

المحلول

هل هناك أي سبب معين لا مجرد استخدام default= المعلمة في العمود التعريف ؟ (وهذا يمكن أن يكون تعسفيا الثعبان المستحقة).

def generate_invoice_number():
    # special logic to generate a unique invoice number

class Invoice(DeclarativeBase):
    __tablename__ = 'invoice'
    number = Column(Integer, unique=True, default=generate_invoice_number)
    ...
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top