2010-04-13 12 views
36

मैं एक स्क्लेक्लेमी नोब हूं।SQLAlchemy: घोषणात्मक के साथ अद्यतन के लिए एक बेहतर तरीका है?

class User(Base): 
    __tablename__ = 'user' 
    id = Column(u'id', Integer(), primary_key=True) 
    name = Column(u'name', String(50)) 

जब मैं सत्र में लोड वस्तु के बिना उपयोगकर्ता की आईडी पता है, मैं इस तरह इस तरह के उपयोगकर्ता अद्यतन:

ex = update(User.__table__).where(User.id==123).values(name=u"Bob Marley") 
Session.execute(ex) 

मैं का उपयोग कर नापसंद

मान लीजिए कि मैं कथात्मक मोड में एक उपयोगकर्ता तालिका करते हैं User.__table__, क्या मुझे इसके साथ चिंता करना बंद कर देना चाहिए?

क्या ऐसा करने का कोई बेहतर तरीका है?

धन्यवाद!

+1

अद्यतन http://docs.sqlalchemy.org/en/rel_1_0/core/dml.html#sqlalchemy.sql.expression.update –

उत्तर

55

ओआरएम स्तर पर कुछ अद्यतन क्षमता भी है। यह अभी तक किसी भी मुश्किल मामलों को संभाल नहीं करता है लेकिन एकल पंक्ति अद्यतन (या थोक अद्यतन) के मामूली मामले के लिए यह ठीक काम करता है। यह किसी भी पहले से लोड वस्तुओं पर भी चला जाता है और उन पर भी अद्यतन लागू होता है। आप इसे इस तरह का उपयोग कर सकते हैं:

session.query(User).filter_by(id=123).update({"name": u"Bob Marley"}) 
+2

यह ध्यान में नहीं आता है कि उपयोगकर्ता कॉलम के लिए चर नाम निर्दिष्ट करता है - अगर नाम उपयोगकर्ता_नाम = कॉलम ("नाम", स्ट्रिंग (50) घोषित किया गया था), यह विफल होगा बी/सी कॉलम के वास्तविक नाम की आवश्यकता है। क्या कोई यह समझा सकता है कि यह क्यों है? – Kira

+1

या तो '.get (123) 'या' .filter_by (id == 123) 'नहीं होना चाहिए? – Brendan

+3

@ ब्रेंडन 'फ़िल्टर' और 'filter_by' विभिन्न विधियां हैं। पूर्व अभिव्यक्ति को तर्क के रूप में लेता है जबकि उत्तरार्द्ध कीवर्ड तर्क लेता है। –

15

आप मॉडल/इकाई/ऑब्जेक्ट स्तर पर नहीं, खंड स्तर पर काम कर रहे हैं। क्लॉज स्तर मैप किए गए ऑब्जेक्ट्स से कम है। और हां, एक शब्द को दूसरों में बदलने के लिए कुछ किया जाना है।

तुम भी वस्तु स्तर पर रह सकता है और कार्य करें:

session = Session() 
u = session.query(User).get(123) 
u.name = u"Bob Marley" 
session.commit() 

लेकिन यह काफी धीमी है, क्योंकि यह मैप किया वस्तु निर्माण की ओर जाता है किया जाएगा। और मुझे यकीन नहीं है कि यह अधिक पठनीय है।

उदाहरण के लिए मैंने सबसे प्राकृतिक और "सही" समाधान देखा है। मैं __table__ जादू के बारे में चिंता नहीं करता।

2

इसी कार्यक्षमता टेबल वस्तु पर update() विधि के माध्यम से उपलब्ध है।

class User(Base): 
    __tablename__ = 'user' 
    id = Column('id', Integer(), primary_key=True) 
    name = Column('name', String(50)) 

stmt = User.__table__.update().where(User.id==5).values(name='user #5') 

User.__table__ उपयोग करने के लिए कैसे SQLAlchemy में अपनी किया जाता है।

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