Автоинкрементный атрибут с пользовательской логикой в ​​SQLAlchemy

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

Вопрос

У меня есть простая "Счета-фактуры" класс с " номером " атрибут, который должен быть назначенным приложением, когда пользователь сохраняет счет. Там некоторые ограничения:

1) приложение является (тонким) клиент-серверным, так что назначает номер должен высматривать столкновения
2) Счета-фактуры имеют «версию» атрибут, поэтому я не могу использовать простой Поле автоинкрементации на уровне СУБД

Я пытаюсь построить это, используя пользовательский тип, который будет вставлять каждый время, когда счет будет сохранен. Всякий раз, когда process_bind_param вызывается с значение None, для вызова номер и избегать столкновений. Это достойное решение? Во всяком случае, у меня проблема .. Вот мой пользовательский тип:

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" в качестве значения для его номера экземпляр Invoice не получает обновляется с новым номером .. Это ожидается? Я скучаю что-то? Большое спасибо за ваше время!

(SQLA 0.5.3 на Python 2.6, используя postgreSQL 8.3)

Правка . Майкл Байер сказал мне, что такое поведение ожидается, поскольку TypeDecorators не работают со значениями по умолчанию.

Это было полезно?

Решение

Есть ли какая-то конкретная причина, по которой вы не просто используете параметр default = в определении столбца? (Это может быть произвольный вызываемый Python).

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