স্ক্লাইট ডাটাবেস অনুসন্ধানের সময় আপনার কার্সার তৈরি করার দরকার কী?


133

আমি পাইথনের স্ক্লাইট 3 মডিউলে (এবং সাধারণভাবে এসকিউএল সেই বিষয়ে সাধারণভাবে) নতুনভাবে এসেছি এবং এটি আমাকে পুরোপুরি স্ট্যাম্প করে। cursorবস্তুর বর্ণনার প্রচুর অভাব (বরং তাদের প্রয়োজনীয়তা )ও অদ্ভুত বলে মনে হয়।

কোডের এই স্নিপেটটি জিনিসগুলি করার পছন্দের উপায়:

import sqlite3
conn = sqlite3.connect("db.sqlite")
c = conn.cursor()
c.execute('''insert into table "users" values ("Jack Bauer", "555-555-5555")''')
conn.commit()
c.close()

এটি এক নয়, যদিও এটি ঠিক পাশাপাশি এবং (আপাতদৃষ্টিতে অর্থহীন) ছাড়াও কাজ করে cursor:

import sqlite3
conn = sqlite3.connect("db.sqlite")
conn.execute('''insert into table "users" values ("Jack Bauer", "555-555-5555")''')
conn.commit()

কেউ আমাকে বলতে পারেন কেন আমার প্রয়োজন cursor?
এটি কেবল অর্থহীন ওভারহেডের মতো মনে হচ্ছে। আমার স্ক্রিপ্টের প্রতিটি পদ্ধতির জন্য যা একটি ডাটাবেস অ্যাক্সেস করে, আমি একটি তৈরি এবং ধ্বংস করার কথা cursor?
শুধু connectionজিনিসটি ব্যবহার করবেন না কেন ?

উত্তর:


60

কেবল একটি ভুল প্রয়োগের বিমূর্ততা আমার কাছে মনে হচ্ছে। একটি ডিবি কার্সার একটি বিমূর্ততা, যা ডেটা সেট ট্র্যাভারসাল জন্য বোঝায়।

বিষয়ে উইকিপিডিয়া নিবন্ধ থেকে :

কম্পিউটার বিজ্ঞান এবং প্রযুক্তিতে, একটি ডাটাবেস কার্সার এমন একটি নিয়ন্ত্রণ কাঠামো যা একটি ডাটাবেসের রেকর্ডগুলির উপরে ট্র্যাভারসাল সক্ষম করে। কার্সারগুলি ট্র্যাভারসালের সাথে একত্রে পরবর্তী প্রক্রিয়াজাতকরণকে সহজ করে, যেমন ডাটাবেস রেকর্ড পুনরুদ্ধার, সংযোজন এবং অপসারণ। ট্র্যাভারসাল এর ডেটাবেস কার্সার বৈশিষ্ট্য কার্সরকে পুনরুক্তি করার প্রোগ্রামিং ভাষার ধারণার সাথে এক করে তোলে।

এবং:

কার্সারগুলি কেবলমাত্র একটি অ্যাপ্লিকেশনে ডিবিএমএস থেকে ডেটা আনার জন্যই ব্যবহার করা যাবে না তবে আপডেট বা মুছতে টেবিলের একটি সারি সনাক্ত করতে হবে। এসকিউএল: 2003 স্ট্যান্ডার্ড স্থিত আপডেটের সংজ্ঞা দেয় এবং সেই উদ্দেশ্যে এসকিউএল বিবৃতি মুছে ফেলা হয়। এই জাতীয় বিবৃতি পূর্বাভাস সহ নিয়মিত WHERE ধারা ব্যবহার করে না। পরিবর্তে, একটি কার্সার সারিটি সনাক্ত করে। কার্সারটি অবশ্যই FETCH স্টেটমেন্টের মাধ্যমে একটি সারিতে খোলা থাকতে হবে এবং ইতিমধ্যে অবস্থান করতে হবে।

আপনি যদি পাইথন স্ক্লাইট মডিউলে ডকগুলি পরীক্ষা করেন , আপনি দেখতে পাচ্ছেন যে cursorএকটি CREATE TABLEবিবৃতি দেওয়ার জন্য পাইথন মডিউলটিও প্রয়োজন , সুতরাং এটি connectionওপেন দ্বারা সঠিকভাবে নির্দেশিত হিসাবে এমন ক্ষেত্রে ব্যবহার করা হয় যেখানে একটি নিছক বস্তু যথেষ্ট should এই জাতীয় বিমূর্ততা ডিবি কার্সার হতে লোকে যেভাবে বোঝে তার থেকে পৃথক এবং তাই ব্যবহারকারীদের মধ্যে বিভ্রান্তি / হতাশা। দক্ষতা নির্বিশেষে, এটি কেবল একটি ধারণামূলক ওভারহেড। দস্তাবেজে যদি এটি নির্দেশিত হয় যে cursorএসকিউএল এবং ডাটাবেসগুলিতে একটি কার্সারের চেয়ে অজগর মডিউলটি কিছুটা আলাদা if


7
পাইথনের একটি ডিবিতে ব্যবহৃত "ট্র্যাডিশনাল" ডিবি কার্সার এবং কার্সারগুলির মধ্যে (প্রথমে) খুব বিভ্রান্তির পার্থক্য স্বীকার করার জন্য +1
পল ড্রাগার


38

ফলাফল আনতে আপনার একটি কার্সার অবজেক্ট দরকার। আপনার উদাহরণটি কাজ করে কারণ এটি একটি INSERTএবং সুতরাং আপনি এটি থেকে কোনও সারি ফিরে পাওয়ার চেষ্টা করছেন না, তবে আপনি যদি sqlite3নথিতে তাকান , আপনি খেয়াল করবেন যে .fetchXXXXসংযোগের বিষয়গুলির কোনও পদ্ধতি নেই, তাই যদি আপনি চেষ্টা করার চেষ্টা করেন একটি SELECTকার্সার ছাড়াই, ফলস্বরূপ ডেটা পাওয়ার কোনও উপায় আপনার কাছে নেই।

