পাইথনে এসকিউএল স্টেটমেন্টে ভেরিয়েবল কীভাবে ব্যবহার করবেন?


94

ঠিক আছে তাই আমি পাইথনের অভিজ্ঞ নই।

আমার কাছে নিম্নলিখিত পাইথন কোড রয়েছে:

cursor.execute("INSERT INTO table VALUES var1, var2, var3,")

যেখানে var1পূর্ণসংখ্যা var2এবং var3স্ট্রিংগুলি are

ক্যোরি টেক্সটের অংশ হিসাবে পাইথন ছাড়া আমি কীভাবে ভেরিয়েবলের নাম লিখতে পারি?

উত্তর:


107
cursor.execute("INSERT INTO table VALUES (%s, %s, %s)", (var1, var2, var3))

নোট করুন যে প্যারামিটারগুলি টিউপল হিসাবে পাস হয়েছে।

ডাটাবেস এপিআই যথাযথভাবে পালাতে এবং ভেরিয়েবলের উদ্ধৃতি দেয়। স্ট্রিং ফর্ম্যাটিং অপারেটর ( %) ব্যবহার না করার বিষয়ে সতর্ক থাকুন , কারণ

  1. এটি কোনও পালাতে বা উদ্ধৃতি দেয় না।
  2. এটি অনিয়ন্ত্রিত স্ট্রিং ফর্ম্যাট আক্রমণ যেমন এসকিউএল ইঞ্জেকশন প্রবণ ।

আকর্ষণীয়, কেন এটি ওয়ারগুলির সাথে আলাদাভাবে একটি অ্যারের পরিবর্তে (var1, var2, var3) কাজ করে?
আন্দোমার

ডিবি এপিআই স্পেস অনুসারে, দেখে মনে হচ্ছে এটি যে কোনও উপায়ে হতে পারে: পাইথন.অর্গ
আইমান হৌরিহ

9
@ থেককাশ্যপ আবার সাবধানে পড়ুন। অনিরাপদ কী স্ট্রিং বিন্যাস অপারেটর ব্যবহার করছে %। আসলে, আমি উত্তরে তাই বলছি।
আইমান হৌরিহ

আমার খারাপ .. আমি স্ট্রিং এবং ভেরিয়েবলের % মধ্যে ,পার্থক্যের পরিবর্তে একটি পরিবর্তনের কল্পনা করেছি .. বিভিন্ন কারণে আমার ভোট-ডাউনটি পূর্বাবস্থায় ফিরিয়ে আনতে পারি না .. আমি ব্যক্তিগতভাবে বর্ণনায় বর্ণিত সুরক্ষিত / আক্রমণ ইত্যাদি শব্দ দেখতে চাই যেখানে আপনি ডন বলছেন ব্যবহার করবেন না %..
কাশ্যপ

4
@ এরিক উত্তরটি বলছে স্ট্রিংটি ফর্ম্যাট করতে % অপারেটরটি ব্যবহার করবেন না । ঐ %স্ট্রিং দ্বারা ব্যবহার করা হচ্ছে cursor.executeসরাসরি এবং যেহেতু এটা এর উৎপাদিত এসকিউএল জানে আপনাকে রক্ষা করার কিছু করতে পারেন।
মার্ক রান্সম

69

পাইথন ডিবি-এপিআইয়ের বিভিন্ন বাস্তবায়নকে বিভিন্ন স্থানধারক ব্যবহারের অনুমতি দেওয়া হয়, সুতরাং আপনি কোনটি ব্যবহার করছেন তা খুঁজে বের করতে হবে - এটি হতে পারে (যেমন মাইএসকিউএলডিবি সহ):

cursor.execute("INSERT INTO table VALUES (%s, %s, %s)", (var1, var2, var3))

বা (উদাহরণস্বরূপ পাইথন স্ট্যান্ডার্ড লাইব্রেরি থেকে স্ক্লাইট 3 সহ):

cursor.execute("INSERT INTO table VALUES (?, ?, ?)", (var1, var2, var3))

বা অন্য এখনও (আপনার পরে VALUESথাকতে পারে (:1, :2, :3), বা "নামযুক্ত শৈলী" থাকতে পারে (:fee, :fie, :fo)বা (%(fee)s, %(fie)s, %(fo)s)যেখানে আপনি দ্বিতীয় যুক্তি হিসাবে মানচিত্রের পরিবর্তে ডিকটি পাস করেন execute)। paramstyleআপনি যে ডিবি এপিআই মডিউলটি ব্যবহার করছেন তাতে স্ট্রিং ধ্রুবকটি পরীক্ষা করুন এবং সমস্ত পরামিতি-পাসিং শৈলীগুলি কী তা দেখতে http://www.python.org/dev/peps/pep-0249/ এ প্যারামিস্টাইলটি দেখুন!


