এসকিউএলএলকেমি: ইঞ্জিন, সংযোগ এবং সেশন পার্থক্য


134

আমি SQLAlchemy ব্যবহার এবং সেখানে অন্তত তিনটি সত্ত্বা আছেন: engine, sessionএবং connection, যা আছে executeপদ্ধতি, তাই যদি আমি যেমন সব রেকর্ড থেকে নির্বাচন করতে চান tableআমি এটা করতে পারেন

engine.execute(select([table])).fetchall()

এবং এই

connection.execute(select([table])).fetchall()

এমনকি এটি

session.execute(select([table])).fetchall()

- ফলাফল একই হবে।

আমি এটি বুঝতে পেরেছি যে কেউ engine.executeএটি ব্যবহার করে তবে তা তৈরি করে connection, খোলে session(আলকেমি আপনার জন্য এটি যত্ন করে) এবং কোয়েরিটি সম্পাদন করে। তবে এই জাতীয় কার্য সম্পাদনের এই তিনটি পদ্ধতির মধ্যে কি বিশ্বব্যাপী পার্থক্য রয়েছে?


আমি মনে করি আপনার উত্তরটি এখানেই রয়েছে: হ্যাকারস্যান্ডস্ল্যাকারস //
সেফ

উত্তর:


123

একটি লাইন ওভারভিউ:

আচরণকে 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()পদ্ধতিতে কল করে।SQLExecutable

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ডাটাবেসটির সাথে ইন্টারঅ্যাক্ট করার জন্য অ্যাপ্লিকেশনের জন্য অবজেক্টটি ব্যবহার করা হচ্ছে এসকিউএলএলকেমি ওআরএমের প্রস্তাবিত উপায়।

থেকে একটি উদ্ধৃতাংশ ডক্স :

এটি লক্ষণীয় গুরুত্বপূর্ণ যে এসকিউএলএলএকআরএইআরএম ব্যবহার করার সময়, এই বিষয়গুলি সাধারণত অ্যাক্সেস করা হয় না; পরিবর্তে, সেশন অবজেক্টটি ডাটাবেসের ইন্টারফেস হিসাবে ব্যবহৃত হয়। তবে, ওআরএম এর উচ্চ স্তরের পরিচালন পরিষেবাদিগুলির সাথে জড়িত না হয়ে পাঠ্য এসকিউএল স্টেটমেন্ট এবং / অথবা এসকিউএল এক্সপ্রেশন কনস্ট্রাক্টসের সরাসরি ব্যবহারের আশেপাশে নির্মিত অ্যাপ্লিকেশনগুলির জন্য ইঞ্জিন এবং সংযোগ রাজা (এবং রানী?) - পড়ুন।


"সংযোগহীন" শব্দটি বোঝায় যে কোনও সংযোগ তৈরি হচ্ছে না, যা নীলের উত্তর অনুসারে ঘটনাটি নয়।
অ্যাটম

111

নাবিলের উত্তর অনেক বিবরণ জুড়ে এবং সহায়ক, কিন্তু আমি এটি অনুসরণ করতে বিভ্রান্তিকর। যেহেতু এই সমস্যাটির জন্য এটি বর্তমানে গুগলের প্রথম ফলাফল, ভবিষ্যতের লোকদের জন্য এটি সম্পর্কে আমার বোঝার যোগ করে যারা এই প্রশ্নটি খুঁজে পান:

চলমান। মজাদার ()

ওপি এবং নাবেল আহমেদ উভয়ই নোট করেছেন যে, কোনও সমতল কার্যকর করার সময় SELECT * FROM tablename, প্রদত্ত ফলাফলের মধ্যে কোনও পার্থক্য নেই।

এই তিনটি বস্তুর মধ্যে পার্থক্য প্রসঙ্গ উপর নির্ভর করে গুরুত্বপূর্ণ হয়ে যে SELECTবিবৃতি বা, আরো সাধারণভাবে, যখন আপনি কাজ করতে চান মত অন্যান্য বিষয়ের ব্যবহার করা হয় INSERT, DELETEইত্যাদি