কার্সার অবজেক্টস আপনাকে কোন ফলাফল সেটটি কোনটি সে সম্পর্কে নজর রাখতে দেয়, যেহেতু আপনি প্রথম ফলাফলগুলি সংগ্রহের আগে একাধিক প্রশ্ন চালানো সম্ভব।


5
মাথায় রাখার মতো মূল্য: পিইপি 249 কোনও executeসংযোগ বস্তুর উপরে সংজ্ঞা দেয় না , এটি একটি sqlite3এক্সটেনশন।
ক্যাট প্লাস প্লাস

4
এটি এখনও নির্বাচনী বিবৃতি: পেস্টবিন . com /5 জেডএইচবিএনএফ 7 নিয়ে কাজ করে । আপনি সংযোগ বস্তুতে কোনও .ফ্যাচএক্সএক্সএক্সএক্সএক্সএক্সএক্সএক্স পদ্ধতিতে কল করছেন না এর কারণ, আপনি সংযোগের। এক্সিকিউট () পদ্ধতিতে ফিরে আসা অবজেক্টে একটি .fetchXXXX পদ্ধতি কল করছেন।
জ্যাক বাউয়ার

1
হ্যাঁ. তবে একটি উপায়ে আপনি একটি (আপাতদৃষ্টিতে) অপ্রয়োজনীয় কার্সার দিয়ে শেষ করে যার সাথে ডাটাবেসটি জিজ্ঞাসা করবেন: পি
জ্যাক বাউয়ার

2
স্পষ্টভাবে এক্সিকিউটেবল-এর পাথ ব্যবহার করে, যাওয়ার জন্য কোনো ভালো অভ্যাস যেহেতু সম্ভবত ভবিষ্যতে প্রকল্প তুমি কোথায় জিনিস কাজ হবে না কে অটো কমিট।
আম্বর

1
যথেষ্ট ফর্সা। তথ্যের জন্য ধন্যবাদ :)
জ্যাক বাউয়ার

36

অফিসিয়াল ডক্স অনুসারে connection.execute()একটি নন-স্ট্যান্ডার্ড শর্টকাট যা একটি মধ্যবর্তী কার্সার অবজেক্ট তৈরি করে:

Connection.execute
এই নন-স্ট্যান্ডার্ড শর্টকাটটি কার্সার () মেথড কল করে একটি কার্সার বস্তুর সৃষ্টি করে দেওয়া পরামিতি সঙ্গে কার্সার এর চালানো () মেথড কল এবং কার্সার ফেরৎ।


19

12.6.8। Sqlite3 ব্যবহার দক্ষ ly থেকে

12.6.8.1। শর্টকাট পদ্ধতি ব্যবহার করে

ব্যবহার নন-স্ট্যান্ডার্ড execute() , executemany()এবং executescript()সংযোগ বস্তুর পদ্ধতি, আপনার কোড লেখা যেতে পারে আরও সংক্ষিপ্ত Ly কারণ আপনার (প্রায়ই তৈরি করতে হবে না অতিরিক্ত ) কার্সার স্পষ্টভাবে অবজেক্ট। পরিবর্তে, কার্সার অবজেক্টগুলি সুস্পষ্টভাবে তৈরি করা হয় এবং এই শর্টকাট পদ্ধতিগুলি কার্সার অবজেক্টগুলিকে ফিরিয়ে দেয়। এইভাবে, আপনি কোনও নির্বাচন নির্বাচন বিবরণী নির্বাহ করতে পারেন এবং সংযোগ অবজেক্টে কেবলমাত্র একটি কল ব্যবহার করে এটির উপরে পুনরাবৃত্তি করতে পারেন।

( স্ক্লাইট 3 ডকুমেন্টেশন ; জোর খনি।)

কেন শুধু সংযোগ অবজেক্টটি ব্যবহার করবেন না?

কারণ সংযোগ অবজেক্টের সেই পদ্ধতিগুলি মানহীন , অর্থাত্ সেগুলি পাইথন ডেটাবেসস API স্পেসিফিকেশন v2.0 (পিইপি 249) এর অংশ নয়।

যতক্ষণ আপনি কার্সার অবজেক্টের স্ট্যান্ডার্ড পদ্ধতিগুলি ব্যবহার করেন, আপনি নিশ্চিত হতে পারেন যে আপনি উপরের স্পেসিফিকেশন অনুসরণ করে অন্য কোনও ডাটাবেস বাস্তবায়নে স্যুইচ করলে আপনার কোডটি সম্পূর্ণ পোর্টেবল হবে। সম্ভবত আপনার কেবল importলাইনটি পরিবর্তন করতে হবে ।

তবে আপনি যদি এমনটি ব্যবহার করেন connection.executeতবে স্যুইচিংটি সোজা হবে না। এর cursor.executeপরিবর্তে আপনি সম্ভবত এটি ব্যবহার করতে চান এটি প্রধান কারণ ।

তবে আপনি যদি নিশ্চিত হন যে আপনি স্যুইচ করতে যাচ্ছেন না, আমি বলব connection.executeশর্টকাট নেওয়া এবং "দক্ষ" হওয়া পুরোপুরি ঠিক ।


1

এটি আমাদের ডাটাবেসের সাথে একই সংযোগের মাধ্যমে একাধিক পৃথক পৃথক কার্যকরী পরিবেশ রাখার সক্ষমতা দেয়।

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