2009-03-06 15 views
34

Quando ho creato una tabella con una chiave primaria a incremento automatico, c'è un modo per ottenere ciò che sarebbe la chiave primaria (ovvero, fare qualcosa come prenotare la chiave primaria) senza effettivamente commettendo?SQLAlchemy Ottieni chiave primaria con incremento automatico prima dell'impegno

Vorrei inserire due operazioni all'interno di una transazione, tuttavia una delle operazioni dipenderà da quale chiave primaria è stata assegnata nell'operazione precedente.

risposta

0

È possibile utilizzare più transazioni e gestirlo nell'ambito.

72

Non è necessario commit, è sufficiente effettuare il flush. Ecco alcuni esempi di codice. Dopo la chiamata a flush è possibile accedere alla chiave primaria che è stata assegnata. Nota questo è 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 un abbondante +1 per un buon esempio di codice! –

+0

Per curiosità, questo è attualmente ancora così complicato nella moderna SQLAlchemy, v0.8.0? O ci sono modi più semplici? – Mittenchops

+0

Il collegamento a ** svuota ** è rotto nella risposta. Flushing è descritto [qui] (http://docs.sqlalchemy.org/en/rel_0_9/orm/session.html?highlight=session.add#flushing) –

Problemi correlati