नीचे एक मॉडल इंस्टेंस में परिवर्तन करने और उन्हें डेटाबेस के लिए प्रतिबद्ध करने का सही तरीका है:
# get an instance of the 'Entry' model
entry = Entry.query.get(1)
# change the attribute of the instance; here the 'name' attribute is changed
entry.name = 'New name'
# now, commit your changes to the database; this will flush all changes
# in the current session to the database
db.session.commit()
नोट: SQLALCHEMY_COMMIT_ON_TEARDOWN
का प्रयोग न करें , क्योंकि इसे हानिकारक माना जाता है और इसे दस्तावेज़ों से भी हटा दिया जाता है। देखें संस्करण 2.0 के लिए चेंजलॉग
।
संपादित करें: यदि आपके पास सामान्य सत्र . के दो ऑब्जेक्ट हैं (sessionmaker()
. का उपयोग करके बनाया गया ) दायरे वाले सत्र . के बजाय , फिर कॉल करने पर db.session.add(entry)
उपरोक्त कोड त्रुटि उत्पन्न करेगा sqlalchemy.exc.InvalidRequestError: Object '' is already attached to session '2' (this is '3')
. sqlalchemy सत्र के बारे में अधिक समझने के लिए, नीचे दिए गए अनुभाग को पढ़ें
स्कोप्ड सत्र बनाम सामान्य सत्र के बीच प्रमुख अंतर
सेशन ऑब्जेक्ट जिसे हमने ज्यादातर sessionmaker()
. से बनाया है कॉल और हमारे डेटाबेस के साथ संवाद करने के लिए उपयोग किया जाने वाला एक सामान्य सत्र . है . अगर आप sessionmaker()
. को कॉल करते हैं दूसरी बार, आपको एक नया सत्र ऑब्जेक्ट मिलेगा जिसके राज्य पिछले सत्र से स्वतंत्र हैं। उदाहरण के लिए, मान लें कि हमारे पास दो सत्र ऑब्जेक्ट निम्न तरीके से निर्मित हैं:
from sqlalchemy import Column, String, Integer, ForeignKey
from sqlalchemy.ext.declarative import declarative_base
Base = declarative_base()
class User(Base):
__tablename__ = 'user'
id = Column(Integer, primary_key=True)
name = Column(String)
from sqlalchemy import create_engine
engine = create_engine('sqlite:///')
from sqlalchemy.orm import sessionmaker
session = sessionmaker()
session.configure(bind=engine)
Base.metadata.create_all(engine)
# Construct the first session object
s1 = session()
# Construct the second session object
s2 = session()
फिर, हम दोनों s1
. में एक ही User ऑब्जेक्ट को जोड़ने में सक्षम नहीं होंगे और s2
एक ही समय में। दूसरे शब्दों में, किसी ऑब्जेक्ट को केवल एक अद्वितीय सत्र ऑब्जेक्ट में संलग्न किया जा सकता है।
>>> jessica = User(name='Jessica')
>>> s1.add(jessica)
>>> s2.add(jessica)
Traceback (most recent call last):
......
sqlalchemy.exc.InvalidRequestError: Object '' is already attached to session '2' (this is '3')
यदि सत्र ऑब्जेक्ट scoped_session
. से पुनर्प्राप्त किए जाते हैं ऑब्जेक्ट, हालांकि, हमारे पास scoped_session
. के बाद से ऐसी कोई समस्या नहीं है ऑब्जेक्ट उसी सत्र ऑब्जेक्ट के लिए एक रजिस्ट्री रखता है।
>>> session_factory = sessionmaker(bind=engine)
>>> session = scoped_session(session_factory)
>>> s1 = session()
>>> s2 = session()
>>> jessica = User(name='Jessica')
>>> s1.add(jessica)
>>> s2.add(jessica)
>>> s1 is s2
True
>>> s1.commit()
>>> s2.query(User).filter(User.name == 'Jessica').one()
ध्यान दें किs1
और s2
एक ही सत्र ऑब्जेक्ट हैं क्योंकि वे दोनों एक scoped_session
. से पुनर्प्राप्त किए गए हैं ऑब्जेक्ट जो समान सत्र ऑब्जेक्ट का संदर्भ रखता है।
टिप्स
इसलिए, एक से अधिक सामान्य सत्र बनाने से बचने का प्रयास करें वस्तु। सत्र का एक ऑब्जेक्ट बनाएं और मॉडल घोषित करने से लेकर क्वेरी करने तक हर जगह इसका इस्तेमाल करें।