2014-12-16 2 views
13

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

class Widget(db.Model): 
    __tablename__ = 'widgets' 
    ext_id = db.Column(db.Integer, primary_key=True) 
    w_code = db.Column(db.String(34), unique=True) 
    # other traits follow... 

Все значения полей предоставляются через внешнюю систему, и новые виджеты обнаружены и некоторые значений пропущенных признаков может меняться со временем (очень постепенно), но ext_id и w_code гарантированно будут уникальными. Учитывая природу значений для ext_id, он ведет себя идеально как первичный ключ.

Однако, когда я создаю новую запись, указав значение ext_id, значение не используется в хранилище. Вместо этого значения в ext_id следуют за поведением автоматического увеличения.

>>> # from a clean database 
>>> skill = Widget(ext_id=7723, w_code=u'IGF35ac9') 
>>> session.add(skill) 
>>> session.commit() 
>>> Skill.query.first().ext_id 
1 
>>> 

Как я могу указать SQLAlchemy, что ext_id поле должно быть использовано в качестве поля первичного ключа без автоматического увеличения?

Примечание: Я мог бы добавить дополнительный синтетический столбец id в качестве первичного ключа и сделать ext_id уникальным столбцом вместо этого, но это и усложняет мой код, и добавляет (минимальный) дополнительный вздутие в базу данных и все операции ввода-вывода Это. Я надеюсь избежать этого.

Проблема возникла из более крупного проекта, но я смог создать меньший репродукт.

Тестирование с SQLite

+0

Как выглядит ваш виджет .__ init__? Я думаю, что я использую функцию, которая вам нужна именно так, как вы, кажется, используете ее, и она работает, если я устанавливаю self.ext_id в contructor (или где-то еще). –

+0

Я не могу воспроизвести проблему, с которой вы сталкиваетесь, когда установка первичного ключа напрямую игнорируется. Какую базу данных вы используете? Однако есть ответ на ваш более широкий вопрос об отключении автоинкремента. – davidism

ответ

23

Набор autoincrement=False для отключения создания последовательности или серийник для первичного ключа.

ext_id = db.Column(db.Integer, primary_key=True, autoincrement=False) 
Смежные вопросы