2009-03-06 6 views
34

Wenn ich eine Tabelle mit einem automatisch inkrementierenden Primärschlüssel erstellt habe, gibt es eine Möglichkeit, zu erhalten, was der Primärschlüssel sein würde (also etwas wie den Primärschlüssel reservieren) eigentlich begehen?SQLAlchemy Primärschlüssel mit automatischem Inkrementieren vor dem Commit erhalten

Ich möchte zwei Operationen innerhalb einer Transaktion platzieren, aber eine der Operationen hängt davon ab, welcher Primärschlüssel in der vorherigen Operation zugewiesen wurde.

Antwort

0

Sie können mehrere Transaktionen verwenden und sie im Rahmen verwalten.

72

Sie müssen nicht commit, Sie müssen nur flush. Hier ist ein Beispielcode. Nach dem Aufruf an flush können Sie auf den zugewiesenen Primärschlüssel zugreifen. Beachten Sie, dass dies mit SA 0.4.8 ist.

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 ein herzhaftes +1 für ein gutes Codebeispiel! –

+0

Aus Neugier, ist das derzeit noch so chaotisch in modernen SQLAlchemy, v0.8.0? Oder gibt es leichtere Wege? – Mittenchops

+0

Der Link zu ** Flush ** ist in der Antwort gebrochen. Flushing ist [hier] beschrieben (http://docs.sqlalchemy.org/en/rel_0_9/orm/session.html?highlight=session.add#flushing) –