मैं पंक्ति की जानकारी कैसे अपडेट कर सकता हूं?फ्लास्क-एसक्यूएलकेमी एक पंक्ति की जानकारी अपडेट करें
उदाहरण के लिए मैं पंक्ति आईडी 5.
मैं पंक्ति की जानकारी कैसे अपडेट कर सकता हूं?फ्लास्क-एसक्यूएलकेमी एक पंक्ति की जानकारी अपडेट करें
उदाहरण के लिए मैं पंक्ति आईडी 5.
है के नाम स्तंभ में परिवर्तन करने 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 की जाँच कर लें।
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
जो एक अभिव्यक्ति लेता है करने का विरोध किया।
यदि आप मॉडल की एक मसालेदार विशेषता को संशोधित करते हैं तो यह काम नहीं करता है। मसालेदार गुण आदेश अपडेट को गति प्रदान करने में प्रतिस्थापित किया जाना चाहिए:
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}
बस मान निर्दिष्ट और करने से उन सब को डेटा प्रकार लेकिन 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 आशा है कि मैंने किसी की मदद की है।
धन्यवाद मार्क। एक और बात मैंने इसे इस 'db.add (उपयोगकर्ता)' के रूप में देखा है, फिर 'dv.session.commit()'। दोनों काम क्यों करते हैं?और क्या अंतर है? – pocorschi
इसे स्क्लेक्लेमी में क्षणिक, अलग, और संलग्न वस्तुओं के बीच अंतर के साथ करना है (देखें http://www.sqlalchemy.org/docs/orm/session.html#what-does-the- सत्र-do)। इसके अलावा, कुछ और जानकारी के लिए मेलिंग सूची (http://groups.google.com/group/sqlalchemy/browse_thread/thread/e38e2aba57aeed92?pli=1) पर माइकल बेयर की टिप्पणी पढ़ें। –
यदि आप अभी भी वहां पढ़ने के बाद मतभेदों पर उलझन में हैं, तो एक और सवाल पूछने पर विचार करें। माइकल की टिप्पणी के लिंक के लिए –