Автоинкрементный атрибут с пользовательской логикой в SQLAlchemy
-
10-07-2019 - |
Вопрос
У меня есть простая "Счета-фактуры" класс с " номером " атрибут, который должен быть назначенным приложением, когда пользователь сохраняет счет. Там некоторые ограничения:
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)
...