সাধারণত ইঞ্জিন, সংযোগ, সেশন কখন ব্যবহার করবেন

  • ইঞ্জিনটি এসকিএএলএলচেমি দ্বারা ব্যবহৃত সর্বনিম্ন স্তরের অবজেক্ট। এটা তোলে সংযোগের একটি পুল রক্ষণাবেক্ষণ ব্যবহার যখনই আবেদন ডাটাবেসের সাথে কথা বলতে হবে জন্য উপলব্ধ। .execute()প্রথমে কল conn = engine.connect(close_with_result=True)এবং তারপরে একটি সুবিধা পদ্ধতি conn.execute()। Close_with_result পরামিতি মানে সংযোগটি স্বয়ংক্রিয়ভাবে বন্ধ হয়ে গেছে। (আমি উত্স কোডটি কিছুটা প্যারাফ্রেস করছি, তবে মূলত সত্য)। সম্পাদনা করুন: এখানে ইঞ্জিন.সেকুটের জন্য উত্স কোড

    আপনি কাঁচা এসকিউএল কার্যকর করতে ইঞ্জিন ব্যবহার করতে পারেন।

    result = engine.execute('SELECT * FROM tablename;')
    #what engine.execute() is doing under the hood
    conn = engine.connect(close_with_result=True)
    result = conn.execute('SELECT * FROM tablename;')
    
    #after you iterate over the results, the result and connection get closed
    for row in result:
        print(result['columnname']
    
    #or you can explicitly close the result, which also closes the connection
    result.close()

    এটি প্রাথমিক ব্যবহারের অধীনে ডক্সগুলিতে আচ্ছাদিত ।

  • সংযোগ হ'ল (যেমন আমরা উপরে দেখেছি) যা আসলে একটি এসকিউএল কোয়েরি কার্যকর করার কাজ করে। আপনি যখনই সংযোগের বৈশিষ্ট্যগুলির উপর, যখন এটি বন্ধ হয়ে যায় ইত্যাদি উপর বৃহত্তর নিয়ন্ত্রণ চান আপনার এটি করা উচিত example উদাহরণস্বরূপ, এর একটি খুব আমদানি উদাহরণ হ'ল একটি লেনদেন , যা আপনাকে কখন ডাটাবেসে আপনার পরিবর্তনগুলি সংঘটিত করতে হবে তা সিদ্ধান্ত নিতে দেয়। সাধারণ ব্যবহারে পরিবর্তনগুলি স্বয়ংক্রিয়ভাবে অনুমোদিত হয়। লেনদেনের ব্যবহারের সাহায্যে আপনি (উদাহরণস্বরূপ) বিভিন্ন এসকিউএল স্টেটমেন্ট চালাতে পারেন এবং এর মধ্যে কোনওটির সাথে যদি কিছু ভুল হয়ে যায় তবে আপনি একবারে সমস্ত পরিবর্তন পূর্বাবস্থায় ফিরিয়ে নিতে পারেন।

    connection = engine.connect()
    trans = connection.begin()
    try:
        connection.execute("INSERT INTO films VALUES ('Comedy', '82 minutes');")
        connection.execute("INSERT INTO datalog VALUES ('added a comedy');")
        trans.commit()
    except:
        trans.rollback()
        raise

    এটির কোনওটি ব্যর্থ হলে উভয় পরিবর্তনকে পূর্বাবস্থায় ফিরিয়ে আনতে দেয়, যেমন আপনি যদি ডাটাবেস টেবিল তৈরি করতে ভুলে যান।

    সুতরাং আপনি যদি কাঁচা এসকিউএল কোড চালাচ্ছেন এবং নিয়ন্ত্রণের প্রয়োজন হয় তবে সংযোগগুলি ব্যবহার করুন

  • দায়রা SQLAlchemy বস্তুর সম্পর্ক ব্যবস্থাপনা (ORM) দৃষ্টিভঙ্গি জন্য ব্যবহার করা হয় (আসলে আপনি কিভাবে তারা আমদানিকৃত করছি থেকে এই দেখতে পারেন: from sqlalchemy.orm import sessionmaker)। তারা স্বয়ংক্রিয়ভাবে উত্পাদিত এসকিউএল বিবৃতি চালানোর জন্য ফণা অধীনে সংযোগ এবং লেনদেন ব্যবহার করে। .execute()একটি সুবিধাজনক ফাংশন যা অধিবেশনটি আবদ্ধ (যা সাধারণত একটি ইঞ্জিন, তবে সংযোগ হতে পারে) এর মধ্য দিয়ে যায় whatever

    আপনি যদি ওআরএম কার্যকারিতা ব্যবহার করেন তবে সেশনটি ব্যবহার করুন; যদি আপনি কেবল সরল এসকিউএল অনুসন্ধানগুলি অবজেক্টের সাথে আবদ্ধ না হয়ে থাকেন তবে আপনি সম্ভবত সরাসরি সংযোগগুলি ব্যবহার করে ভাল better


1
Statementsোকানো বিবৃতিগুলি ডাবল কোটে আবদ্ধ করা উচিত নয় ""?
মিঙ্গচাউ

2
@ মেমচাউ হ্যাঁ, আপনি ঠিক বলেছেন আমার একক উক্তিগুলি একে অপরের সাথে হস্তক্ষেপ করত, ডাবল উদ্ধৃতিগুলি এই সমস্যাটি এড়ানো সহজ। আপডেট করা হয়েছে।
নিল

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

@RajuyourPepe my_session.connection()। দস্তাবেজ: ডকস.সক্ল্যাচেমি.আর.আর / এএন / ১৩ / হরম /
নিল

সিরিয়াসলি? 'সেশন' অবজেক্টটির 'কানেক্ট' "এর কোনও বৈশিষ্ট্য নেই, আমি যা পেয়েছি তা হল
রাজু তোমার পেপ

0

ডিআরসিএল চালানোর উদাহরণ (ডেটা নিয়ন্ত্রণের ভাষা) যেমন গ্র্যান্ট

def grantAccess(db, tb, user):
  import sqlalchemy as SA
  import psycopg2

  url = "{d}+{driver}://{u}:{p}@{h}:{port}/{db}".\
            format(d="redshift",
            driver='psycopg2',
            u=username,
            p=password,
            h=host,
            port=port,
            db=db)
  engine = SA.create_engine(url)
  cnn = engine.connect()
  trans = cnn.begin()
  strSQL = "GRANT SELECT on table " + tb + " to " + user + " ;"
  try:
      cnn.execute(strSQL)
      trans.commit()
  except:
      trans.rollback()
      raise
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.