এসকিএলএল্কেমি ব্যবহার করে আইডি দ্বারা কীভাবে ডাটাবেস অনুসন্ধান করবেন?


95

আমার একটি এসকিউএএলএলচেমি ডাটাবেস এর idঅনুরূপ কিছু দ্বারা জিজ্ঞাসা করা দরকার

User.query.filter_by (ব্যবহারকারীর নাম = 'পিটার')

তবে আইডির জন্য আমি এটা কিভাবে করবো? [গুগল এবং এসও অনুসন্ধান করে কোনও লাভ হয়নি]


দয়া করে আরও বিশদ সরবরাহ করুন, যেমন সমতুল্য এসকিউএল বা সিউডোকোড যা চান তা করছেন। "এসকিউএএলএলএকচেমি ডাটাবেস আইডি" কী?
ড্যানিয়েল ক্লুয়েভ

আপনার টেবিলের একটি আইডি কলাম আছে?
কিথ

উত্তর:


130

ক্যোয়ারির একটি গেম ফাংশন রয়েছে যা টেবিলের প্রাথমিক কী দ্বারা অনুসন্ধান করা সমর্থন করে, যা আমি ধরে নিই idis

উদাহরণস্বরূপ, 23 আইডি সহ কোনও অবজেক্টের জন্য জিজ্ঞাসা করা:

User.query.get(23)

দ্রষ্টব্য: আরও কয়েক জন মন্তব্যকারী এবং উত্তর উল্লেখ করেছেন, এটি "প্রাথমিক কীতে কোনও ক্যোয়ারী ফিল্টারিং সম্পাদন করুন" এর জন্য কেবল সংক্ষিপ্ত নয়। এসকিউএএলএলএকমি সেশনের অবস্থার উপর নির্ভর করে, এই কোডটি চালানো ডাটাবেসটিকে জিজ্ঞাসা করতে পারে এবং একটি নতুন উদাহরণ ফিরে আসতে পারে, বা এটি আসলে আপনার ডাটাবেসে অনুসন্ধান না করেই আপনার কোডে কোয়েড করা কোনও অবজেক্টের উদাহরণ ফিরে আসতে পারে। আপনি যদি ইতিমধ্যে এটি না করে থাকেন, তবে এসএমএইচএলএলএক্লেমি সেশনে ডকুমেন্টেশন পড়ার বিষয়টি বিবেচনা করুন


8
পান ফাংশন এছাড়াও আপনি একাধিক প্রাথমিক কী সমর্থন করে: YourModel.query.get((pk1, pk2))টিপল লক্ষ্য করুন।
marc_aragones

4
get()ফাংশন প্রশ্নের প্রাথমিক কী দ্বারা অবজেক্ট। আপনি যদি কোয়েরি করতে চান তবে আপনার প্রথমে প্রাথমিক কী হিসাবে idসেট idকরা উচিত ।

46

আপনি এই জাতীয় ID = 1 দিয়ে কোনও ব্যবহারকারীকে জিজ্ঞাসা করতে পারেন

session.query(User).get(1)


7

get () কখনও কখনও আপনার প্রত্যাশিত হিসাবে হয় না:

যদি আপনার লেনদেন হয়:

>>> session.query(User).get(1)
[SQL]: BEGIN (implicit)
[SQL]: SELECT user.id AS user_id, user.name AS user_name, user.fullname AS user_fullname
FROM user
WHERE user.id = ?
[SQL]: (1,)
<User(u'ed', u'Ed Jones')>

আপনি যদি কোনও লেনদেনে থাকেন (পান () আপনাকে ডাটাবেসকে জিজ্ঞাসা না করে মেমরিতে ফলাফল অবজেক্ট দেবে):

>>> session.query(User).get(1)
<User(u'ed', u'Ed Jones')>

এটি ব্যবহার করা ভাল:

>>> session.query(User.name).filter(User.id == 1).first()
[SQL]: SELECT user.name AS user_name
FROM user
WHERE user.id = ?
 LIMIT ? OFFSET ?
[SQL]: (1, 1, 0)
(u'Edwardo',)

4
এই আচরণটি কীভাবে অপ্রত্যাশিত?
সলোমন উকো

আমি আপনাকে বোঝাতে চাইছি যদি আপনি কোনও লেনদেন করেন (সেশন ডটমিট এখনও করেননি) get()মনে হচ্ছে আপনাকে মেমোরিতে ফলাফল অবজেক্ট দেবে (আসলে ডাটাবেসটিকে জিজ্ঞাসা না করে), তবে filter().first()সবসময় ডাটাবেসটিকে জিজ্ঞাসা করবে।
পান্ডা 912

লেনদেনের সময় একসাথে ডাটাবেস পরিবর্তন করা সম্ভব? যদি না হয়, getদক্ষতা বৃদ্ধির কারণে ব্যবহার করা ভাল।
সলোমন উকো

4
যেহেতু আমি জানি যে স্ক্লাচেমি অ্যাসিঙ্ক স্টাফগুলির সাথে কাজ করতে পারে না (কেবল উত্সাহের সাথে মনে হয়), এবং হ্যাঁ, এটি getআরও কার্যকর।
পান্ডা 912

কেন লেনদেনের বিষয়টি যত তাড়াতাড়ি .get () থেকে আলাদা? .First () সর্বদা ডাটাবেসে ফিরে যায়? এটি কি .get () বর্তমান এনভির মধ্যে প্রথমে দেখেন এটি আইডি বা কিছু জানে কিনা?
মিসৌথ

1

আপনি যদি ব্যবহার tables reflectionকরেন তবে প্রদত্ত সমাধানগুলিতে আপনার সমস্যা হতে পারে। (এখানে পূর্ববর্তী সমাধানগুলি আমার পক্ষে কার্যকর হয়নি)।

আমি যা ব্যবহার করে শেষ করেছি তা হ'ল:

session.query(object._class_).get(id)

( objectডাটাবেস থেকে প্রতিবিম্ব দ্বারা পুনরুদ্ধার করা হয়েছিল, এই জন্য আপনার ব্যবহারের প্রয়োজন .__class__)

আশা করি এটা কাজে লাগবে.


0

প্রথমত, আপনাকে idপ্রাথমিক কী হিসাবে সেট করা উচিত ।
তারপরে আপনি সেই query.get()পদ্ধতিটি ব্যবহার করতে পারেন idযা ইতিমধ্যে প্রাথমিক কী দ্বারা অবজেক্টগুলিকে জিজ্ঞাসা করতে পারে ।

যেহেতু query.get()প্রাথমিক কী দ্বারা অবজেক্টগুলি জিজ্ঞাসা করার পদ্ধতি। ফ্লাস্ক-এসকিউএএলএলএকএলএমি ডকুমেন্টেশন
থেকে অনুগামী

from flask import Flask
from flask_sqlalchemy import SQLAlchemy

app = Flask(__name__)
db = SQLAlchemy()
db.init_app(app)

class User(db.Model):
    __tablename__ = 'users'
    id = db.Column(db.Integer, primary_key=True)

def test():
    id = 1
    user = User.query.get(id)
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.