ফ্লাস্ক-এসকিউএলএলকেমি একটি সারির তথ্য আপডেট করে


121

আমি কীভাবে একটি সারির তথ্য আপডেট করতে পারি?

উদাহরণস্বরূপ আমি আইডি 5 থাকা সারির নাম কলামটি পরিবর্তন করতে চাই।

উত্তর:


205

ফ্লাস্ক-এসকিউএএলএলএকচেমি ডকুমেন্টেশনে প্রদর্শিত টিউটোরিয়ালটি ব্যবহার করে কোনও বস্তু পুনরুদ্ধার করুন । আপনি যে সত্তাটি পরিবর্তন করতে চান তা একবার হয়ে গেলে, সত্তাটি নিজেই পরিবর্তন করুন। তারপরে 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 ডক্স পাশাপাশি।


2
ধন্যবাদ মার্ক। অন্য একটি জিনিস। আমি এটি 'db.add (ব্যবহারকারী)' এর পরে 'dv.session.commit ()' এর মতো করে দেখেছি। দুজনেই কেন কাজ করে? এবং পার্থক্য কি?
পকরস্কি

11
এটি এসকিউএএলএলচেমির ক্ষণস্থায়ী, বিচ্ছিন্ন এবং সংযুক্ত বস্তুর মধ্যে পার্থক্যগুলির সাথে সম্পর্কযুক্ত (দেখুন sqlalchemy.org/docs/orm/session.html#hat-does-the-session-do )। এছাড়াও, আরও কিছু তথ্যের জন্য মেলিং তালিকায় (গ্রুপ. google.com/group/sqlalchemy/browse_thread/thread/… ) মাইকেল বায়ারের মন্তব্য পড়ুন ।
মার্ক হিলড্রেথ

1
সেখানে পড়ার পরেও যদি আপনি এই তফাতগুলিতে বিভ্রান্ত হন তবে অন্য একটি প্রশ্ন জিজ্ঞাসা করুন।
মার্ক হিলড্রেথ

যদি কলামের তথ্য প্রকারের জাসন হয় তবে নীচের পদ্ধতিটি ব্যবহার করুন। bashelton.com/2014/03/…
আরম

@ মার্কহিলড্রেথ আমি ক্ষেত্রটিতে ডেটটাইম মান আপডেট করতে পারিনি, আমার কী করা উচিত? কলামটি uesd_at = db.Column(db.DateTime)আমি সবেমাত্র চালাচ্ছি obj.used_at = datetime.datetime.now() db.session.commit()তবে ক্ষেত্রের কাছে মান সেট করা নেই।
রুকিথ

96

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যা একটি অভিব্যক্তি নেয়।


1
প্রথম ক্যোয়ারিতে, adminফলাফলটির নামকরণ করা হয়েছে , যা বিভ্রান্তিকর হতে পারে কারণ ফলাফলটি আপডেট করা সারিগুলির সংখ্যা হবে। তাই না?
বিকাশ প্রসাদ

এবং এমন কোনও উপায় আছে, যেখানে আমি Userক্যোয়ারী দ্বারা প্রভাবিত আইটেমগুলি পেতে পারি, প্রভাবিত ব্যবহারকারীর সংখ্যা নয়?
বিকাশ প্রসাদ

সারিগুলির সংখ্যার মিল
বিকাশ প্রসাদ

18

আপনি যদি মডেলটির একটি সংযুক্ত বৈশিষ্ট্য পরিবর্তন করেন তবে এটি কাজ করে না। আপডেটগুলি ট্রিগার করতে পিকলেড বৈশিষ্ট্যগুলি প্রতিস্থাপন করা উচিত:

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
এই ক্ষেত্রে সেরা পদ্ধতির কী?
কাম্পাতা

আপনাকে dataএটি অনুলিপি করে পুনরায় নিয়োগ করতে হবে।
sas

@ সাস মানে কি?
মোট জার্ট

আপডেট প্রক্রিয়াটি ট্রিগার করতে আপনাকে ডেটা সম্পত্তি অনুলিপি করতে এবং নিয়োগ করতে হবে। : নীচের উত্তর কটাক্ষপাত আছেuser.data = data
SAS

9

কেবলমাত্র মূল্য নির্ধারণ এবং তাদের প্রতিশ্রুতিবদ্ধকরণ সমস্ত ডেটা ধরণের জন্য কাজ করবে তবে জেএসএন এবং পিকলেড বৈশিষ্ট্যগুলি। যেহেতু উপরে আচারযুক্ত ধরণের ব্যাখ্যা করা হয়েছে আমি জেএসএনগুলি আপডেট করার কিছুটা ভিন্ন তবে সহজ উপায়টি নোট করব।

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()

এটা চমত্কার ভাবে কাজ করেছে. এই পদ্ধতির পাশাপাশি এখানে আরও একটি প্রস্তাবিত প্রস্তাব রয়েছে আশা করি আমি কোনও একটিকে সহায়তা করেছি।


2
db.session.merge(user)এই কোড যুক্ত করে আমার জন্য কাজ করেছে, এফওয়াইআই।
জেফ ব্লুমেল
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.