উত্তর:
ফ্লাস্ক-এসকিউএএলএলএকচেমি ডকুমেন্টেশনে প্রদর্শিত টিউটোরিয়ালটি ব্যবহার করে কোনও বস্তু পুনরুদ্ধার করুন । আপনি যে সত্তাটি পরিবর্তন করতে চান তা একবার হয়ে গেলে, সত্তাটি নিজেই পরিবর্তন করুন। তারপরে db.session.commit()
,।
উদাহরণ স্বরূপ:
admin = User.query.filter_by(username='admin').first()
admin.email = 'my_new_email@example.com'
db.session.commit()
user = User.query.get(5)
user.name = 'New Name'
db.session.commit()
বোতল-SQLAlchemy SQLAlchemy উপর ভিত্তি করে তৈরি, তাই খুঁজে বার করো নিশ্চিত করা SQLAlchemy ডক্স পাশাপাশি।
uesd_at = db.Column(db.DateTime)
আমি সবেমাত্র চালাচ্ছি obj.used_at = datetime.datetime.now()
db.session.commit()
তবে ক্ষেত্রের কাছে মান সেট করা নেই।
update
এসকিউএএলএলচেমিতে বেসকোয়ারী অবজেক্টে একটি পদ্ধতি রয়েছে, যা দ্বারা ফিরে আসে filter_by
।
admin = User.query.filter_by(username='admin').update(dict(email='my_new_email@example.com')))
db.session.commit()
update
সত্তা পরিবর্তন করার পরে ও ব্যবহার করার সুবিধাটি আসে যখন অনেকগুলি অবজেক্ট আপডেট করা থাকে।
আপনি যদি add_user
সমস্ত এসকে অনুমতি দিতে চান admin
,
rows_changed = User.query.filter_by(role='admin').update(dict(permission='add_user'))
db.session.commit()
লক্ষ্য করুন যে filter_by
কীওয়ার্ড আর্গুমেন্ট নেয় (কেবলমাত্র একটি ব্যবহার করুন =
) তার বিপরীতে filter
যা একটি অভিব্যক্তি নেয়।
admin
ফলাফলটির নামকরণ করা হয়েছে , যা বিভ্রান্তিকর হতে পারে কারণ ফলাফলটি আপডেট করা সারিগুলির সংখ্যা হবে। তাই না?
User
ক্যোয়ারী দ্বারা প্রভাবিত আইটেমগুলি পেতে পারি, প্রভাবিত ব্যবহারকারীর সংখ্যা নয়?
আপনি যদি মডেলটির একটি সংযুক্ত বৈশিষ্ট্য পরিবর্তন করেন তবে এটি কাজ করে না। আপডেটগুলি ট্রিগার করতে পিকলেড বৈশিষ্ট্যগুলি প্রতিস্থাপন করা উচিত:
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}
data
এটি অনুলিপি করে পুনরায় নিয়োগ করতে হবে।
user.data = data
কেবলমাত্র মূল্য নির্ধারণ এবং তাদের প্রতিশ্রুতিবদ্ধকরণ সমস্ত ডেটা ধরণের জন্য কাজ করবে তবে জেএসএন এবং পিকলেড বৈশিষ্ট্যগুলি। যেহেতু উপরে আচারযুক্ত ধরণের ব্যাখ্যা করা হয়েছে আমি জেএসএনগুলি আপডেট করার কিছুটা ভিন্ন তবে সহজ উপায়টি নোট করব।
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()
এটি ব্যবহারকারীর সাথে মাইএসকিউএল ডাটাবেসে add "দেশ": "শ্রীলঙ্কা" with যুক্ত করবে
সংশোধনকারী ডেটা উপেক্ষা করা হবে। আমার কোড যা কাজ করে নি তা নিম্নরূপ।
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()
একটি নতুন ডিকটিতে জেএসএএন অনুলিপি করার বেদনাদায়ক কাজটি না করে (উপরের মতো নতুন ভেরিয়েবলের জন্য এটি বরাদ্দ না করা), যা কাজ করা উচিত ছিল আমি এটি করার একটি সহজ উপায় খুঁজে পেয়েছি। 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()
এটা চমত্কার ভাবে কাজ করেছে. এই পদ্ধতির পাশাপাশি এখানে আরও একটি প্রস্তাবিত প্রস্তাব রয়েছে আশা করি আমি কোনও একটিকে সহায়তা করেছি।
db.session.merge(user)
এই কোড যুক্ত করে আমার জন্য কাজ করেছে, এফওয়াইআই।