2009-03-06 18 views
34

Cuando he creado una tabla con una clave principal de incremento automático, ¿hay alguna manera de obtener la clave primaria (es decir, hacer algo así como reservar la clave principal) sin en realidad cometiendo?SQLAlchemy Obtener la clave principal con autoincrement Antes de confirmar

Me gustaría ubicar dos operaciones dentro de una transacción, sin embargo, una de las operaciones dependerá de qué clave primaria se asignó en la operación anterior.

Respuesta

0

Puede usar múltiples transacciones y administrarlas dentro del alcance.

72

No necesita commit, solo necesita flush. Aquí hay un código de muestra. Después de la llamada al flush, puede acceder a la clave principal que se le asignó. Tenga en cuenta que esto es con SA 0.4.8.

from sqlalchemy import * 
from sqlalchemy.databases.mysql import * 
import sqlalchemy.ext.declarative 

Base = sqlalchemy.ext.declarative.declarative_base() 

class User(Base): 
    __tablename__ = 'user' 
    user_id = Column('user_id', Integer, primary_key=True) 
    name = Column('name', String) 

if __name__ == '__main__': 
    import unittest 
    from sqlalchemy.orm import * 
    import datetime 

    class Blah(unittest.TestCase): 
     def setUp(self): 
      self.engine = create_engine('sqlite:///:memory:', echo=True) 
      self.sessionmaker = scoped_session(sessionmaker(bind=self.engine)) 
      Base.metadata.bind = self.engine 
      Base.metadata.create_all() 
      self.now = datetime.datetime.now() 

     def test_pkid(self): 
      user = User(name="Joe") 
      session = self.sessionmaker() 
      session.save(user) 
      session.flush() 
      print 'user_id', user.user_id 
      session.commit() 
      session.close() 

    unittest.main() 
+5

Wow a hearty +1 para un buen ejemplo de código! –

+0

Por curiosidad, ¿sigue siendo actualmente tan desordenado en SQLAlchemy moderno, v0.8.0? ¿O hay formas más sencillas? – Mittenchops

+0

El enlace a ** flush ** está roto en la respuesta. Flushing se describe [aquí] (http://docs.sqlalchemy.org/en/rel_0_9/orm/session.html?highlight=session.add#flushing) –

Cuestiones relacionadas