SQLAlchemy с несколькими первичными ключами не устанавливает автоматически

У меня была простая таблица:

class test(Base):
    __tablename__ = 'test'
    id = Column(Integer, primary_key=True)
    title = Column(String)

    def __init__(self, title):
        self.title = title

При использовании этой таблицы id устанавливался автоматически. Я хочу добавить еще одно поле, уникальное и эффективное для поиска, поэтому я добавил поле:

id2 = Column(String, primary_key=True)

И обновил конструктор:

def __init__(self, id2, title):
    self.id2 = id2
    self.title = title

Теперь id больше не устанавливается автоматически, точнее я получаю ошибку:

IntegrityError: (IntegrityError) test.id не может быть NULL u'INSERT INTO test (id2, title) VALUES (?, ?)' [u'a', u'b']

Есть ли способ сохранить второй первичный ключ, не удаляя поведение автоинкремента первого?


person muckabout    schedule 10.03.2010    source источник


Ответы (1)


у меня тут мало проблем

1) Какова цель вашей ручной работы __init__? Если он делает именно то, что вы написали, вы можете полностью опустить конструктор, поскольку механизм SQLAlchemy автоматически генерирует один и тот же конструктор для всех ваших моделей. Хотя, если вы предпримете какие-то дополнительные действия и, таким образом, вам придется переопределить __init__, вы, вероятно, захотите вызвать суперконструктор:

def __init__(self, lalala, *args, **kwargs):
   # do something with lalala here...
   super(test, self).__init__(*args, **kwargs)
   # ...or here

2) Если у вас есть более одного поля с primary_key=True, вы получаете модель с составным первичным ключом. Составные первичные ключи автоматически не генерируются, так как здесь возникает двусмысленность: чем последующий ключ должен отличаться от предыдущего?

Я подозреваю, что то, что вы пытаетесь достичь, может быть достигнуто с использованием уникального индексированного столбца, а не с использованием составного ключа:

class test(Base):
    __tablename__ = 'test'
    id = Column(Integer, primary_key=True)
    id2 = Column(String, index=True, unique=True)
    title = Column(String)

    # def __init__(self) is not necessary
person nkrkv    schedule 10.03.2010