Próbuję ustalić stolik z układem w przybliżeniu tak:sqlalchemy klucz podstawowy bez automatycznego przyrostu
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...
Wszystkie wartości pól są dostarczane za pośrednictwem systemu zewnętrznego, a nowe widgety są odkryte i trochę wartości pominiętych cech mogą się zmieniać z czasem (bardzo stopniowo), ale ext_id i w_code są gwarantowane jako unikalne. Biorąc pod uwagę naturę wartości dla ext_id, zachowuje się idealnie jako klucz podstawowy.
Jednak po utworzeniu nowego rekordu, określając wartość ext_id, wartość nie jest używana w pamięci. Zamiast tego wartości w ext_id są zgodne z zachowaniem auto-inkrementacji.
>>> # from a clean database
>>> skill = Widget(ext_id=7723, w_code=u'IGF35ac9')
>>> session.add(skill)
>>> session.commit()
>>> Skill.query.first().ext_id
1
>>>
Jak mogę określić, do sqlalchemy że pole ext_id powinny być wykorzystywane jako pola klucza podstawowego bez automatycznego przyrostu?
Uwaga: Mogę dodać dodatkową syntetyczną kolumnę identyfikatora jako klucz podstawowy i ustawić ext_id jako unikalną kolumnę, ale to zarówno komplikuje mój kod, jak i dodaje (minimalne) dodatkowe nadwyżki do bazy danych i wszystkich operacji we/wy do to. Mam nadzieję, że tego uniknę.
Problem pochodzi z większego projektu, ale udało mi się utworzyć mniejszą repro.
Testowanie z SQLite
Jak wygląda Twój widżet .__ init__? Myślę, że używam tej funkcji dokładnie w taki sposób, w jaki wydaje się, że ją używasz i działa, pod warunkiem, że ustawię self.ext_id w contructor (lub gdzieś indziej). –
Nie mogę odtworzyć problemu, w którym ustawienie bezpośredniego klucza podstawowego jest ignorowane. Jakiej bazy danych używasz? Istnieje jednak odpowiedź na szersze pytanie dotyczące wyłączania automatycznego zwiększania wartości. – davidism