2009-03-06 10 views
34

से पहले ऑटोइनक्रिकमेंट के साथ प्राथमिक कुंजी प्राप्त करें जब मैंने ऑटो-इंक्रिमेंटिंग प्राथमिक कुंजी के साथ एक टेबल बनाई है, तो प्राथमिक कुंजी क्या होगी (यानी, प्राथमिक कुंजी आरक्षित जैसी कुछ करें) प्राप्त करने का कोई तरीका है वास्तव में काम कर रहे हैं?SQLAlchemy Commit

मैं एक लेनदेन के अंदर दो संचालन करना चाहता हूं हालांकि संचालन में से एक इस बात पर निर्भर करेगा कि पिछले ऑपरेशन में प्राथमिक कुंजी को क्या आवंटित किया गया था।

उत्तर

0

आप कई लेनदेन का उपयोग कर सकते हैं और इसे दायरे में प्रबंधित कर सकते हैं।

72

आपको commit की आवश्यकता नहीं है, आपको बस flush की आवश्यकता है। यहां कुछ नमूना कोड है। flush पर कॉल करने के बाद आप असाइन की गई प्राथमिक कुंजी तक पहुंच सकते हैं। नोट यह एसए 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

वाह एक अच्छा कोड उदाहरण के लिए एक हार्दिक +1 वाह! –

+0

जिज्ञासा से बाहर, क्या यह अभी भी आधुनिक स्क्लेक्लेमी, v0.8.0 में गन्दा है? या क्या आसान तरीके हैं? – Mittenchops

+0

** फ्लश ** का लिंक उत्तर में टूटा हुआ है। फ्लशिंग का वर्णन किया गया है [यहां] (http://docs.sqlalchemy.org/en/rel_0_9/orm/session.html?highlight=session.add#flushing) –