2014-12-16 10 views
13

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

+0

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). –

+0

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

Odpowiedz

23

Zestaw autoincrement=False wyłączyć tworzenie sekwencji lub seryjny klucza podstawowego.

ext_id = db.Column(db.Integer, primary_key=True, autoincrement=False) 
Powiązane problemy