ফ্লাস্ক এসকিউএএলএলএচএমি ক্যোয়ারী, কলামের নাম উল্লেখ করুন


125

আমি আমার ক্যোয়ারিতে মডেলটি ব্যবহার করে যে কলামটি চাই তা কীভাবে নির্দিষ্ট করব (এটি ডিফল্টরূপে সমস্ত কলাম নির্বাচন করে)? আমি কীভাবে স্ক্লালচমি সেশন দিয়ে এটি করব তা জানি: session.query(self.col1)তবে আমি কীভাবে মডেলগুলি দিয়ে এটি করব? আমি করতে পারি না SomeModel.query()। কোন উপায় আছে?

উত্তর:


220

আপনি with_entities()ফলটিতে কোন কলামগুলি ফিরে আসতে চান তা সীমাবদ্ধ করতে আপনি পদ্ধতিটি ব্যবহার করতে পারেন । ( ডকুমেন্টেশন )

result = SomeModel.query.with_entities(SomeModel.col1, SomeModel.col2)

আপনার প্রয়োজনীয়তার উপর নির্ভর করে আপনি ডিফার্ডগুলিও দরকারী খুঁজে পেতে পারেন । তারা আপনাকে সম্পূর্ণ বস্তুটি ফেরত দেওয়ার অনুমতি দেয় তবে তারের উপরে আসা কলামগুলিকে সীমাবদ্ধ করে।


21
with_entities () সমস্ত () উপকরণকে নয়, কলামের মানগুলিকে দ্বিগুণ করে তোলে!
কলিপ্টো

10
কোলিপ্টো: আপনি যা বলবেন তা ফল দেয়। SomeModel.query.with_entities (SomeModel) অবজেক্টটি উত্পন্ন করবে। সেশন.কোয়ারির মতোই (সামমোডেল কোড 1, সামোমোডেল কোড 2) কলাম মানগুলির দ্বিগুণ করবে। ডিফার্ডগুলি হ'ল আপনি কী ব্যবহার করবেন যদি আপনি তারের উপরে কলামগুলি না চান তবে আপনি যে কোনও উপায়ে পুরো বস্তুটি চান।
ডেভিড ম্যাককোইন

2
ধন্যবাদ এটি কাজ করে। তবে আমরা কীভাবে ওরফে ক্ষেত্রের জন্য বরাদ্দ করতে পারি? কারণ আমার ক্ষেত্রে, আমি JOIN এবং দ্বন্দ্বের IDক্ষেত্রটি ব্যবহার করছি যা উভয় টেবিলে উপস্থিত রয়েছে
মিতুল শাহ

হ্যাঁ, @ মিতুলশাহের সাথে আমারও একই প্রশ্ন আছে, কীভাবে ওরফে সেট করবেন?
নাম জি ভিইউ

উপনামের জন্য, নীচে এই সংক্ষিপ্ত উত্তরটি দেখুন। .label() স্ট্যাকওভারফ্লো.com
নাম জি ভিইউ

69
session.query().with_entities(SomeModel.col1)

হিসাবে একই

session.query(SomeModel.col1)

ওরফে জন্য, আমরা .label () ব্যবহার করতে পারি

session.query(SomeModel.col1.label('some alias name'))

2
দ্বিতীয়টি উভয়টি আরও যুক্তিসঙ্গত বলে মনে হচ্ছে এবং এটি সংক্ষিপ্ত - win / win
fgblomqvist

7
আপনার প্রথম বক্তব্য ভুল। আপনার প্রথম বন্ধনী দরকার। সুতরাং, এটি পড়তে হবে:session.query().with_entities(SomeModel.col1)
JGFMK

প্রথমটি (এবং তৃতীয়) বিকল্পগুলি সর্বাধিক সেরা, যদি আপনি বিদ্যমান ক্যোয়ারী অবজেক্টগুলি পুনরায় ব্যবহার করতে চান, বিশেষত একাধিক জটিল সাবকিউয়েরি করার ক্ষেত্রে।
জেমি স্ট্রস

36

আপনি লোড_অনলি ফাংশনটি ব্যবহার করতে পারেন :

from sqlalchemy.orm import load_only

fields = ['name', 'addr', 'phone', 'url']
companies = session.query(SomeModel).options(load_only(*fields)).all()

1
এই সমাধানটি সর্বোত্তম কারণ এটি এখনও ফলাফলের তালিকাই নয় কেবল একটি বিষয় হিসাবে কাজ করে।
rborodinov

এই সমাধানের জন্য আপনাকে ধন্যবাদ। এর অনেকগুলি সুবিধা রয়েছে: - ঠিক একই ধরণের অবজেক্টটি যেমন ফেরান .first()এবং .one()(যেটি অলস / আগ্রহী লোড ক্ষেত্র এবং সম্পর্কগুলি হবে) - কোয়েরি উপাদান হিসাবে সেট করা যেতে পারে
ড্যামিয়েন

কোডটি পরিষ্কার তবে এসকিএল কোয়েরি ডাটাবেস থেকে সমস্ত ক্ষেত্র নির্বাচন করে। আমি with_entitiesগৃহীত উত্তর এবং কোয়েরিতে প্রদত্ত হিসাবে কেবল সেই ক্ষেত্রগুলি / নির্বাচন করেছি।
শ্রীকান্ত জীভা

11

আপনি ব্যবহার করতে পারেন Model.query, কারণ Model(বা সাধারণত এটির বেস ক্লাস, বিশেষত ক্ষেত্রে ঘোষিত এক্সটেনশন ব্যবহৃত হয়) ক্ষেত্রে বরাদ্দ করা হয় Sesssion.query_property। এই ক্ষেত্রে Model.queryসমতুল্য Session.query(Model)

কোয়েরিতে ফিরে আসা কলামগুলি সংশোধন করার উপায় সম্পর্কে আমি অবগত নই (আরও ব্যবহার যুক্ত করে বাদ দিয়ে add_columns())।
সুতরাং আপনার সেরা শটটি ব্যবহার করা Session.query(Model.col1, Model.col2, ...)(যেমনটি ইতিমধ্যে সলিল দেখিয়েছে)।


আমি বিশ্বাস করি ক্যোয়ারী মানগুলির জন্য কলামগুলির তালিকাও রয়েছে এমন করার একটি উপায় থাকতে পারে (), ডকস.সেক্লাচেমি.আর.অর্গ / এন / স্লেস্ট / হরম / ......... - তবে তালিকার সিনট্যাকটিক চিনি আমাকে এই মুহুর্তে অন্তর্ভুক্ত করে।
জেজিএফএমকে


-11

এখানে একটি উদাহরণ:

movies = Movie.query.filter(Movie.rating != 0).order_by(desc(Movie.rating)).all()

আমি <> 0 রেটিং সহ চলচ্চিত্রগুলির জন্য ডিবিকে জিজ্ঞাসা করি এবং তারপরে আমি প্রথমে হাইজেস্ট রেটিং দিয়ে রেটিং দিয়ে তাদের অর্ডার করি।

এখানে একবার দেখুন: ফ্লাস্ক-এসকিউএএলএলএচএলমি-তে নির্বাচন করুন, সন্নিবেশ করুন, মুছুন

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.