2012-03-26 7 views
5

मैं एक SQLAlchemy तालिका घोषणात्मक विधि का उपयोग कर बनाई वर्ग है:सत्र में स्वचालित रूप से एक SQLAlchemy ऑब्जेक्ट को कैसे जोड़ें?

mysqlengine = create_engine(dsn) 
session = scoped_session(sessionmaker(bind=mysqlengine)) 
Base = declarative_base() 
Base.metadata.bind = mysqlengine 

class MyTable(Base): 
    __table_args__ = {'autoload' : True} 

अब, जब कोड के भीतर इस तालिका का उपयोग कर रहा session.add प्रत्येक जोड़ने के लिए विधि का उपयोग करने की जरूरत नहीं चाहते हैं तो बजाय सक्रिय सत्र के लिए नया रिकार्ड:

row = MyTable(1, 2, 3) 
session.add(row) 
session.commit() 

मैं करना चाहते हैं:

row = MyTable(1, 2, 3) 
session.commit() 

अब, मैं पहले से ही इस सवाल का पता: Possible to add an object to SQLAlchemy session without explicit session.add()?

और, मुझे पता है आप निम्न कार्य करके इस व्यवहार के लिए मजबूर कर सकते हैं:

class MyTable(Base): 
    def __init__(self, *args, **kw): 
    super(MyTable, self).__init__(*args, **kw) 
    session.add(self) 

हालांकि, मैं के साथ 30 टेबल युक्त मेरी कोड ब्लोट नहीं करना चाहते यह विधि। मुझे यह भी पता है कि एलिक्सीर (http://elixir.ematia.de/trac/wiki) ऐसा करता है इसलिए कुछ अर्थों में यह संभव होना चाहिए।

उत्तर

15

सुपर सरल। एक घटना का उपयोग करें:

from sqlalchemy import event, Integer, Column, String 
from sqlalchemy.orm import scoped_session, sessionmaker, mapper 
from sqlalchemy.ext.declarative import declarative_base 

Session = scoped_session(sessionmaker()) 

@event.listens_for(mapper, 'init') 
def auto_add(target, args, kwargs): 
    Session.add(target) 

Base = declarative_base() 

class A(Base): 
    __tablename__ = "a" 

    id = Column(Integer, primary_key=True) 
    data = Column(String) 

a1 = A(data="foo") 
assert a1 in Session() 
+1

बस ध्यान रखें कि आप SQLAlchemy सत्यापन या पूर्व फ्लश घटनाओं उपयोग कर रहे हैं, आप भी सत्र से एक वस्तु है कि सत्यापन में विफल हो मिटाना भी प्राप्त है। इस समाधान का उपयोग करते समय मुझे बस थोड़ा सा मिला। –

संबंधित मुद्दे