Автоинкрементный атрибут с пользовательской логикой в ​​SQLAlchemy - PullRequest
1 голос
/ 24 июня 2009

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

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

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

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

1 Ответ

3 голосов
/ 24 июня 2009

Есть ли какая-то особая причина, по которой вы не просто используете параметр 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)
    ...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...