پایتون و MySQL: دستورات INSERT و SELECT

07 آبان 1398
پایتون و MySQL: دستورات INSERT و SELECT

دستور INSERT INTO

در قسمت قبل درباره ارتباط MySQL و پایتون صحبت کردیم و با روش ساختن پایگاه داده و جدول های آن آشنا شدیم. در این قسمت می خواهیم دستور INSERT را بررسی کنیم. این دستور برای وارد کردن داده های جدید درون جدول ها استفاده می شود و قالب کلی زیر را دارد:

INSERT INTO table_name (column1, column2, column3, ...)
VALUES (value1, value2, value3, ...);

البته اگر بخواهید مقادیر را برای تمام ستون های جدول وارد کنید دیگر نیازی به مشخص کردن ستون (column) ندارید:

INSERT INTO table_name
VALUES (value1, value2, value3, ...);

حالا فرض کنید با استفاده از همین دستور می خواهیم یک ردیف را وارد جدول customers کنیم. در این حالت می گوییم:

import mysql.connector

mydb = mysql.connector.connect(
  host="localhost",
  user="myusername",
  passwd="mypassword",
  database="mydatabase"
)

mycursor = mydb.cursor()

sql = "INSERT INTO customers (name, address) VALUES (%s, %s)"
val = ("John", "Highway 21")

mycursor.execute(sql, val)

mydb.commit()

print(mycursor.rowcount, "record inserted.")

خروجی این کد:

1 record inserted.

یعنی ردیف ما با موفقیت به جدول customers اضافه شد. نکته ی بسیار مهم که نباید از آن فراموش کنید، دستور()mydb.commit در انتهای کد است. در زبان پایتون برای آنکه تغییرات روی جدول اعمال شود حتما باید()mydb.commit را صدا بزنید.

حالا فرض کنید بخواهیم چند ردیف را همزمان وارد جدول کنیم. اگر بخواهیم از روش قبلی استفاده کنیم باید کدهایمان را مرتبا تکرار کنیم که توجیه عقلی ندارد. ما می توانیم به جای آن از متد()executemany استفاده کنیم؛ پارامتر اول آن همان دستور SQL ما و پارامتر دومش نیز لیستی از tuple هاست که همان داده هایی هستند که شما می خواهید در جدول وارد کنید. به مثال زیر توجه کنید:

import mysql.connector

mydb = mysql.connector.connect(
  host="localhost",
  user="myusername",
  passwd="mypassword",
  database="mydatabase"
)

mycursor = mydb.cursor()

sql = "INSERT INTO customers (name, address) VALUES (%s, %s)"
val = [
 ('Peter', 'Lowstreet 4'),
 ('Amy', 'Apple st 652'),
 ('Hannah', 'Mountain 21'),
 ('Michael', 'Valley 345'),
 ('Sandy', 'Ocean blvd 2'),
 ('Betty', 'Green Grass 1'),
 ('Richard', 'Sky st 331'),
 ('Susan', 'One way 98'),
 ('Vicky', 'Yellow Garden 2'),
 ('Ben', 'Park Lane 38'),
 ('William', 'Central st 954'),
 ('Chuck', 'Main Road 989'),
 ('Viola', 'Sideway 1633')
]

mycursor.executemany(sql, val)

mydb.commit()

print(mycursor.rowcount, "record was inserted.")

خروجی:

13 record was inserted.

به همین سادگی 13 ردیف مختلف به جدول ما اضافه شد. در صورتی که می خواستیم تمام این موارد را با روش اول اضافه کنیم کد بسیار بلند بالایی نوشته می شد که سرعت برنامه ی ما را به شدت می گرفت.

دریافت id ردیف وارد شده

برخی اوقات نیاز است که id آخرین ردیف وارد شده را داشته باشیم. برای دریافت این id می توانید از شیء cursor بخواهید که lastrowid را به شما بدهد. توجه داشته باشید که اگر چندین ردیف را همزمان وارد جدول خودتان کنید (روش بالا و استفاده از executemany) فقط id ردیف آخر به شما برگردانده می شود نه تمام ردیف ها. به مثال زیر توجه کنید:

import mysql.connector

mydb = mysql.connector.connect(
  host="localhost",
  user="myusername",
  passwd="mypassword",
  database="mydatabase"
)

mycursor = mydb.cursor()

sql = "INSERT INTO customers (name, address) VALUES (%s, %s)"
val = ("Michelle", "Blue Village")
mycursor.execute(sql, val)

mydb.commit()

print("1 record inserted, ID:", mycursor.lastrowid)

خروجی:

