تا این قسمت از سری آموزشی پایتون با دستورات SQL زیر آشنا شده ایم:
CREATE
- برای ساخت پایگاه داده (CREATE DATABASE mydatabase
) یا جدول های پایگاه داده (CREATE TABLE customers
) استفاده می شود.INSERT INTO
- برای ثبت داده های جدید درون جدول های پایگاه داده مورد استفاده قرار می گیرد (...INSERT INTO customers (name, address) VALUES
)SELECT
برای دریافت اطلاعات از جدول های پایگاه داده مورد استفاده قرار می گیرد (SELECT * FROM customers
).WHERE
یک شرط برای محدود کردن دستور SQL اصلی است (...=SELECT * FROM customers WHERE address
).ORDER BY
این دستور مسئول مرتب کردن نتایج برگشت داده شده از سمت پایگاه داده است (SELECT * FROM customers ORDER BY name
)و در این قسمت نوبت به بررسی چند دستور دیگر رسیده است: DELETE
و DROP
و UPDATE
برخی اوقات می خواهیم ردیفی را از یک جدول حذف کنیم؛ به طور مثال کاربری جریمه شده و از وب سایت ما ban می شود و یا اینکه کاربری می خواهد حساب کاربری خود را حذف کند. در این حالت می توانیم از DELETE در MySQL استفاده کنیم. به طور مثال در کد زیر قرار است ردیفی را حذف کنیم که ستون Address آن برابر با Mountain 21 باشد:
import mysql.connector mydb = mysql.connector.connect( host="localhost", user="myusername", passwd="mypassword", database="mydatabase" ) mycursor = mydb.cursor() sql = "DELETE FROM customers WHERE address = 'Mountain 21'" mycursor.execute(sql) mydb.commit() print(mycursor.rowcount, "record(s) deleted")
خروجی:
1 record(s) deleted
توجه داشته باشید که در زبان پایتون اگر از ()mydb.commit
استفاده نکنید هیچ تغییری در پایگاه داده ایجاد نمی شود. همچنین باید همیشه مراقب قسمت WHERE باشید چرا که این قسمت، فیلتر دستور SQL شما است؛ به طور مثال اگر از آن استفاده نکنید تمام داده های جدول حذف خواهند شد نه فقط یک ردیف! یا اگر چندین ردیف با آدرس بالا وجود داشته باشند آن ها نیز حذف می شوند! بنابراین نهایت دقت در استفاده از دستور DELETE را داشته باشید.
همچنین همانطور که قبلا توضیح داده بودیم بهتر است از s%
به عنوان placeholder استفاده کنید تا مقادیر ورودی از سمت کاربر escape شوند (جلوگیری از SQL Injection). برخی اوقات به کاربران اجازه میدهید برخی از اطلاعاتشان را حذف کنند. در این صورت ممکن است کاربری مقادیر جعلی و کدهای مخرب را در کوئری شما تزریق کند و باعث خسارات فراوانی شود. یک مثال از escape کردن مقادیر کاربر را در کد زیر می بینید:
import mysql.connector mydb = mysql.connector.connect( host="localhost", user="myusername", passwd="mypassword", database="mydatabase" ) mycursor = mydb.cursor() sql = "DELETE FROM customers WHERE address = %s" adr = ("Yellow Garden 2", ) mycursor.execute(sql, adr) mydb.commit() print(mycursor.rowcount, "record(s) deleted")
خروجی:
1 record(s) deleted
همانطور که گفتم اگر از دستور DELETE بدون شرط WHERE استفاده کنید تمام ردیف های جدول شما حذف خواهد شد اما خود جدول باقی خواهد ماند؛ یک جدول خالی! و بعدا می توانید داده های جدیدی را وارد آن کنید. حالا اگر بخواهید خود جدول را نیز به همراه داده ها حذف کنید می توانید از دستور DROP استفاده کنید. در مثال زیر می خواهیم کل جدول customers را حذف کنیم:
import mysql.connector mydb = mysql.connector.connect( host="localhost", user="myusername", passwd="mypassword", database="mydatabase" ) mycursor = mydb.cursor() sql = "DROP TABLE customers" mycursor.execute(sql)
در صورتی که مشکلی در حذف جدول customers وجود داشته باشد، خروجی این صفحه یک خطا خواهد بود اما اگر جدول با موفقیت حذف شود هیچ خروجی نخواهیم داشت.
برخی اوقات می خواهید جدولی را حذف کنید که قبلا حذف کرده اید، یا به هر دلیل دیگری جدولی که می خواهید حذف کنید وجود ندارد (مثلا نام جدول را اشتباه تایپ کرده باشید و...). در چنین حالتی برنامه با خطا مواجه می شود. برای جلوگیری از این خطا می توانید از دستور IF EXISTS استفاده کنید؛ این دستور ابتدا چک می کند که جدول وجود داشته باشد و اگر وجود داشت آن را حذف می کند، در غیر این صورت اتفاقی نمی افتد. مثال:
import mysql.connector mydb = mysql.connector.connect( host="localhost", user="myusername", passwd="mypassword", database="mydatabase" ) mycursor = mydb.cursor() sql = "DROP TABLE IF EXISTS customers" mycursor.execute(sql)
همانطور که گفتم اگر هیچ خروجی نداشته باشیم (خطایی نباشد) یعنی کد به درستی اجرا شده است.
قبلا توضیح داده بودیم که برای ثبت و وارد کردن اطلاعات جدید در جدول های پایگاه داده باید از دستور INSERT استفاده کرد اما اگر بخواهیم داده هایی را که از قبل در جدول هستند ویرایش کنیم چطور؟ در این حالت دستور INSERT به شما خطا می دهد و به جای آن باید از UPDATE استفاده کنید. در مثال زیر می خواهیم آدرس یکی از ردیف ها را از Valley 345 به Canyoun 123 تغییر دهیم:
import mysql.connector mydb = mysql.connector.connect( host="localhost", user="myusername", passwd="mypassword", database="mydatabase" ) mycursor = mydb.cursor() sql = "UPDATE customers SET address = 'Canyon 123' WHERE address = 'Valley 345'" mycursor.execute(sql) mydb.commit() print(mycursor.rowcount, "record(s) affected")
خروجی:
1 record(s) affected
به نظرم موارد استفاده ی این دستور بسیار واضح است؛ به طور مثال کاربر بخواهد نام کاربری خود، آدرس خود، تصویر پروفایل خود و... را تغییر دهد.
مثل همیشه باید از ()mydb.commit
استفاده کنید تا تغییرات در پایگاه داده اعمال شوند. همچنین در تمامی دستورات SQL حواستان به WHERE باشد و گرنه تمام ردیف های پایگاه داده را UPDATE خواهید کرد (به طور مثال در کد بالا آدرس تمام کاربران تبدیل به Canyoun 123 میشد). در آخر هم می توانید با استفاده از s%
ورودی های کاربران را escape کنید:
import mysql.connector mydb = mysql.connector.connect( host="localhost", user="myusername", passwd="mypassword", database="mydatabase" ) mycursor = mydb.cursor() sql = "UPDATE customers SET address = %s WHERE address = %s" val = ("Valley 345", "Canyon 123") mycursor.execute(sql, val) mydb.commit() print(mycursor.rowcount, "record(s) affected")
خروجی:
1 record(s) affected
امیدوارم از این قسمت استفاده ی کافی را برده باشید.
در این قسمت، به پرسشهای تخصصی شما دربارهی محتوای مقاله پاسخ داده نمیشود. سوالات خود را اینجا بپرسید.