2010-12-31 12 views
6

¡Hola! acaba de comenzar a trabajar con los pilones en conjunción con SQLAlchemy, y mi modelo se ve algo como esto:Pilones, campos SQlite y autoincrementing

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 

Para evitar sqlite reutilización de identificadores que podrían haber sido eliminados, quiero añadir AutoIncrement a la columna "ID". Revisé la documentación de sqlalchemy y vi que se puede emitir sqlite_autoincrement. Se puede encontrar un ejemplo donde se proporciona este atributo here.

sqlite_autoincrement parece haber sido emitido al crear la tabla en sí, y me preguntaba cómo se puede proporcionar cuando se utiliza un estilo declarativo del modelo como el mío.

Respuesta

17

intentar incluir un atributo __table_args__ con los argumentos que pasaría a Table constructores en el estilo tradicional definición (no declarativo) de datos, por ejemplo:

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

Si tiene que incluir varios argumentos, utilice este formulario en su lugar (dict tiene que ser la última):

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

Desde la sección Table configuration de la documentación declarativa SQLAlchemy:

Los argumentos de tabla que no sean el nombre, los metadatos y los argumentos mapeados Column se especifican utilizando el atributo de clase __table_args__. Este atributo tiene en cuenta tanto los argumentos posicionales como los de palabra clave que normalmente se envían al constructor Table.