2011-07-14 15 views

उत्तर

109

है के नाम स्तंभ में परिवर्तन करने tutorial shown in the Flask-SQLAlchemy documentation का उपयोग कर एक वस्तु पुनः प्राप्त करना चाहते हैं। एक बार जब आपके पास वह इकाई हो जिसे आप बदलना चाहते हैं, तो इकाई को स्वयं बदलें। फिर, db.session.commit()

उदाहरण के लिए:

admin = User.query.filter_by(username='admin').first() 
admin.email = '[email protected]' 
db.session.commit() 

user = User.query.get(5) 
user.name = 'New Name' 
db.session.commit() 

कुप्पी के SQLAlchemy SQLAlchemy पर आधारित है, इसलिए के रूप में अच्छी SQLAlchemy Docs की जाँच कर लें।

+1

धन्यवाद मार्क। एक और बात मैंने इसे इस 'db.add (उपयोगकर्ता)' के रूप में देखा है, फिर 'dv.session.commit()'। दोनों काम क्यों करते हैं?और क्या अंतर है? – pocorschi

+8

इसे स्क्लेक्लेमी में क्षणिक, अलग, और संलग्न वस्तुओं के बीच अंतर के साथ करना है (देखें http://www.sqlalchemy.org/docs/orm/session.html#what-does-the- सत्र-do)। इसके अलावा, कुछ और जानकारी के लिए मेलिंग सूची (http://groups.google.com/group/sqlalchemy/browse_thread/thread/e38e2aba57aeed92?pli=1) पर माइकल बेयर की टिप्पणी पढ़ें। –

+1

यदि आप अभी भी वहां पढ़ने के बाद मतभेदों पर उलझन में हैं, तो एक और सवाल पूछने पर विचार करें। माइकल की टिप्पणी के लिंक के लिए –

50

SQLAlchemy में BaseQuery ऑब्जेक्ट पर update विधि है, जिसे filter_by द्वारा वापस किया गया है।

admin = User.query.filter_by(username='admin').update(dict(email='[email protected]'))) 
db.session.commit() 

इकाई बदलने पर update उपयोग करने का लाभ आता है जब वहाँ कई वस्तुओं अद्यतन किया जाना है।

आप सभी admin रों को add_user अनुमति देने के लिए चाहते हैं,

rows_changed = User.query.filter_by(role='admin').update(dict(permission='add_user')) 
db.session.commit() 

सूचना है कि filter_by लेता कीवर्ड तर्क (केवल एक = उपयोग) के रूप में filter जो एक अभिव्यक्ति लेता है करने का विरोध किया।

13

यदि आप मॉडल की एक मसालेदार विशेषता को संशोधित करते हैं तो यह काम नहीं करता है। मसालेदार गुण आदेश अपडेट को गति प्रदान करने में प्रतिस्थापित किया जाना चाहिए:

from flask import Flask 
from flask.ext.sqlalchemy import SQLAlchemy 
from pprint import pprint 

app = Flask(__name__) 
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqllite:////tmp/users.db' 
db = SQLAlchemy(app) 


class User(db.Model): 
    id = db.Column(db.Integer, primary_key=True) 
    name = db.Column(db.String(80), unique=True) 
    data = db.Column(db.PickleType()) 

    def __init__(self, name, data): 
     self.name = name 
     self.data = data 

    def __repr__(self): 
     return '<User %r>' % self.username 

db.create_all() 

# Create a user. 
bob = User('Bob', {}) 
db.session.add(bob) 
db.session.commit() 

# Retrieve the row by its name. 
bob = User.query.filter_by(name='Bob').first() 
pprint(bob.data) # {} 

# Modifying data is ignored. 
bob.data['foo'] = 123 
db.session.commit() 
bob = User.query.filter_by(name='Bob').first() 
pprint(bob.data) # {} 

# Replacing data is respected. 
bob.data = {'bar': 321} 
db.session.commit() 
bob = User.query.filter_by(name='Bob').first() 
pprint(bob.data) # {'bar': 321} 

# Modifying data is ignored. 
bob.data['moo'] = 789 
db.session.commit() 
bob = User.query.filter_by(name='Bob').first() 
pprint(bob.data) # {'bar': 321} 
+1

ऐसे मामलों में सबसे अच्छा तरीका क्या है? – kampta

+0

आपको 'डेटा' कॉपी करना होगा और इसे फिर से सौंपना होगा। – sas

3

बस मान निर्दिष्ट और करने से उन सब को डेटा प्रकार लेकिन JSON और मसालेदार विशेषताओं के लिए काम करेंगे। चूंकि मसालेदार प्रकार ऊपर वर्णित है, इसलिए मैं JSON को अपडेट करने के लिए थोड़ा अलग लेकिन आसान तरीका नोट कर दूंगा।

class User(db.Model): 
    id = db.Column(db.Integer, primary_key=True) 
    name = db.Column(db.String(80), unique=True) 
    data = db.Column(db.JSON) 

def __init__(self, name, data): 
    self.name = name 
    self.data = data 

मान लें कि मॉडल ऊपर जैसा है।

user = User("Jon Dove", {"country":"Sri Lanka"}) 
db.session.add(user) 
db.session.flush() 
db.session.commit() 

इस डेटा के साथ MySQL डेटाबेस में उपयोगकर्ता जोड़ देगा { "देश": "श्रीलंका"}

को संशोधित डेटा नजरअंदाज कर दिया जाएगा। मेरा कोड जो काम नहीं करता है, निम्नानुसार है।

user = User.query().filter(User.name=='Jon Dove') 
data = user.data 
data["province"] = "south" 
user.data = data 
db.session.merge(user) 
db.session.flush() 
db.session.commit() 
इसके बजाय एक नया dict (एक नया वेरिएबल के लिए यह रूप में ऊपर बताए नहीं) है, जो काम किया जाना चाहिए था मुझे लगता है कि ऐसा करने के लिए एक आसान तरीका पाया करने के लिए JSON को कॉपी करने की दर्दनाक काम के माध्यम से जाने की

। जेएसओएन बदल गए सिस्टम को ध्वजांकित करने का एक तरीका है।

कार्य कोड निम्नलिखित है।

from sqlalchemy.orm.attributes import flag_modified 
user = User.query().filter(User.name=='Jon Dove') 
data = user.data 
data["province"] = "south" 
user.data = data 
flag_modified(user, "data") 
db.session.merge(user) 
db.session.flush() 
db.session.commit() 

यह एक आकर्षण की तरह काम करता था। इस विधि के साथ प्रस्तावित एक और तरीका है here आशा है कि मैंने किसी की मदद की है।

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