2009-03-06 45 views
34

Khi tôi đã tạo một bảng có khóa chính tăng tự động, có cách nào để lấy khóa chính sẽ là gì (tức là, thực hiện điều gì đó như đặt khóa chính) mà không thực sự cam kết?SQLAlchemy Lấy khóa chính với Autoincrement trước khi Commit

Tôi muốn đặt hai hoạt động bên trong một giao dịch tuy nhiên một trong các thao tác sẽ phụ thuộc vào khóa chính nào được gán trong thao tác trước đó.

Trả lời

0

Bạn có thể sử dụng nhiều giao dịch và quản lý nó trong phạm vi.

72

Bạn không cần phải commit, bạn chỉ cần flush. Đây là một số mã mẫu. Sau cuộc gọi đến flush bạn có thể truy cập khóa chính đã được chỉ định. Lưu ý điều này là với 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

Thật thú vị +1 cho một ví dụ về mã tốt! –

+0

Trong sự tò mò, điều này hiện vẫn còn lộn xộn trong SQLAlchemy hiện đại, v0.8.0? Hoặc có cách nào dễ hơn không? – Mittenchops

+0

Liên kết đến ** flush ** bị hỏng trong câu trả lời. Flushing được mô tả [ở đây] (http://docs.sqlalchemy.org/en/rel_0_9/orm/session.html?highlight=session.add#flushing) –

Các vấn đề liên quan