Я пытаюсь создать таблицу с компоновкой примерно так: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
Как выглядит ваш виджет .__ init__? Я думаю, что я использую функцию, которая вам нужна именно так, как вы, кажется, используете ее, и она работает, если я устанавливаю self.ext_id в contructor (или где-то еще). –
Я не могу воспроизвести проблему, с которой вы сталкиваетесь, когда установка первичного ключа напрямую игнорируется. Какую базу данных вы используете? Однако есть ответ на ваш более широкий вопрос об отключении автоинкремента. – davidism