همانطور که گفتیم پایتون می تواند با برنامه های پایگاه داده کار کند اما ممکن است نخواهید از برنامه هایی مانند MySQL استفاده کنید، بلکه برنامه هایی مانند MongoDB مد نظر شما باشند. MongoDB یکی از مشهورترین برنامه های پایگاه داده ی NoSQL است. در واقع پایگاه های داده ی SQL همگی دارای جدول هایی هستند و این جدول ها با یکدیگر روابط مشخص دارند اما پایگاه های داده ی NoSQL مدل های دیگری به غیر از مدل جدولی SQL برای دریافت و ذخیره ی داده ها دارند. میتوان از مشهورترین پایگاه های داده ی NoSQL به موارد زیر اشاره کرد:
پایگاه داده ی MongoDB داده ها را در قالب هایی شبیه قالب JSON ذخیره می کند، به همین دلیل بسیار منعطف و مقیاس پذیر است. اگر می خواهید کدهای دوره را به صورت عملی امتحان کنید نیاز به نصب MongoDB خواهید داشت؛ برای نصب آن به این لینک مراجعه کنید: https://www.mongodb.com
زبان پایتون برای کار با پایگاه داده ی MogoDB به یک درایور نیاز دارد و ما تصمیم گرفتیم در این دوره از درایور PyMongo استفاده کنیم. بهتر است برای جلوگیری از ایجاد مشکلات مختلف از PIP برای نصب PyMongo استفاده کنید:
C:\Users\Your Name\AppData\Local\Programs\Python\Python36-32\Scripts>python -m pip install pymongo
پس از اجرای دستور بالا برای نصب PyMongo باید تست کنیم تا مطمئن شویم PyMongo به درستی نصب شده است. برای انجام این کار یک فایل تست پایتون (مثلا به نام demo_mongodb_test.py) ایجاد کنید و دستور زیر را در آن قرار دهید:
import pymongo
اگر هیچ اتفاقی نیفتاد و هیچ خطایی ندیدید یعنی درایور به صورت کامل نصب شده است.
برای ساخت یک پایگاه داده در MongoDB باید ابتدا شیء MongoClient را ایجاد کنید، سپس URL اتصال را به همراه ip و نام پایگاه داده به آن پاس می دهید. اگر چنین پایگاه داده ای از قبل وجود نداشته باشد MongoDB آن را ساخته و یک اتصال با آن برقرار می کند. برای مثال در کد زیر یک پایگاه داده به نام mydatabase ساخته ایم:
import pymongo myclient = pymongo.MongoClient('mongodb://localhost:27017/') mydb = myclient['mydatabase']
نکته: لطفا توجه داشته باشید که MongoDB صبر می کند تا document در collection شما دریافت شود و سپس آن پایگاه داده را می سازد. به عبارت دیگر در MongoDB تا زمانی که محتوایی دریافت نشود، هیچ collection یا پایگاه داده ای ساخته نخواهد شد و collection خالی هیچ معنایی ندارد. در MongoDB مفهوم collection
معادل جدول (table) و document معادل ردیف (record) می باشد.
اگر می خواهید لیست پایگاه های داده ی موجود در سیستم را مشاهده کنید، می توانید از متد list_database_names استفاده کنید:
import pymongo myclient = pymongo.MongoClient('mongodb://localhost:27017/') print(myclient.list_database_names())
خروجی:
['admin', 'local', 'mydatabase']
البته اگر به دنبال پایگاه داده ی خاصی می گردید، می توانید نام آن را نیز جستجو کنید:
import pymongo myclient = pymongo.MongoClient('mongodb://localhost:27017/') dblist = myclient.list_database_names() if "mydatabase" in dblist: print("The database exists.")
خروجی:
The database exists.
هشدار: همانطور که در نکته ی بالا گفتیم، در MogoDB تا زمانی که محتوایی (منظور هر نوع داده ای برای قرار گرفتن در پایگاه داده است) دریافت نشود آن پایگاه داده ساخته نخواهد شد. بنابراین اگر دفعه ی اولی است که پایگاه داده می سازید و هنوز داده ای در آن ندارید (حتی اگر شیء MongoClient را ایجاد کرده باشید) پایگاه داده ی شما در سیستم ثبت نخواهد شد و جستجوی آن با دستورات بالا نتیجه ای به همراه نخواهد داشت.
همانطور که گفتیم کالکشن (Collection) معادل جدول یا همان table در پایگاه های داده ی SQL است. برای ساخت کالکشن ها باید از شیء پایگاه داده استفاده کرده و نام کالکشن را انتخاب کنید. در صورتی که collection مورد نظر شما از قبل وجود نداشته باشد توسط MongoDB ساخته خواهد شد. فرض کنید بخواهیم collection ای به نام customers بسازیم، در این صورت:
import pymongo myclient = pymongo.MongoClient('mongodb://localhost:27017/') mydb = myclient['mydatabase'] mycol = mydb["customers"]
با اجرای این دستور کار ما تمام می شود اما یادتان باشد که هنوز این collection ساخته نشده است. MongoDB منتظر می ماند تا شما document ای را وارد این کالکشن کنید.
همانطور که می توانستیم وجود پایگاه های داده ی مختلف را چک کنیم، می توانیم وجود کالکشن های مختلف را نیز بررسی کنیم. به طور مثال دستور list_collection_names تمام کالکشن های ما را برایمان لیست می کند:
import pymongo myclient = pymongo.MongoClient('mongodb://localhost:27017/') mydb = myclient['mydatabase'] mycol = mydb["customers"] print(mydb.list_collection_names())
خروجی:
['customers']
و یا اینکه می توانید به جای لیست کردن تمامی کالکشن ها، به دنبال کالکشن خاصی بگردید:
import pymongo myclient = pymongo.MongoClient('mongodb://localhost:27017/') mydb = myclient['mydatabase'] collist = mydb.list_collection_names() if "customers" in collist: print("The collection exists.")
خروجی:
The collection exists.
توجه داشته باشید؛ تا زمانی که داده ای (document) در این کالکشن ها ثبت نشود، کالکشن مورد نظر ایجاد نخواهد شد. بنابراین در لیست کالکشن ها (مثال های بالا) نیز وجود نخواهد داشت.
همانطور که گفتیم document ها معادل همان ردیف ها (record) در پایگاه های داده ی SQL هستند. برای ثبت داده های جدید یا Document درون کالکشن ها باید از متد ()insert_one
استفاده کنید؛ آرگومان اول این تابع یک dictionary است که name و value های فیلدهای مورد نظر را در خود دارد. در کد زیر می خواهیم یک document را وارد کالکشن customers کنیم:
import pymongo myclient = pymongo.MongoClient('mongodb://localhost:27017/') mydb = myclient['mydatabase'] mycol = mydb["customers"] mydict = { "name": "John", "address": "Highway 37" } x = mycol.insert_one(mydict) print(x)
خروجی:
<pymongo.results.InsertOneResult object at 0x03D62918>
زمانی که متد ()insert_one
اجرا می شود یک شیء به نام InsertOneResult برمی گرداند که حاوی خصوصیتی به نام inserted_id
است. این خصوصیت id document ثبت شده را دارد:
import pymongo myclient = pymongo.MongoClient('mongodb://localhost:27017/') mydb = myclient['mydatabase'] mycol = mydb["customers"] mydict = { "name": "Peter", "address": "Lowstreet 27" } x = mycol.insert_one(mydict) print(x.inserted_id)
خروجی:
5b1910482ddb101b7042fcd7
اگر برای فیلد id_
مقداری در نظر نگیرید، MongoDB به صورت خودکار یک مقدار یکتا و غیرتکراری را برای id در نظر می گیرد. در مثال بالا هیچ مقداری به id_
ندادیم بنابراین id ما توسط MongoDB تولید شده است.
اگر بخواهید چندین داده (document) را به صورت همزمان وارد کالکشن خود کنید، استفاده از متد ()insert_one
کار سختی خواهد بود. روش بهتر استفاده از ()insert_many
است. آرگومان اول این متد یک list است که خود حاوی dictionary هایی بوده که حاوی تمام موارد مورد نظر شما برای ثبت در کالکشن می باشد. به مثال زیر دقت کنید:
import pymongo myclient = pymongo.MongoClient("mongodb://localhost:27017/") mydb = myclient["mydatabase"] mycol = mydb["customers"] mylist = [ { "name": "Amy", "address": "Apple st 652"}, { "name": "Hannah", "address": "Mountain 21"}, { "name": "Michael", "address": "Valley 345"}, { "name": "Sandy", "address": "Ocean blvd 2"}, { "name": "Betty", "address": "Green Grass 1"}, { "name": "Richard", "address": "Sky st 331"}, { "name": "Susan", "address": "One way 98"}, { "name": "Vicky", "address": "Yellow Garden 2"}, { "name": "Ben", "address": "Park Lane 38"}, { "name": "William", "address": "Central st 954"}, { "name": "Chuck", "address": "Main Road 989"}, { "name": "Viola", "address": "Sideway 1633"} ] x = mycol.insert_many(mylist) #print list of the _id values of the inserted documents: print(x.inserted_ids)
خروجی:
[ObjectId('5b19112f2ddb101964065487'), ObjectId('5b19112f2ddb101964065488'), ObjectId('5b19112f2ddb101964065489'), ObjectId('5b19112f2ddb10196406548a'), ObjectId('5b19112f2ddb10196406548b'), ObjectId('5b19112f2ddb10196406548c'), ObjectId('5b19112f2ddb10196406548d'), ObjectId('5b19112f2ddb10196406548e'), ObjectId('5b19112f2ddb10196406548f'), ObjectId('5b19112f2ddb101964065490'), ObjectId('5b19112f2ddb101964065491'), ObjectId('5b19112f2ddb101964065492')]
این خروجی ها id داده هایی است که در کالکشن خودمان ذخیره کرده ایم. در واقع متد ()insert_many
پس از اجرا شیء ای به نام InsertManyResult برمی گرداند که حاوی id های ثبت شده در کالکشن است.
نکته: اگر دوست ندارید که MongoDB به صورت خودکار برایتان id ها را اضافه کند باید خودتان به صورت دستی id ها را بنویسید. یادتان باشد که id ها باید یکتا و غیرتکراری باشند و هیچ دو document ای نمی توانند یک id یکسان داشته باشند.
import pymongo myclient = pymongo.MongoClient("mongodb://localhost:27017/") mydb = myclient["mydatabase"] mycol = mydb["customers"] mylist = [ { "_id": 1, "name": "John", "address": "Highway 37"}, { "_id": 2, "name": "Peter", "address": "Lowstreet 27"}, { "_id": 3, "name": "Amy", "address": "Apple st 652"}, { "_id": 4, "name": "Hannah", "address": "Mountain 21"}, { "_id": 5, "name": "Michael", "address": "Valley 345"}, { "_id": 6, "name": "Sandy", "address": "Ocean blvd 2"}, { "_id": 7, "name": "Betty", "address": "Green Grass 1"}, { "_id": 8, "name": "Richard", "address": "Sky st 331"}, { "_id": 9, "name": "Susan", "address": "One way 98"}, { "_id": 10, "name": "Vicky", "address": "Yellow Garden 2"}, { "_id": 11, "name": "Ben", "address": "Park Lane 38"}, { "_id": 12, "name": "William", "address": "Central st 954"}, { "_id": 13, "name": "Chuck", "address": "Main Road 989"}, { "_id": 14, "name": "Viola", "address": "Sideway 1633"} ] x = mycol.insert_many(mylist) #print a list of the _id values of the inserted documents: print(x.inserted_ids)
خروجی:
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14]
همانطور که می بینید کار با MongoDB آنقدر ها هم تفاوتی با MySQL ندارد و به دلیل وجود اشتراکات بسیار زیاد یادگیری آن در چند جلسه قابل انجام است. در قسمت بعد در رابطه با متدهایی مانند find و اجرای کوئری ها صحبت خواهیم کرد.
در این قسمت، به پرسشهای تخصصی شما دربارهی محتوای مقاله پاسخ داده نمیشود. سوالات خود را اینجا بپرسید.
در این قسمت، به پرسشهای تخصصی شما دربارهی محتوای مقاله پاسخ داده نمیشود. سوالات خود را اینجا بپرسید.