2010-12-31 5 views
6

Hey! begannen einfach mit Pylonen in Verbindung mit SQLAlchemy zu arbeiten, und mein Modell sieht ungefähr so ​​aus:Pylone, SQlite und autoinkrementierende Felder

from sqlalchemy import Column 
from sqlalchemy.types import Integer, String 

from helloworld.model.meta import Base 

class Person(Base): 
    __tablename__ = "person" 

    id = Column(Integer, primary_key=True) 
    name = Column(String(100)) 
    email = Column(String(100)) 

    def __init__(self, name='', email=''): 
     self.name = name 
     self.email = email 

    def __repr__(self): 
     return "<Person('%s')" % self.name 

SQLite Wiederverwendung von IDs zu vermeiden, das gelöscht worden sein könnte, ich AUTOINCREMENT die Spalte „id“ hinzufügen möge. Ich habe die Dokumentation für sqlalchemy durchgesehen und gesehen, dass sqlite_autoincrement ausgegeben werden kann. Ein Beispiel für dieses Attribut ist here.

sqlite_autoincrement scheint jedoch beim Erstellen der Tabelle selbst ausgegeben zu werden, und ich frage mich nur, wie es geliefert werden kann, wenn ein deklarativer Stil des Modells wie meins verwendet wird.

Antwort

17

Versuchen mit einem __table_args__ Attribut mit den Argumenten Sie Table Konstrukteuren in der traditionellen (nicht-deklarativen) Datendefinition Stil, zum Beispiel passieren würde:

class Person(Base): 
    __tablename__ = "person" 
    __table_args__ = {'sqlite_autoincrement': True} 

Wenn Sie auf mehrere Argumente enthalten, verwenden Sie dieses Formular statt (dict hat sein letztes):

__table_args__ = (
    Unique('foo'), 
    # ... 
    {'sqlite_autoincrement': True} 
) 

Vom Table configuration Abschnitt der deklarativen SQLAlchemy Dokumentation:

Andere Tabellenargumente als Name, Metadaten und zugeordnete Column Argumente werden mit dem Klassenattribut __table_args__ angegeben. Dieses Attribut berücksichtigt sowohl Positions- als auch Schlüsselwortargumente, die normalerweise an den Table-Konstruktor gesendet werden.