একটি লাইন ওভারভিউ:
আচরণকে execute()
সব ক্ষেত্রেই একই, কিন্তু তারা 3 বিভিন্ন পদ্ধতি, হয় Engine
, Connection
এবং Session
ক্লাস।
ঠিক কী execute()
:
আচরণ বোঝার execute()
জন্য আমাদের Executable
ক্লাসটি সন্ধান করা উচিত । Executable
সমস্ত "স্টেটমেন্ট" ধরণের অবজেক্টের জন্য একটি সুপারক্লাস যা নির্বাচন (), মুছুন (), আপডেট (), সন্নিবেশ (), পাঠ্য () - সহজ কথায় বলতে Executable
গেলে, এসকিউএলএলচেমিতে সমর্থিত একটি এসকিউএল এক্সপ্রেশন কন্সট্রাক্ট।
সমস্ত ক্ষেত্রে execute()
পদ্ধতিটি এসকিউএল পাঠ্য বা নির্মিত এসকিউএল এক্সপ্রেশন গ্রহণ করে অর্থাৎ এসকিউএএলএলচেমিতে সমর্থিত বিভিন্ন ধরণের এসকিউএল এক্সপ্রেশন কনস্ট্রাক্ট এবং কোয়েরির ফলাফলগুলি ফেরত দেয় (ক ResultProxy
- DB-API
সারি কলামগুলিতে সহজ অ্যাক্সেস সরবরাহ করতে একটি কার্সার বস্তুকে আবৃত করে ))
এটি আরও স্পষ্ট করতে (কেবল ধারণাগত স্পষ্টতার জন্য, প্রস্তাবিত পদ্ধতির জন্য নয়) :
ছাড়াও Engine.execute()
(connectionless ফাঁসি), Connection.execute()
এবং Session.execute()
, এটি সম্ভব ব্যবহার করা execute()
কোনো সরাসরি Executable
কনস্ট্রাক্ট। Executable
ক্লাসের এটা নিজস্ব বাস্তবায়ন হয়েছে execute()
- সরকারী ডকুমেন্টেশন অনুযায়ী, কী এক লাইন বিবরণ execute()
আছে "হয় কম্পাইল এবং এই চালানোExecutable
"। এই ক্ষেত্রে আমাদের Executable
(এসকিউএল এক্সপ্রেশন কন্সট্রাক্ট) স্পষ্টভাবে একটি Connection
বস্তু বা, Engine
অবজেক্ট (যা সুস্পষ্টভাবে একটি বস্তু পায় ) এর সাথে আবদ্ধ Connection
করতে execute()
হবে , সুতরাং কোথায় এটি কার্যকর করতে হবে তা জানতে পারবে SQL
।
নিম্নলিখিত উদাহরণটি এটি ভালভাবে দেখায় - নীচে যেমন একটি সারণী দেওয়া হয়েছে:
from sqlalchemy import MetaData, Table, Column, Integer
meta = MetaData()
users_table = Table('users', meta,
Column('id', Integer, primary_key=True),
Column('name', String(50)))
সুস্পষ্ট কার্যকরকরণ যেমন Connection.execute()
- এসকিউএল পাঠ্য বা নির্মিত এসকিউএল এক্সপ্রেশনটি execute()
পদ্ধতিতে পাস করা Connection
:
engine = create_engine('sqlite:///file.db')
connection = engine.connect()
result = connection.execute(users_table.select())
for row in result:
# ....
connection.close()
সুস্পষ্ট সংযোগহীন কার্যকরকরণ যেমন Engine.execute()
- এসকিউএল পাঠ্য বা নির্মিত এসকিউএল এক্সপ্রেশনটি সরাসরি execute()
ইঞ্জিনের পদ্ধতিতে পাস করা :
engine = create_engine('sqlite:///file.db')
result = engine.execute(users_table.select())
for row in result:
# ....
result.close()
অন্তর্নিহিত সম্পাদন অর্থাত্ Executable.execute()
- সংযোগবিহীন , এবং এর execute()
পদ্ধতিটিকে কল করে, অর্থাত্ Executable
এটি নিজেই এক্সপ্রেশন কন্সট্রাক্ট (উদাহরণস্বরূপ ) এর execute()
পদ্ধতিতে কল করে।SQL
Executable
engine = create_engine('sqlite:///file.db')
meta.bind = engine
result = users_table.select().execute()
for row in result:
# ....
result.close()
দ্রষ্টব্য: স্পষ্টকরণের উদ্দেশ্যে অন্তর্নিহিত মৃত্যুদণ্ডের উদাহরণ উল্লেখ করেছেন - দস্তাবেজ অনুসারে মৃত্যুদণ্ড কার্যকর করার এই পদ্ধতিটি অত্যন্ত সুপারিশ করা হয়নি :
"অন্তর্নিহিত কার্যকরকরণ" একটি খুব পুরানো ব্যবহারের ধরণ যা বেশিরভাগ ক্ষেত্রে এটি সহায়ক হিসাবে তুলনায় আরও বিভ্রান্তিকর এবং এর ব্যবহারকে নিরুৎসাহিত করা হয়। উভয় নিদর্শন অ্যাপ্লিকেশন ডিজাইনে প্রশমিত "শর্ট কাট" এর অত্যধিক ব্যবহারকে উত্সাহিত করবে বলে মনে হয় যা পরে সমস্যা তৈরি করে।
তোমার প্রশ্নগুলো:
যেহেতু আমি বুঝতে পেরেছি যে কেউ ইঞ্জিন ব্যবহার করে ex এক্সিকিউটে এটি সংযোগ তৈরি করে, সেশনটি খোলে (কেমিটি আপনার জন্য এটি যত্ন করে) এবং কোয়েরি কার্যকর করে।
আপনি "অংশটি সঠিকভাবে তৈরি করেন" যদি engine.execute
এটি ব্যবহার করে connection
তবে এটি " তৈরি করে " তবে "খোলে না session
(আলকেমি আপনার জন্য এটি যত্ন করে) এবং ক্যোয়ারি চালায়" - আনুষ্ঠানিকভাবে অবজেক্টটি স্পষ্টভাবে তৈরি হয়ে যায় Engine.execute()
এবং Connection.execute()
প্রায় (প্রায়) একই জিনিস হয় Connection
, এবং পরবর্তী ক্ষেত্রে আমরা স্পষ্টভাবে এটি তাত্পর্যপূর্ণ করব। এই ক্ষেত্রে যা ঘটে তা হ'ল:
`Engine` object (instantiated via `create_engine()`) -> `Connection` object (instantiated via `engine_instance.connect()`) -> `connection.execute({*SQL expression*})`
কিন্তু এই জাতীয় কার্য সম্পাদনের এই তিনটি পদ্ধতির মধ্যে কি বিশ্বব্যাপী পার্থক্য রয়েছে?
ডিবি লেয়ারে এটি ঠিক একই জিনিস, এঁরা সকলেই এসকিউএল (টেক্সট এক্সপ্রেশন বা বিভিন্ন এসকিউএল এক্সপ্রেশন কনস্ট্রাক্টস) চালাচ্ছেন। প্রয়োগের দৃষ্টিকোণ থেকে দুটি বিকল্প রয়েছে:
- প্রত্যক্ষ সম্পাদন - ব্যবহার
Engine.execute()
বাConnection.execute()
- ব্যবহার
sessions
- দক্ষতার একক অফ কাজ হিসাবে লেনদেন হ্যান্ডলগুলি, স্বচ্ছন্দে সঙ্গে মাধ্যমে session.add()
, session.rollback()
, session.commit()
, session.close()
। ওআরএম অর্থাৎ ম্যাপযুক্ত টেবিলের ক্ষেত্রে এটি ডিবির সাথে যোগাযোগের উপায়। প্রদান করে identity_map অবিলম্বে একটি একক অনুরোধের সময় ইতিমধ্যে অ্যাকসেস বা নব নির্মিত / যোগ বস্তু পাওয়ার জন্য।
Session.execute()
শেষ পর্যন্ত Connection.execute()
এসকিউএল স্টেটমেন্ট কার্যকর করতে স্টেটমেন্ট এক্সিকিউশন পদ্ধতি ব্যবহার করে । Session
ডাটাবেসটির সাথে ইন্টারঅ্যাক্ট করার জন্য অ্যাপ্লিকেশনের জন্য অবজেক্টটি ব্যবহার করা হচ্ছে এসকিউএলএলকেমি ওআরএমের প্রস্তাবিত উপায়।
থেকে একটি উদ্ধৃতাংশ ডক্স :
এটি লক্ষণীয় গুরুত্বপূর্ণ যে এসকিউএলএলএকআরএইআরএম ব্যবহার করার সময়, এই বিষয়গুলি সাধারণত অ্যাক্সেস করা হয় না; পরিবর্তে, সেশন অবজেক্টটি ডাটাবেসের ইন্টারফেস হিসাবে ব্যবহৃত হয়। তবে, ওআরএম এর উচ্চ স্তরের পরিচালন পরিষেবাদিগুলির সাথে জড়িত না হয়ে পাঠ্য এসকিউএল স্টেটমেন্ট এবং / অথবা এসকিউএল এক্সপ্রেশন কনস্ট্রাক্টসের সরাসরি ব্যবহারের আশেপাশে নির্মিত অ্যাপ্লিকেশনগুলির জন্য ইঞ্জিন এবং সংযোগ রাজা (এবং রানী?) - পড়ুন।