2012-05-08 18 views
19

El argumento autoincrement en SQLAlchemy parece ser única y TrueFalse, pero quiero establecer el valor predefinido aid = 1001, a través de la autoincrement aid = 1002 cuando la próxima inserción se realiza.Configuración SQLAlchemy AutoIncrement valor inicial

En de SQL, se puede cambiar como:

ALTER TABLE article AUTO_INCREMENT = 1001; 

estoy usando MySQL y he tratado siguiente, aunque no funciona:

from sqlalchemy.ext.declarative import declarative_base 
Base = declarative_base() 
class Article(Base): 
    __tablename__ = 'article' 
    aid = Column(INTEGER(unsigned=True, zerofill=True), 
       autoincrement=1001, primary_key=True) 

Entonces, cómo puedo conseguir ¿ese? ¡Gracias por adelantado!

Respuesta

16

Puede lograrlo utilizando DDLEvents. Esto le permitirá ejecutar sentencias SQL adicionales justo después de ejecutar CREATE TABLE. Vea los ejemplos en el enlace, pero estoy adivinando su código será similar a continuación:

from sqlalchemy import event 
from sqlalchemy import DDL 
event.listen(
    Article.__table__, 
    "after_create", 
    DDL("ALTER TABLE %(table)s AUTO_INCREMENT = 1001;") 
) 
+0

¡Funciona! Muchas gracias. – Gorthon

+1

¿Hay alguna forma de excluir que se ejecute según el proveedor de db? El ALTER ... AUTO_INCREMENT funciona bien para MySQL (y para la mayoría de los otros dbs, creo), sin embargo, este SQL aparentemente no es compatible con SQLITE. La solución más cercana que pude encontrar es hacer una inserción/eliminación: http://stackoverflow.com/questions/692856/set-start-value-for-autoincrement-in-sqlite – coderfi

+1

Respondí mi propia pregunta. Hurgando en el código, encontré la solución, que está documentada por: http://docs.sqlalchemy.org/en/rel_0_8/core/ddl.html#sqlalchemy.schema.DDLElement.execute_if Lo anterior podría reescribirse como event.listen ( artículo .__ table__, "after_create", DDL ("ALTER TABLE% (tabla) s AUTO_INCREMENT = 1.001;") execute_if (dialecto = ('PostgreSQL', 'mysql')) .) que me ayuda a resolver el problema de sqlite. – coderfi

14

Según the docs:

autoincrement - Este indicador puede establecerse en False para indicar un entero columna de clave principal que no debe ser considerado como la columna “incremento automático”, que es la clave primaria número entero columna que genera valores implícitamente en INSERT y cuyo valor generalmente se devuelve mediante el atributo DBAPI cursor.lastrowid. Por defecto, es True para satisfacer el caso de uso común de una tabla con una sola columna de clave primaria entera.

Así, autoincrement es solamente una bandera para que SQLAlchemy saber si se trata de la clave principal que desea incrementar.

Lo que intenta hacer es crear una secuencia de autoincrement personalizada .

lo tanto, su ejemplo, yo creo , debe ser algo como:

from sqlalchemy.ext.declarative import declarative_base 
from sqlalchemy.schema import Sequence 

Base = declarative_base() 

class Article(Base): 
    __tablename__ = 'article' 
    aid = Column(INTEGER(unsigned=True, zerofill=True), 
       Sequence('article_aid_seq', start=1001, increment=1), 
       primary_key=True) 

Nota, no sé si está utilizando PostgreSQL o no, por lo que debe tomar nota de la following si usted es:

El objeto Secuencia también implementa una funcionalidad especial para acomodar el tipo de datos SERIAL de Postgresql. El tipo SERIAL en PG genera automáticamente una secuencia que se usa implícitamente durante las inserciones. Esto significa que si un objeto Table define una Secuencia en su columna de clave primaria para que funcione con Oracle y Firebird, la Secuencia interferiría en el camino de la secuencia "implícita" que PG usaría normalmente. Para este caso de uso, agregue el indicador opcional = Verdadero al objeto Secuencia: esto indica que la Secuencia solo debe usarse si la base de datos no ofrece otra opción para generar identificadores de clave primaria.

+0

Estoy usando MySQL. De acuerdo con los documentos: Solo tiene un efecto en las bases de datos que tienen soporte explícito para las secuencias, que actualmente incluye ** Postgresql **, ** Oracle ** y ** Firebird **. Probé tu código, pero todavía no funciona. – Gorthon

+0

Ahhh, mi mal (uso PG cada vez que puedo ver). En ese caso, ¡echaré un vistazo a la respuesta de @van anterior! – Edwardr

+0

Lo siento por mi pobre inglés. (No sé el significado de "mi mal" y "tomar el máximo") De hecho, la respuesta de @van es más reciente que la tuya. ¡Muchas gracias! – Gorthon

1

no pude conseguir las otras respuestas a trabajar usando MySQL y matraz de migrar, así que hice lo siguiente dentro de una archivo de migración

from app import db 
db.engine.execute("ALTER TABLE myDB.myTable AUTO_INCREMENT = 2000;") 

Tenga en cuenta que si ha regenerado sus archivos de migración esto se sobrescribirá.

Cuestiones relacionadas