در اکثر برنامهها باید دادههایی را ذخیره و بازیابی کنیم. معمولاً این کار را با پایگاه داده یا دیتابیس انجام میدهیم. یادگیری کار با دیتابیس در هر زبانی از جمله پایتون بسیار مهم و برای ایدههای ما راهگشاست. در این آموزش نحوه کار با دیتابیس MySQL در پایتون را یاد میگیریم. در انتها نیز چند دیتابیس معروف جایگزین را معرفی میکنم.
هنگام کار با دیتابیس (database) چهار عملیات اصلی داریم: ساختن (Create)، خواندن (Read)، بهروزرسانی (Update) و حذف (Delete). حروف اول این کلمات کنار هم اصطلاح CRUD را ایجاد کرده است. پس اگر جایی «CRUD در پایتون» به گوشتان خورد منظور همین کار کردن با دیتابیس است.
روند کلیِ کار با پایگاه داده را در ۳ گام خلاصه میکنم:
- اتصال به پایگاه داده
- انجام عملیات
- قطع ارتباط
ابتدا نیازمندیهای MySQL را بررسی کرده و سپس با آن کار میکنیم. اگر میخواهید با دیتابیس دیگری کار کنید، در انتهای آموزش چند دیتابیس معروف و خوب را معرفی کردهام.
فهرست محتوای آموزش
نیازمندهای کار با دیتابیس mysql در پایتون
پیش از هر چیزی باید یک سرور MySQL در اختیار داشته باشیم. روشهای متفاوتی برای دسترسی یا نصب آن وجود دارد:
- از نرمافزارهای هاست مجازی مثل xampp استفاده کنید. (آموزش نصب زمپ)
- بستهٔ نصبی را مستقیماً از mysql.com دریافت کرده و نصب کنید. یا اگر روی لینوکس هستید، سرویس آن را نصب و تنظیم کنید.
- از سرور جداگانه برای میزبانی پایگاه داده استفاده کنید. (اگر نمیدانید این مورد چیست، فعلاً بیخیالش شوید!
حالا باید درایور (driver) و ماژولی برای ارتباط با mysql را نصب کنیم. اکثراً از ماژول MySQL Connector (در گیت هاب) استفاده میکنند. در این آموزش هم از همین ماژول کمک میگیریم.
برای نصب از pip پایتون استفاده میکنم. اگر pip در سیستمتان تعریف شده، هر دو دستور و در غیر اینصورت از دستور دوم میتوانید استفاده کنید:
pip install mysql-connector-python
python -m pip install mysql-connector-python
حالا بریم سراغ استفاده از آن…
کار با دیتابیس MySQL در پایتون
در ابتدا، باید این ماژول را وارد برنامه کنیم. من علاوه بر import کردن، یک اسم مستعارِ کوتاهتر در نظر گرفتم. اگر با این ساختار آشنا نیستید، دیدن جلسهی ماژول در پایتون را به شما پیشنهاد میکنم.
import mysql.connector as mysql
پیش از ادامه، اگر با ساختار استفاده از دیتابیس آشنا نیستید یک توضیح کوتاه میدهم. ما یک سرور (بهنوعی مدیریتکنندهٔ دادهها) داریم. در این سرور، میتوانیم چندین دیتابیس داشته باشیم. هر دیتابیس معمولاً برای یک برنامه یا بخشی از برنامههای بزرگتر است. مثلاً برای یک سایت خبری، در حالت عادی یک دیتابیس ایجاد میکنیم.
در دیتابیسهای رابطهای (مثل MySQL)، درون هر دیتابیس چند جدول وجود دارد. دقیقاً مشابه جداولی که میشناسیم، هر جدول شامل دو بخش کلی است:
- تعدادی ستون (ویژگیهای دادهها)
- صفر یا چند سطر از دادهها (اطلاعاتی که ذخیره و بازیابی میکنیم.)
اکنون باید به سرور پایگاه داده MySQL وصل شویم. برای این کار از متد connect()
استفاده میکنم. معمولاً به ۲ حالت عملیات اتصال را انجام میدهیم.
اولین حالت، اتصال به سرور است. اگر در سرور خود هنوز دیتابیسی (database مربوط به برنامهتان و نه جداول آن) را نساختهاید، این روش را استفاده کنید.
db = mysql.connect(
host = "localhost",
user = "username",
password = "pass"
)
سه آرگومان ورودی عبارتاند از: (اگر با ساختار توابع و استفاده از آنها آشنا نیستید، جلسه تابع در پایتون را ببینید.)
- آدرس سرور MySQL (اگر روی همان سرور کار میکنید localhost یا 127.0.0.1 و در غیر اینصورت آدرس سرور را وارد کنید)
- نام کاربری اتصال به دیتابیس
- رمز عبور دیتابیس
در بخش اجرای دستورات یاد میگیریم چطور دستور ساخت دیتابیس را اجرا کنیم.
اتصال به پایگاه داده با پایتون
دومین حالت زمانی استفاده میشود که میخواهیم به دیتابیس موردنظرمان وصل شویم.
db = mysql.connect(
host = "localhost",
user = "username",
password = "pass"
database = "python_test"
)
آرگومان چهارم که در این دستور اضافه شده، نام دیتابیس است.
معمولاً در ابتدای کار، مشابه دستور قبلی تلاش میکنیم اگر دیتابیسی وجود ندارد آن را ایجاد کنیم. بعد از آن برای کار با دیتابیس در پایتون همیشه از حالت بالایی استفاده کرده و مستقیماً به پایگاه داده [تعریف پایگاه داده] متصل میشویم.
اجرای دستورات MySQL
از این مرحله به بعد، کارهای اصلیای که در کار با دیتابیس با پایتون انجام میدهیم را گام به گام یاد میگیریم. برای اجرای هر دستور، سه قدم داریم:
- ایجاد یک اشارهگر (cursor)
- نوشتن و اجرای دستور SQL
- قطع ارتباط با دیتابیس
فرض کنید هنوز دیتابیسی ایجاد نکردهایم. بنابراین باید ابتدا به سرور متصل و سپس دستور SQL مربوط به ایجاد دیتابیس را اجرا کنیم. به کد زیر توجه کنید:
import mysql.connector as mysql
db = mysql.connect(
host = "localhost",
user = "username",
password = "pass"
)
cursor = db.cursor()
cursor.execute("CREATE DATABASE python_test")
db.close()
در این قطعه کد، بعد از اتصال، با صدا زدن متد cursor()
روی شیء db
اشارهگر خودمان را ایجاد کردیم. سپس با دستور execute()
دستور SQL (اصطلاحاً کوئری SQL) موردنظرمان را اجرا کردیم. در نهایت ارتباطمان با دیتابیس را قطع کردیم. (اگر نمیدانید شیء چیست، احتمالاً آموزش اصول برنامهنویسی شیء گرا برایتان کاربردی باشد.)
اگر بعد از اجرای کوئری، هنوز هم میخواهید با دیتابیس در پایتون کار کنید، نیازی به بستن ارتباط نیست. دستور close()
را زمانی استفاده کنید که کارتان با دیتابیس تمام شده است؛ شاید انتهای برنامه!
حالا که دیتابیس ایجاد شد، باید جدولِ دادههایمان را ایجاد کنیم. بنابراین کدی شبیه زیر مینویسم:
import mysql.connector as mysql
db = mysql.connect(
host = "localhost",
user = "username",
password = "pass"
database = "python_test"
)
cursor = db.cursor()
cursor.execute("CREATE TABLE IF NOT EXISTS students (id INT AUTO_INCREMENT, name VARCHAR(255), course VARCGAR(255))")
db.close()
در اینجا، بررسی کردیم اگر جدولی به نام students وجود نداشت، یک جدول با سه ستونِ شناسه (id)، نام (name) و درس (course) ایجاد کند. مقدار id بهصورت عددی با افزایش خودکار و دو ستون دیگر بهصورت رشته متنی در نظر گرفتم.
برای کار کردن با دیتابیس در هر زبانی از جمله python، باید از کوئریهای زبان SQL استفاده کنید. اگر با این زبان آشنا نیستید و میخواهید مستقیماً با دیتابیس کار کنید، پیشنهاد میکنم این زبان ساده را آموزش ببینید. البته نیاز نیست دستورات را حفظ کنید، همینکه بدانید چه امکاناتی دارید و برایش جستجو کنید کافی است!
افزودن داده به دیتابیس
برای افزودن داده به جدول دیتابیس خود با پایتون، مشابهاً باید یک دستور SQL بنویسیم. برای افزودن از دستور INSERT در SQL استفاده میکنم:
sql = "INSERT INTO students (name, course) VALUSE ('Omid', 'python')"
کافی است این کوئری را در دیتابیس اجرا کنیم.
cursor.execute(sql)
db.commit()
نکته مهم: اگر کوئری ما تغییری در دادههای دیتابیس ایجاد میکند (مثل همین افزودن)، حتماً باید تغییرات را ثبت (اصطلاحاً commit) کنیم. برای این کار از متد commit()
در شیٔ db
استفاده میکنم.
اکثراً دادههایی که میخواهیم در دیتابیس ذخیره کنیم در یک متغیر دیگر وجود دارند و کمتر پیش میآید که آنها را مستقیماً در کوئری بنویسیم. در قطعه کد زیر، نام و اسم درس را به صورت یک تاپل یا tuple پایتون به تابع execute()
دادهام تا اجرا شود.
sql = "INSERT INTO students (name, course) VALUSE (%s, %s)"
valuues = ("Fateme", "python")
cursor.execute(sql, values)
db.commit()
در کوئری sql از %s
برای مشخص کردن متغیر و نوع آن (s = string یا رشته در پایتون) استفاده میکنیم.
برای سادگی خوانایی کدها، از اینجا به بعد دستورات import، اتصال به دیتابیس، ایجاد cursor و در انتها close را نمینویسم.
افزودن چند سطر به MySQL با پایتون
گاهی لازم است چندین داده (سطر) را به جدول اضافه کنیم. در این حالت از موارد زیر استفاده میکنیم:
- لیستی از تاپلها برای متغیر دادهها
- متد
executemany()
برای اجرای کوئری
دستور SQL و نحوه فراخوانی تابع و متغیرها مشابه قبل است، صرفاً باید از متد executemany()
استفاده کنیم:
sql = "INSERT INTO students (name, course) VALUSE (%s, %s)"
students = [("Ehsan", "GIT & GITHub"),
("Ghazal", "PHP"),
("Reyhane", "python"),
("Iman", "WP Dev")]
cursor.executemany(sql, students)
db.commit()
دو ویژگی کاربردی cursor
گاهی بعد از افزودن داده به دیتابیس با پایتون لازم داریم بدانیم چند سطر به جدول اضافه شده، یا مثلاً شناسه (id) آخرین سطر چقدر است؟ بعد از commit کردن میتوانیم از ویژگیهای شیء cursor استفاده کنیم.
دور مورد از کاربردیترین ویژگیها را در جدول زیر میبینید:
rowcount | تعداد سطرهای اضافهشده |
lastrowid | شناسهٔ آخرین سطرِ اضافهشده |
مثلاً بعد از اجرای قطعه کد بالا (افزودن چند داده و commit()
آن) میتوانم این مقداری را چاپ کنم:
print(cursor.rowcount, "Record Inserted!")
print("Last ID is: ", cursor.lastrowid)
خواندن دادهها از دیتابیس با python
برای خواندن دادهها از جدول از دستور SELECT در SQL استفاده کرده و برای مشاهدهٔ نتایج از متد fetchall()
روی cursor استفاده میکنیم.
sql = "SELECT * FROM students"
cursor.execute(sql)
result = cursor.fetchall()
اکنون میتوانیم با حلقه for در پایتون روی نتایج حرکت کرده و دادههایی که از دیتابیس خواندیم را پردازش کنیم. در اینجا من صرفاً آنها را چاپ میکنم:
for item in result:
print(item)
خروجیِ ما چیزی شبیه زیر میشود:
با fetchall()
همهٔ سطرها در متغیر result قرار داده شد. گاهی میخواهیم این کار را سطر به سطر انجام دهیم. برای خواندن یک سطر از نتایج از fetchone()
استفاده میکنیم:
sql = "SELECT * FROM students"
cursor.execute(sql)
result = cursor.fetchone()
print(result)
# output: (1, "Omid", "python")
البته اگر میخواهید صرفاً یک سطر یا یک فرد خاص را از دیتابیس بخوانید، بهتر است بهجای SELECT *
از شرطهای WHERE یا LIMIT در SQL کمک بگیرید.
در بهروزرسانی بعدی (وسط مرداد ۱۴۰۱)، کوئریهای خاصتر را بهعنوان مثال بیشتر اضافه میکنم.
مرور کار با دیتابیس در پایتون
در این آموزش با نحوه اتصال و کار با دیتابیس MySQL در پایتون آشنا شدیم. فهمیدیم که ابتدا باید یک سرور MySQL داشته باشیم؛ ممکن است این سرور روی سیستم محلی نصب شده باشد یا روی یک سرور دیگر در شبکه یا اینترنت باشد.
سپس با نصب درایور آن و ماژول mysql.connector میتوانیم از متدها و ویژگیهای لازم استفاده کنیم. (بیشتر بیاموزید: ماژول پایتون)
در ابتدای کارمان با تابع connect()
به دیتابیس متصل میشدیم. این تابع یک شیء به ما میداد که از آن برای ادامهٔ کار استفاده میکنیم. در انتها نیز همیشه بهتر است ارتباطی که باز کردهایم را با متد close()
روی همین شیء ببندیم. بعد از اتصال باید یک cursor ایجاد کنیم.
از تابع execute()
برای اجرای دستورات SQL (همان queryها) استفاده میکردیم. میتوانیم دستور را مستقیماً ورودی دهیم یا همراه با پارامتر متغیر تعریف کنیم.
برای دیدن نتایج اجرای کوئری SELECT نیز از fetchall()
یا fetchone()
استفاده میکنیم.
یادتان باشد، اگر تغییری در دادههای دیتابیس ایجاد کردید، حتماً تغییرات را commit()
کنید، وگرنه تغییراتتان ثبت نمیشود!
چند دیتابیس برای کار در پایتون
ممکن است در پروژههای مختلف بنا به نیازتان بخواهید یا مجبور باشید از دیتابیسهای دیگر غیر از MySQL استفاده کنید. این دیتابیس یک پایگاه دادهٔ رابطهای (RBD) است.
در اینجا ۴ دیتابیس دیگر را معرفی کردم که میتوانید از آن در برنامهنویسی پایتون استفاده کنید:
- PostgreSQL که رابطهای و شیءگراست. (ORDB) همچنین مشابه پایتون cross-platform است.
- SQLlite که دیتابیس محبوبی است و ساختارش دقیقاً شبیه MySQL است.
- MongoDB
- Oracle
امیدوارم از این آموزش استفادهٔ لازم را ببرید. اگر در حال یادگیری پایتون هستید، پیشنهاد میکنم همین الآن یک دیتابیس ایجاد کرده و چند دستور SQL درون آن اجرا کنید.
اگر با کوئریها آشنا نیستید، میتوانید جستجو کنید یا از کوئریهای همین آموزش الگو بگیرید. همچنین اگر سؤال یا تجربهای دارید، از بخش دیدگاهها مطرح کنید. 🙂
این آموزش بخشی از یک آموزش جامع و قدم به قدم در سبز دانش است: دوره رایگان آموزش پایتون
این آموزش برای همیشه رایگانه! میتونید با اشتراکگذاری لینک این صفحه از ما حمایت کنید یا با خرید یه فنجون نوشیدنی بهمون انرژی بدید!
میخوام یه نوشیدنی مهمونتون کنم
execute و executemany چه فرقی با هم دارند؟
درود
متد
execute()
برای اجرای یک دستور SQL واحد استفاده میشه درحالیکهexecutemany()
برای اجرای یک دستور با چندین داده (چندین رکورد) به کار میره.سلام مطالب عالی و کاربردی بود فقط یه سوال اگه یکی از داده هامون نوعش اعشاری یا عدد صحیح باشه بجای %s از چه استفاده کنیم
و در مورد db.cursor(prepared=True) ممکنه بیشتر توضیح بدید. ممنون
سلام
برای عدد اعشاری میتونید از
%f
استفاده کنید.مورد prepared statement چند تا کاربرد داره. موضوعی که گفتم این بوده که اگر قراره دادهای از کاربر گرفته و بهعنوان بخشی از query اجرا بشه، خوبه که به اینصورت اجراش کنیم. چرا؟ وقتی از حالت prepared استفاده میکنیم، پارامترهایی که بهش پاس داده میشن (همون دادههایی که باید در کوئری جایگزین بشه) حتماً به عنوان یک مقدار در کوئری قرار میگیرند. یک نوع مشکل امنیتی به نام sql injection هست که به جای اینکه کاربر مقدار hello رو بده، میاد و یه کوئری sql مینویسه. شما اگه دقیقاً همین چیزی که نوشته (کوئری اون فرد) رو جایگزین و در دیتابیس اجراش کنید، در حقیقت کوئری اون فرد رو اجرا کردید و به هدفِ نادرستش رسیده.
اما در حالت prepared میاد کاراکترها و دستورهایی که شبیه به sql هستن رو خنثی میکنه که این اتفاق نیوفته.
ممنون بخاطر راهنمایی
خوشحالیم برات کاربردی بوده سینای عزیز
چطوری در
()execute
یک ورودی از کار بر بگیریم مثلا ورودی شماره id باشد که عدد 3 است من این ورودی رو چطور قرار بدهم در متغییر sql که یک رشته استمیتونید مقدار ورودی رو از کاربر بگیرید و در قالب یک تاپل بهعنوان پارامتر دوم (values) بهش بدید.
فقط حواستون باشه، برای امنیت بیشتر، بهتره وقتی قراره دیتایی که مستقیم از کاربر میگیرید رو در دیتابیس اجرا کنید از روش prepared استفاده بشه. فقط کافیه cursor رو به صورت زیر ایجاد کنید:
سلام چطور چند تا عکس را در سایت به صورت شناور قرار دهیم ؟
سلام
منظورتون از شناور چیه؟ اگه ظاهریه احتمال زیاد باید با css چیدمان رو طراحی کنید.
منظور همون جاهایی که برای نوشتن کاممند های طولانی استفاده کردید.
باکسهای کد رو میگید؟ باید ویژگی overflow رو تنظیم کنید.