1 record inserted, ID: 15

دستور SELECT

حالا نوبت به بررسی دستور SELECT میرسد. این دستور برای دریافت ردیف ها و به طور کل اطلاعات از سمت جدول و پایگاه داده طراحی شده است و دارای قالب کلی زیر می باشد:

SELECT column1, column2, ...
FROM table_name;

البته اگر بخواهیم تمام ردیف های جدول را برگردانیم دیگر نمی خواهد نام ستون را مشخص کنیم بلکه به راحتی می گوییم:

SELECT * FROM table_name;

برای مثال فرض کنید جدولی به نام customers داریم و می خواهیم محتویات آن را مشاهده کنیم، یعنی هر چیزی که در آن باشد را دریافت کنیم. در چنین حالتی با استفاده از متد fetchall می گوییم:

import mysql.connector

mydb = mysql.connector.connect(
  host="localhost",
  user="myusername",
  passwd="mypassword",
  database="mydatabase"
)

mycursor = mydb.cursor()

mycursor.execute("SELECT * FROM customers")

myresult = mycursor.fetchall()

for x in myresult:
  print(x)

کار متد fetchall دریافت تمام نتایج برگشتی از پایگاه داده است.

خروجی:

(1, 'John', 'Highway 21')
(2, 'Peter', 'Lowstreet 27')
(3, 'Amy', 'Apple st 652')
(4, 'Hannah', 'Mountain 21')
(5, 'Michael', 'Valley 345')
(6, 'Sandy', 'Ocean blvd 2')
(7, 'Betty', 'Green Grass 1')
(8, 'Richard', 'Sky st 331')
(9, 'Susan', 'One way 98')
(10, 'Vicky', 'Yellow Garden 2')
(11, 'Ben', 'Park Lane 38')
(12, 'William', 'Central st 954')
(13, 'Chuck', 'Main Road 989')
(14, 'Viola', 'Sideway 1633')
(15, 'Michelle', 'Blue Village')

بنابراین در جدول ما 15 ردیف وجود دارد که اطلاعات آن را در خروجی بالا مشاهده می کنید. اما همانطور که گفتم همیشه مجبور نیستید تمام ردیف ها را برگردانید، بلکه می توانید نام ستون خاصی را مشخص کنید تا ردیف های آن به شما برگشت داده شوند. به طور مثال در کد زیر می خواهیم فقط نام (name) و آدرس (address) مشتریان از جدول customers به ما برگردانده شود، بنابراین:

import mysql.connector

mydb = mysql.connector.connect(
  host="localhost",
  user="myusername",
  passwd="mypassword",
  database="mydatabase"
)

mycursor = mydb.cursor()

mycursor.execute("SELECT name, address FROM customers")

myresult = mycursor.fetchall()

for x in myresult:
  print(x)

خروجی:

('John', 'Highway 21')
('Peter', 'Lowstreet 27')
('Amy', 'Apple st 652')
('Hannah', 'Mountain 21')
('Michael', 'Valley 345')
('Sandy', 'Ocean blvd 2')
('Betty', 'Green Grass 1')
('Richard', 'Sky st 331')
('Susan', 'One way 98')
('Vicky', 'Yellow Garden 2')
('Ben', 'Park Lane 38')
('William', 'Central st 954')
('Chuck', 'Main Road 989')
('Viola', 'Sideway 1633')
('Michelle', 'Blue Village')

ما 3 ستون در جدول customers داشتیم: یکی id کاربران، یکی نام آن ها و دیگری آدرس آن ها. همانطور که در خروجی بالا می بینید دیگر اطلاعات مربوط به id به ما برگردانده نشده است. در مقابل متد fetchall متد دیگری به نام fetchone داریم که تنها یک ردیف را برمی گرداند. حتی اگر نتایج برگشتی ما ده ها ردیف باشد، fetchone تنها ردیف اول را برمی گرداند:

import mysql.connector

mydb = mysql.connector.connect(
  host="localhost",
  user="myusername",
  passwd="mypassword",
  database="mydatabase"
)

mycursor = mydb.cursor()

mycursor.execute("SELECT * FROM customers")

myresult = mycursor.fetchone()

print(myresult)

خروجی:

(1, 'John', 'Highway 21')

همانطور که می بینید ما تمام ردیف های جدول را برگردانده بودیم (SELECT * FROM customers) اما fetchone فقط اولین ردیف از مجموعه نتایج را به ما برگردانده است. در قسمت بعد به سراغ دستورات بیشتری در رابطه با MySQL و پایتون می رویم و آن ها را اجرا خواهیم کرد.

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

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