پایتون و MySQL: دستور Delete و UPDATE

10 آبان 1398
پایتون و MySQL: دستور Delete و UPDATE

دستور DELETE در MySQL

تا این قسمت از سری آموزشی پایتون با دستورات 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

دستور DROP

همانطور که گفتم اگر از دستور 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)

همانطور که گفتم اگر هیچ خروجی نداشته باشیم (خطایی نباشد) یعنی کد به درستی اجرا شده است.

دستور UPDATE

قبلا توضیح داده بودیم که برای ثبت و وارد کردن اطلاعات جدید در جدول های پایگاه داده باید از دستور 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

امیدوارم از این قسمت استفاده ی کافی را برده باشید.

تمام فصل‌های سری ترتیبی که روکسو برای مطالعه‌ی دروس سری از مقدماتی تا پیشرفته با پایتون توصیه می‌کند:
نویسنده شوید

دیدگاه‌های شما

در این قسمت، به پرسش‌های تخصصی شما درباره‌ی محتوای مقاله پاسخ داده نمی‌شود. سوالات خود را اینجا بپرسید.