বাহ্যিক এসকিউএল স্ক্রিপ্ট ছাড়াও একই কাজ করা সম্ভব?
নভিটল

49

অনেক পথে. রিয়েল কোডে সর্বাধিক সুস্পষ্ট এক ( সহ ) ব্যবহার করবেন না , এটি আক্রমণে উন্মুক্ত ।%s%

এখানে স্কাইলাইট 3 এর পাইডোক থেকে অনুলিপি করুন :

# Never do this -- insecure!
symbol = 'RHAT'
c.execute("SELECT * FROM stocks WHERE symbol = '%s'" % symbol)

# Do this instead
t = ('RHAT',)
c.execute('SELECT * FROM stocks WHERE symbol=?', t)
print c.fetchone()

# Larger example that inserts many records at a time
purchases = [('2006-03-28', 'BUY', 'IBM', 1000, 45.00),
             ('2006-04-05', 'BUY', 'MSFT', 1000, 72.00),
             ('2006-04-06', 'SELL', 'IBM', 500, 53.00),
            ]
c.executemany('INSERT INTO stocks VALUES (?,?,?,?,?)', purchases)

আপনার প্রয়োজন হলে আরও উদাহরণ:

# Multiple values single statement/execution
c.execute('SELECT * FROM stocks WHERE symbol=? OR symbol=?', ('RHAT', 'MSO'))
print c.fetchall()
c.execute('SELECT * FROM stocks WHERE symbol IN (?, ?)', ('RHAT', 'MSO'))
print c.fetchall()
# This also works, though ones above are better as a habit as it's inline with syntax of executemany().. but your choice.
c.execute('SELECT * FROM stocks WHERE symbol=? OR symbol=?', 'RHAT', 'MSO')
print c.fetchall()
# Insert a single item
c.execute('INSERT INTO stocks VALUES (?,?,?,?,?)', ('2006-03-28', 'BUY', 'IBM', 1000, 45.00))

4
কিছু ডিবি-এপিআই বাস্তবায়ন তাদের ভেরিয়েবলের জন্য% s ব্যবহার করে - বিশেষত পোস্টগ্রাইএসকিউএল-এর জন্য সাইকোপিজি 2। স্ট্রিং প্রতিস্থাপনের জন্য% অপারেটরের সাথে% s ব্যবহার করে এটি বিভ্রান্ত হওয়ার দরকার নেই (যদিও এটি সহজেই রয়েছে)। আমি সত্যিই খুব সুন্দর হই যদি, পোর্টেবিলিটির জন্য, আমরা কেবলমাত্র ডিবি-এপিআই-এর জন্য এসকিউএল পরামিতিগুলি নির্দিষ্ট করার একটি নির্ধারিত মানক উপায় থাকতে পারি।
ThatAintWorking

26

http://www.amk.ca/python/writing/DB-API.html

আপনি যখন আপনার বিবৃতিতে ভেরিয়েবলের মানগুলি যুক্ত করেন তখন সাবধান হন: কোনও ব্যবহারকারী নিজের নামকরণের কল্পনা করুন ';DROP TABLE Users;'- এজন্য আপনাকে স্কয়ার এস্কেপিং ব্যবহার করতে হবে যা আপনি কার্সারটি ব্যবহার করার সময় পাইথন আপনাকে সরবরাহ করেন ex ইউআরএলের উদাহরণ হ'ল:

cursor.execute("insert into Attendees values (?, ?, ?)", (name,
seminar, paid) )

13
আসলে, এটি এসকিউএল পালাবার নয়। এটি পরিবর্তনশীল বাঁধাই, যা অনেক সহজ এবং আরও সরাসরি direct মানগুলি বিশ্লেষণের পরে এসকিউএল বিবৃতিতে আবদ্ধ হয়, এটি কোনও ইঞ্জেকশন আক্রমণে প্রতিরোধক করে তোলে।
এস .লট

ভাল, এটি এসকিউএল পালাবার বা পরিবর্তনশীল বাঁধাই আপনার ডাটাবেস সার্ভার / ডিবি-এপিআই ড্রাইভারটি কতটা খারাপ বা খারাপ তা নির্ভর করে। আমি কিছু রিয়েল-ওয়ার্ল্ড দেখেছি, ব্যাপকভাবে মোতায়েন করা প্রোডাকশন ডেটাবেজ যেখানে তার ডিবি-এপিআই ড্রাইভারটি কেবল তারের উপর থাকা ডেটা এবং কোডকে বাইরে রাখার পরিবর্তে পালাতে পারে। বলা বাহুল্য, তথাকথিত "ডাটাবেসগুলি" সম্পর্কে আমার খুব বেশি শ্রদ্ধা নেই।
চার্লস ডাফি
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.