آموزش SQlite در پایتون | گام به گام و به زبان ساده
در این مطلب، آموزش SQlite در پایتون به صورت گام به گام و به زبان ساده ارائه شده است. در آموزش SQlite در پایتون به صورت گام به گام و به زبان ساده، مباحث مختلفی شامل چیستی SQLite، روش ساخت پایگاه داده با استفاده از آن و چگونگی انجام اعمال مختلف در پایگاه داده، مورد بررسی قرار گرفته است.
SQLite چیست؟
در اولین بخش از مطلب آموزش SQlite در پایتون به صورت گام به گام و به زبان ساده به این پرسش پاسخ داده میشود که SQlite چیست؟ SQLite یک کتابخانه نوشته شده به «زبان برنامهنویسی سی» (C Programming Language) است. SQLite یک کتابخانه در جریان است که «موتور پایگاه داده اسکیوال» (SQL Database Engine) کوچک، سریع، «خودمشمول» (Self-Contained)، «بدون سرور» (Serverless)، بدون پیکربندی (زیروکانف | Zero-Configuration) و «تراکنشی» (Transactional) با قابلیت اطمینان بالا و با ویژگیهای کامل محسوب میشود.
SQLite پرکاربردترین موتور پایگاه داده در سراسر جهان است و به صورت توکار در همه تلفنهای موبایل و اغلب کامپیوترها وجود دارد و در بسیاری از برنامههایی که افراد به صورت روزمره از آنها استفاده میکنند نیز وجود دارد. SQLite در بسیاری از پروژههای نرمافزاری شناخته شده و طراز اول جهان استفاده شده است.
کد پیادهسازی SQLite در «مالکیت عموم» (Public Domain) است و بنابراین، استفاده از آن برای هر منظوری شامل استفاده شخصی و تجاری، آزاد است. SQLite یک موتور پایگاه داده SQL توکار است. برخلاف بسیاری از دیگر پایگاه دادههای اسکیوال، SQLite فرایند سرور جداگانهای ندارد. SQLite به طور مستقیم از روی فایلهای دیسک (Disk Files) متداول میخواند و روی آنها مینویسد. یک پایگاه داده کامل SQL با جداول چندگانه، شاخصها، محرکها و نمایشهایی (Views) است که در یک دیسک فایل تنها وجود دارند.
فرمت فایل پایگاه داده، چندسکویی (Cross-Platform) است و کاربر میتواند به صورت آزادانه یک پایگاه داده را بین سیستمهای ۳۲ بیتی یا ۶۴ بیتی و یا بین معماریهای «بیگاِندیَن» (Big-Endian) و «لیتل اِندیَن» (Little-Endian) کپی کند. این ویژگیها موجب شدهاند که SQLite یک انتخاب محبوب باشد. فایلهای پایگاه داده SQLite به وسیله «کتابخانه ملی کنگره آمریکا» (US Library of Congress) نیز توصیه میشوند. نباید به SQLite به عنوان جایگزینی برای «اوراکل» (Oracle) نگریست، اما میتوان آن را به عنوان جایگزینی برای fopen() پنداشت.
SQLite یک کتابخانه فشرده است. با وجود همه ویژگیهای موجود در SQLite، سایز این کتابخانه، بسته به پلتفرم مقصد و تنظیمات بهینهسازی «کامپایلر» (Compiler) میتواند حتی کمتر از ۶۰۰ کیبیبایت (KiB) باشد (کد ۶۴ بیتی بزرگتر است. برخی از بهینهسازیهای کامپایلر مانند درخطسازی تابع به صورت تهاجمی و باز کردن حلقه ممکن است منجر به بزرگتر شدن کد شی شوند). موازنهای بین استفاده از حافظه و سرعت وجود دارد. SQLite میتواند سریعتر از ورودی/خروجی مستقیم فایل سیستم باشد.
SQLite پیش از هر انتشار به خوبی تست میشود و به خاطر قابلیت اطمینانی که دارد بسیار شناخته شده است. بسیاری از کدهای منبع SQLite خالصانه مورد تست و ارزیابی قرار گرفتهاند. یک تست سوئیت (Test Suite) خودکار، شامل صدها میلیون تست کیس (مورد آزمایش | Test Case) از عبارات SQL مجزا میشود و پوشش صد درصدی تست انشعاب را فراهم میکند.
SQLite به خوبی با خطاهای تخصیص حافظه و خطاهای خواندن و نوشتن مواجه میشود و تراکنشهای آن، «اسید» (ACID) هستند. کلمه ACID در واقع سرنامی برای کلمات Isolation ،Consistency ،Atomicity و Durability با معنای تجزیهپذیری، سازگاری، انزوا و پایایی است و در واقع، مجموعهای از تراکنشهای پایگاه داده محسوب میشود که اعتبار دادهها را از جهت خطا، قطعی برق و دیگر مشکلات مشخص میکند. به بیان دقیقتر، تراکنشها در پایگاه داده اسید هستند حتی اگر مشکلات برق به وجود بیاید و یا سیستم خراب شود.
همه این موارد، با انجام تستهای خودکار با استفاده از تست ویژهای که شکستهای سیستم را شبیهسازی میکند، انجام میشود. البته، حتی با انجام همه این تستها، همچنان باگهایی در SQLite وجود دارد. اما برخلاف پروژههای مشابه (به ویژه پروژههای تجاری رقیب SQLite ،(SQLite پیرامون همه باگهای خود صادق است و لیستی از باگها و تغییرات لحظه به لحظه کد را فراهم میکند.
پایگاه کد SQLite به وسیله یک تیم بینالمللی از توسعهدهندگانی پشتیبانی میشود که به طور تمام وقت روی SQLite کار میکنند. توسعهدهندگان تواناییهای SQLite را گسترش و قابلیت اطمینان و کارایی آن را ضمن حفظ سازگاری رو به عقب با مشخصههای نرمافزاری منتشر شده، نحو SQL و فرمت فایل پایگاه داده بهبود میبخشند.
با وجود همه آنچه گفته شد، کد SQLite برای کلیه افرادی که از آن استفاده میکنند کاملا رایگان است؛ هرچند پشتیبانی حرفهای نیز برای آن فراهم است. پروژه SQLite در تاریخ ۲۰۰۰/۰۵/۰۹ آغاز شد. پیشبینی آینده این پروژه دشوار است اما توسعهدهندگان این پروژه قصد دارند که آن را تا سال ۲۰۵۰ پشتیبانی کنند. در بخش بعدی از مطلب آموزش SQlite در پایتون به صورت گام به گام و به زبان ساده به این پرسش پاسخ داده خواهد شد که SQLite از چه زبانهای برنامهنویسی پشتیبانی میکند.
SQLite از چه زبانهای برنامهنویسی پشتیبانی میکند؟
SQLite از گستره وسیعی از زبانهای برنامهنویسی شامل «پایتون» (Python)، «آر» (R)، «جاوا» (Java)، «جاوااسکریپت» (JavaScript) و دیگر موارد پشتیبانی میکند. فهرست کاملتری از زبانهایی که SQLite از آنها پشتیبانی میکند در ادامه آمده است.
- بیسیک (Basic)
- سی (C)
- سیشارپ (C#)
- سیپلاسپلاس (C++)
- دلفی (Delphi)
- گو (Go)
- هسکل (Haskell)
- جولیا (Julia)
- لیسپ (Lisp)
- متلب (MATLAB)
- آبجکتیو سی (Objective-C)
- پاسکال (Pascal)
- پیاچپی (PHP)
- روبی (Ruby)
- راست (Rust)
- اسمالتاک (Small Talk)
- سوئیفت (Swift)
آموزش SQlite در پایتون | گام به گام و به زبان ساده
SQL و پایتون به سرعت به مهارتهای کلیدی برای افرادی که به «تحلیل داده» (Data Analysis) مشغول هستند مبدل شدهاند. در این بخش از مطلب آموزش SQlite در پایتون چگونگی راهاندازی SQlite در پایتون و استفاده از آن آموزش داده شده است.
مباحثی که در این بخش آموزش داده شدهاند عبارتند از:
- بارگذاری کتابخانه
- ساخت پایگاه داده و اتصال به آن
- ساخت جداول پایگاه داده
- افزودن دادهها
- کوئری زدن در دادهها
- حذف دادهها
SQLite3 که در این متن به اختصار به آن SQLite گفته میشود، بخشی از بسته استاندارد پایتون ۳ (Python 3) است. بنابراین، در صورت نصب داشتن بسته پایتون ۳، نیازی به نصب چیزی نیست. کاربرانی که پایتون ۳ را روی سیستم خود نصب ندارند، میتوانند با توجه به نوع سیستمعاملی که روی سیستم خود نصب دارند، از مطالب زیر برای فراگیری چگونگی نصب آن، استفاده کنند.
- نصب پایتون — از صفر تا صد
- آموزش نصب پایتون در ویندوز | گام به گام و تصویری — از صفر تا صد
- نصب پایتون در لینوکس — از صفر تا صد
- نصب پایتون در مک — از صفر تا صد
پس از مطالعه مطلب آموزش SQlite در پایتون به صورت گام به گام و به زبان ساده کاربر قادر خواهد بود که یک پایگاه داده را در SQLite با استفاده از پایتون بسازد. این راهنما همه گامهای لازم برای ساخت یک پایگاه داده SQlite را که جدول زیر را همراه کلیه روابط آن پوشش دهد به کاربر میآموزد.
شایان توجه است که علاقهمندان به یادگیری کوئریهای مختلف MySQL، میتوانند از مطالب زیر استفاده کنند.
- کوئری DELETE در MySQL — راهنمای جامع
- کوئری SELECT در MySQL — راهنمای جامع
- کوئری INSERT در MySQL — راهنمای جامع
انواع داده موجود در SQlite برای پایتون
SQlite برای پایتون، «انواع داده» (Data Types) کمتری را برای پایتون نسبت به دیگر پیادهسازیهای SQL فراهم میکند. این موضوع میتواند کمی محدود کننده باشد. اگرچه، چنانکه در ادامه مطلب آموزش SQlite در پایتون به صورت گام به گام و به زبان ساده مشاهده خواهد شد، SQlite سایر کارها را بسیار سادهتر میکند.
برخی از انواع دادههای موجود برای پایتون در SQlite در ادامه ارائه شده است.
- NULL: شامل مقادیر نال یا هیچ مقدار میشود.
- INTEGER: شامل اعداد صحیح میشود.
- REAL: شامل اعداد اعشاری میشود.
- TEXT: شامل متن میشود.
- BLOB: شامل شی بزرگ دودویی میشود که دقیقا به عنوان ورودی ذخیره میشود.
با مشاهده این لیست، احتمالا توجه بسیاری از افراد به انواع دادهای که وجود ندارند جلب خواهد شد. متاسفانه، هنگام استفاده از SQLite، کاربر به انواع دادهای که بیان شد محدود میشود. در ادامه آموزش SQlite در پایتون به صورت گام به گام و به زبان ساده چگونگی آغاز به کار با SQLite همراه با مثال شرح داده میشود.
آغاز به کار با SQlite در پایتون با مثال
در این بخش از مطلب آموزش SQlite در پایتون به صورت گام به گام و به زبان ساده و در ابتدای مسیر، کتابخانه SQlite بارگذاری میشود.
1import sqlite3
در ادامه، چگونگی ساخت پایگاه داده مورد بررسی قرار خواهد گرفت.
ساخت پایگاه داده SQlite در پایتون
در این بخش از راهنمای آموزش SQlite در پایتون به صورت گام به گام و به زبان ساده راهکارهای گوناگونی که کاربر با استفاده از آنها میتواند یک پایگاه داده را در پایتون بسازد مورد بررسی قرار خواهند گرفت. به منظور انجام این کار، کاربر یک شی اتصال (Connection Object) را میسازد که پایگاه داده را نمایش میدهد.
این تابع با استفاده از تابع connect() در SQLite ساخته میشود. در ادامه، ابتدا یک فایل db. ساخته میشود؛ زیرا این یک راه کاملا استاندارد برای نگهداری یک پایگاه داده SQLite محسوب میشود. اتصال با استفاده از متغیری به نام conn ساخته میشود. در ادامه، فایلی با عنوان orders.db ساخته میشود.
1conn = sqlite3.connect('orders.db')
با این خط کد، یک شی اتصال جدید همراه با یک فایل جدید با عنوان orders.db در پوشه کاری کاربر ساخته میشود. در صورت تمایل کاربر به تعیین یک پوشه مشخص، میتواند از دستور زیر استفاده کند.
1conn = sqlite3.connect(r'PATH-TO-YOUR-DIRECTORY/orders.db')
در صورتی که فایل موجود باشد، تابع connect به سادگی به آن فایل متصل میشود.
تذکر: باید توجه داشت که از حرف r پیش از رشتهای که حاوی این مسیر است استفاده شده است. این امر موجب میشود پایتون بداند که کاربر با یک رشته خام کار میکند؛ بدین معنا که «/» برای فرار از کاراکترها مورد استفاده قرار نمیگیرد. تابع connect اتصالاتی را به این پایگاه داده SQLite میسازد و یک شی را برای ارائه آن بازمیگرداند.
پایگاه داده در حافظه
راهکار دیگری برای تولید پایگاه دادهها با استفاده از SQLite در پایتون، ساخت آنها به صورت in memory است. این راهکار خیلی خوبی برای ساخت پایگاه دادهای است که برای اهداف تست کردن مورد استفاده قرار میگیرد؛ زیرا که تنها در رم (RAM) وجود دارد.
1conn = sqlite3.connect(:memory:)
اگرچه، برای هدفی که در مطلب آموزش SQlite در پایتون به صورت گام به گام و به زبان ساده دنبال میشود و برای اغلب بررسیهای موردی (Use Case) که کاربران انجام میدهند، از متدی که پیشتر بیان شد استفاده میشود.
ساخت شی مکاننما
اکنون که یک شی اتصال پایگاه داده ساخته شد، کار بعدی ساخت یک شی مکاننما یا کرسر (Cursor) است. یک شی Cursor به کاربر امکان اجرای کوئریهای (پرسش و پاسخهای) SQL را در یک پایگاه داده میدهد.
در ادامه، یک متغیر cur به منظور نگه داشتن شی Cursor ساخته میشود.
1cur = conn.cursor()
اکنون که یک شی کرسر (cursor) ساخته شد، از آن برای اجرای کوئریهای SQL به صورت زیر استفاده میشود.
1cur.execute("YOUR-SQL-QUERY-HERE;")
ساخت جدول در SQLite برای پایتون
در این گام از آموزش SQlite در پایتون به صورت گام به گام و به زبان ساده، اولین جدول با استفاده از SQLite در پایتون ساخته میشود. اکنون که شی اتصال (conn) و یک شی کرسر (cur) موجود است، اولین جدول ساخته میشود.
آنچه در ادامه آمده است، شمای پایگاه دادهای است که پیش از این نمایش داده شد.
کار ساخت پایگاه داده با جدول users ادامه پیدا خواهد کرد.
1cur.execute("""CREATE TABLE IF NOT EXISTS users(
2 userid INT PRIMARY KEY,
3 fname TEXT,
4 lname TEXT,
5 gender TEXT);
6""")
7conn.commit()
در کد بالا، کارهایی انجام شده است که در ادامه به طور کامل مورد بررسی قرار میگیرد.
- تابع execute روی شی cursor برای اجرای (Execute) یک کوئری اسکیوال (SQL) استفاده میشود.
- از SQL برای ساخت جدولی استفاده میشود که users نامیده میشود.
- IF NOT EXISTS برای اتصال مجدد به پایگاه داده کمک میکند. کوئری (پرسش و پاسخ) به کاربر این امکان را میدهد تا بررسی کند که آیا جدول موجود است یا خیر و اگر جدول وجود دارد، هیچ چیز تغییر نمیکند.
- چهار ستون با اسامی lname ،fname ،userid و gender ساخته میشوند. userid برای آنکه کلید اولیه باشد تخصیص پیدا کرده است.
- تغییرات با استفاده از تابع commit، روی شی اتصال (connection) اعمال میشوند.
برای ساخت جدول، میتوان الگوی مشابهی را دنبال کرد و دستورات زیر را نوشت.
1cur.execute("""CREATE TABLE IF NOT EXISTS orders(
2 orderid INT PRIMARY KEY,
3 date TEXT,
4 userid TEXT,
5 total TEXT);
6""")
7conn.commit()
پس از اجرای این دو اسکریپت، پایگاه داده دارای دو جدول خواهد بود. اکنون زمان اضافه کردن دادهها رسیده است.
افزودن دادههای جدید با SQLite در پایتون
در ادامه آموزش SQlite در پایتون به صورت گام به گام و به زبان ساده نگاهی خواهیم داشت به چگونگی اضافه کردن دادهها با SQLite در پایتون به پایگاه دادهای که پیش از این ساخته شده است.
به طور مشابه با کوئری ساخت پایگاه داده، کوئری اضافه کردن دادهها از شی کرسر (cursor object) برای اجرای کوئری استفاده میکند.
1cur.execute("""INSERT INTO users(userid, fname, lname, gender)
2 VALUES('00001', 'Nik', 'Piepenbreier', 'male');""")
3conn.commit()
اغلب، هنگام کار با پایتون از متغیرهایی استفاده میشود که حاوی مقادیری برای کاربر هستند. برای مثال، ممکن است تاپلهایی وجود داشته باشد که حاوی اطلاعاتی پیرامون کاربر باشند. این تاپلها چیزی شبیه آنچه در زیر نمایش داده شده است هستند.
1user = ('00002', 'Lois', 'Lane', 'Female')
در صورتی که کاربر تمایل به بارگذاری دادهها در پایگاه داده داشته باشد، از قرارداد (Convention) دیگری استفاده میشود.
1cur.execute("INSERT INTO users VALUES(?, ?, ?, ?);", user)
2conn.commit()
آنچه در اینجا انجام شده است همه مقادیر را با علامت سوال جایگزین میکند و یک پارامتر اضافی را که حاوی همه مقادیری است که تمایل به اضافه کردن آنها وجود دارد، اضافه میکند. شایان ذکر است که SQLite انتظار دارد که مقادیر در فرمت «تاپل» (Tuple) باشند. اگرچه، تا هنگامی که مقادیر لیست تاپلها هستند، متغیرها میتوانند حاوی یک لیست باشند.
برای مثال، میتوان کاربران بیشتری را با استفاده از متغیرها اضافه کرد.
1more_users = [('00003', 'Peter', 'Parker', 'Male'), ('00004', 'Bruce', 'Wayne', 'male')]
در این شرایط، به جای استفاده از تابع execute، از تابع عملکرد اجرایی استفاده میشود.
1cur.executemany("INSERT INTO users VALUES(?, ?, ?, ?);", more_users)
2conn.commit()
اگر در اینجا از تابع execute روی شی کرسر استفاده شده باشد، تابع فرض میکند که کاربر دو عنصر را به طور مستقیم به جدول پاس میدهد (دو تاپل)، به جای آنکه دو مجموعه را که هر یک چهار عنصر دارند پاس بدهد. خوشبختانه، تابع در این نمونه با شکست مواجه میشود، اما باید دقت کرد که از کدام تابع استفاده شده است.
SQLite و جلوگیری از حملات تزریقی
استفاده از متد (?, ?, …) که در بالا به آن اشاره شد، به کاربر کمک میکند تا از حملات تزریق SQL اجتناب کند. به همین دلیل، توصیه میشود تا از این متد بر فراز متدی که پیشتر بیان شد استفاده شود. تایپ کردن این متد نیز سادهتر از آنچه است که پیش از این بیان شد.
اسکریپتهایی برای بارگذاری دادههای بیشتر
در ادامه دادههای بیشتری برای معنادارتر کردن بخشهای آتی بارگذاری میشوند. آنچه در زیر آمده است اسکریپتهایی هستند که میتوان از آنها برای درج برخی از دادههای نمونه در هر دو جدول استفاده کرد.
customers = [('00005', 'Stephanie', 'Stewart', 'female'), ('00006', 'Sincere', 'Sherman', 'female'), ('00007', 'Sidney', 'Horn', 'male'), ('00008', 'Litzy', 'Yates', 'female'), ('00009', 'Jaxon', 'Mills', 'male'), ('00010', 'Paul', 'Richard', 'male'), ('00011', 'Kamari', 'Holden', 'female'), ('00012', 'Gaige', 'Summers', 'female'), ('00013', 'Andrea', 'Snow', 'female'), ('00014', 'Angelica', 'Barnes', 'female'), ('00015', 'Leah', 'Pitts', 'female'), ('00016', 'Dillan', 'Olsen', 'male'), ('00017', 'Joe', 'Walsh', 'male'), ('00018', 'Reagan', 'Cooper', 'male'), ('00019', 'Aubree', 'Hogan', 'female'), ('00020', 'Avery', 'Floyd', 'male'), ('00021', 'Elianna', 'Simmons', 'female'), ('00022', 'Rodney', 'Stout', 'male'), ('00023', 'Elaine', 'Mcintosh', 'female'), ('00024', 'Myla', 'Mckenzie', 'female'), ('00025', 'Alijah', 'Horn', 'female'), ('00026', 'Rohan', 'Peterson', 'male'), ('00027', 'Irene', 'Walters', 'female'), ('00028', 'Lilia', 'Sellers', 'female'), ('00029', 'Perla', 'Jefferson', 'female'), ('00030', 'Ashley', 'Klein', 'female')] orders = [('00001', '2020-01-01', '00025', '178'), ('00002', '2020-01-03', '00025', '39'), ('00003', '2020-01-07', '00016', '153'), ('00004', '2020-01-10', '00015', '110'), ('00005', '2020-01-11', '00024', '219'), ('00006', '2020-01-12', '00029', '37'), ('00007', '2020-01-14', '00028', '227'), ('00008', '2020-01-18', '00010', '232'), ('00009', '2020-01-22', '00016', '236'), ('00010', '2020-01-26', '00017', '116'), ('00011', '2020-01-28', '00028', '221'), ('00012', '2020-01-31', '00021', '238'), ('00013', '2020-02-02', '00015', '177'), ('00014', '2020-02-05', '00025', '76'), ('00015', '2020-02-08', '00022', '245'), ('00016', '2020-02-12', '00008', '180'), ('00017', '2020-02-14', '00020', '190'), ('00018', '2020-02-18', '00030', '166'), ('00019', '2020-02-22', '00002', '168'), ('00020', '2020-02-26', '00021', '174'), ('00021', '2020-02-29', '00017', '126'), ('00022', '2020-03-02', '00019', '211'), ('00023', '2020-03-05', '00030', '144'), ('00024', '2020-03-09', '00012', '112'), ('00025', '2020-03-10', '00006', '45'), ('00026', '2020-03-11', '00004', '200'), ('00027', '2020-03-14', '00015', '226'), ('00028', '2020-03-17', '00030', '189'), ('00029', '2020-03-20', '00004', '152'), ('00030', '2020-03-22', '00026', '239'), ('00031', '2020-03-23', '00012', '135'), ('00032', '2020-03-24', '00013', '211'), ('00033', '2020-03-27', '00030', '226'), ('00034', '2020-03-28', '00007', '173'), ('00035', '2020-03-30', '00010', '144'), ('00036', '2020-04-01', '00017', '185'), ('00037', '2020-04-03', '00009', '95'), ('00038', '2020-04-06', '00009', '138'), ('00039', '2020-04-10', '00025', '223'), ('00040', '2020-04-12', '00019', '118'), ('00041', '2020-04-15', '00024', '132'), ('00042', '2020-04-18', '00008', '238'), ('00043', '2020-04-21', '00003', '50'), ('00044', '2020-04-25', '00019', '98'), ('00045', '2020-04-26', '00017', '167'), ('00046', '2020-04-28', '00009', '215'), ('00047', '2020-05-01', '00014', '142'), ('00048', '2020-05-05', '00022', '173'), ('00049', '2020-05-06', '00015', '80'), ('00050', '2020-05-07', '00017', '37'), ('00051', '2020-05-08', '00002', '36'), ('00052', '2020-05-10', '00022', '65'), ('00053', '2020-05-14', '00019', '110'), ('00054', '2020-05-18', '00017', '36'), ('00055', '2020-05-21', '00008', '163'), ('00056', '2020-05-24', '00024', '91'), ('00057', '2020-05-26', '00028', '154'), ('00058', '2020-05-30', '00022', '130'), ('00059', '2020-05-31', '00017', '119'), ('00060', '2020-06-01', '00024', '137'), ('00061', '2020-06-03', '00017', '206'), ('00062', '2020-06-04', '00013', '100'), ('00063', '2020-06-05', '00021', '187'), ('00064', '2020-06-09', '00025', '170'), ('00065', '2020-06-11', '00011', '149'), ('00066', '2020-06-12', '00007', '195'), ('00067', '2020-06-14', '00015', '30'), ('00068', '2020-06-16', '00002', '246'), ('00069', '2020-06-20', '00028', '163'), ('00070', '2020-06-22', '00005', '184'), ('00071', '2020-06-23', '00022', '68'), ('00072', '2020-06-27', '00013', '92'), ('00073', '2020-06-30', '00022', '149'), ('00074', '2020-07-04', '00002', '65'), ('00075', '2020-07-05', '00017', '88'), ('00076', '2020-07-09', '00007', '156'), ('00077', '2020-07-13', '00010', '26'), ('00078', '2020-07-16', '00008', '55'), ('00079', '2020-07-20', '00019', '81'), ('00080', '2020-07-22', '00011', '78'), ('00081', '2020-07-23', '00026', '166'), ('00082', '2020-07-27', '00014', '65'), ('00083', '2020-07-30', '00021', '205'), ('00084', '2020-08-01', '00026', '140'), ('00085', '2020-08-05', '00006', '236'), ('00086', '2020-08-06', '00021', '208'), ('00087', '2020-08-07', '00021', '169'), ('00088', '2020-08-08', '00004', '157'), ('00089', '2020-08-11', '00017', '71'), ('00090', '2020-08-13', '00025', '89'), ('00091', '2020-08-16', '00014', '249'), ('00092', '2020-08-18', '00012', '59'), ('00093', '2020-08-19', '00013', '121'), ('00094', '2020-08-20', '00025', '179'), ('00095', '2020-08-22', '00017', '208'), ('00096', '2020-08-26', '00024', '217'), ('00097', '2020-08-28', '00004', '206'), ('00098', '2020-08-30', '00017', '114'), ('00099', '2020-08-31', '00017', '169'), ('00100', '2020-09-02', '00022', '226')]
این دادهها را میتوان با استفاده از کوئریهای زیر بارگذاری کرد.
1cur.executemany("INSERT INTO users VALUES(?, ?, ?, ?);", customers)
2cur.executemany("INSERT INTO orders VALUES(?, ?, ?, ?);", orders)
3conn.commit()
انتخاب دادهها در SQLite با پایتون
در ادامه آموزش SQlite در پایتون به صورت گام به گام و به زبان ساده، نگاهی به چگونگی انتخاب دادهها با SQLite در پایتون انداخته میشود. در ادامه، ساختار مشابهی با آنچه برای اجرای کوئری بالا انجام شد، استفاده میشود، اما عنصر دیگری به آن اضافه میشود.
استفاده از fetchone() در SQLite در پایتون
اکنون کار با استفاده از تابع ()fetchone آغاز میشود. یک متغیر one_result برای دریافت (کشیدن | Pull) نتایج استفاده میشود.
1cur.execute("SELECT * FROM users;")
2one_result = cur.fetchone()
3print(one_result)
خروجی قطعه کد بالا به صورت زیر است.
[(1, 'Nik', 'Piepenbreier', 'male')]
استفاده از fetchmany() با پایتون
فرض میشود که هدف بازگرداندن بیش از یک نتیجه است. در این راستا میتوان از تابع fetchmany() استفاده کرد. در ادامه، اسکریپت متفاوتی اجرا میشود که سه نتیجه را باز میگرداند.
1cur.execute("SELECT * FROM users;")
2three_results = cur.fetchmany(3)
3print(three_results)
اسکریپت بالا، خروجیهای زیر را بازمیگرداند.
[(1, 'Nik', 'Piepenbreier', 'male'), (2, 'Lois', 'Lane', 'Female'), (3, 'Peter', 'Parker', 'Male')]
استفاده از fetchall() در SQLite با پایتون
به طور مشابه، می توان از تابع fetchall() برای بازگرداندن همه نتایج استفاده کرد. در صورت اجرای کد زیر، همه نتایج بازگردانده خواهند شد.
1cur.execute("SELECT * FROM users;")
2all_results = cur.fetchall()
3print(all_results)
حذف دادهها در SQLite با پایتون
در این بخش از مطلب آموزش SQlite در پایتون به صورت گام به گام و به زبان ساده چگونگی حذف دادهها با استفاده از SQLite در پایتون مورد بررسی قرار خواهد گرفت. این کار را میتوان با استفاده از ساختاری مشابه ساختار بیان شده در بخشهای پیشین انجام داد.
فرض میشود که کاربر قصد دارد کاربری با نام خانوادگی «Parker» را حذف کند. بدین منظور، میتوان از دستور زیر استفاده کرد.
1cur.execute("DELETE FROM users WHERE lname='Parker';")
2conn.commit()
سپس، میتوان کد زیر را اجرا کرد.
1cur.execute("select * from users where lname='Parker'")
2print(cur.fetchall())
این دستور موجب میشود تا یک لیست خالی چاپ شود که تصدیق میکند رکورد حذف شده است.
اتصال جدولها با SQLite در پایتون
در نهایت، در آموزش SQlite در پایتون به صورت گام به گام و به زبان ساده چگونگی اتصال دادهها با بیش از یک کوئری پیچیده مورد بررسی قرار میگیرد. فرض میشود که کاربر قصد دارد کوئری را تولید کند که شامل نام و نام خانوادگی هر مشتری در هر سفارش است.
برای انجام این کار، از دستورات زیر استفاده میشود.
1cur.execute("""SELECT *, users.fname, users.lname FROM orders
2 LEFT JOIN users ON users.userid=orders.userid;""")
3print(cur.fetchall())
به طور مشابه، میتوان دیگر ترفندهای SQL را نیز اعمال کرد. در ادامه مطلب آموزش SQlite در پایتون به صورت گام به گام و به زبان ساده و در بخشهای بعدی، هر یک از مباحث مطرح شده در بخشهای پیشین به همراه دیگر موارد مربوط به آموزش SQlite در پایتون به صورت گام به گام و به زبان ساده مورد بررسی قرار خواهد گرفت.
ساخت اتصال (Connection) با SQLite در پایتون
برای استفاده از SQLite3 در پایتون، ابتدا باید ماژول sqlite3 را ایمپورت کرد و سپس، یک شی Connection ساخت که کاربر را به پایگاه داده متصل میکند و امکان اجرای دستور SQL را برای او فراهم میکند.
میتوان یک شی اتصال را با استفاده از تابع connect() فراهم کرد.
1import sqlite3
2
3con = sqlite3.connect('mydatabase.db')
این امر موجب ساخت یک فایل جدید با نام «mydatabase.db» میشود.
کرسر در SQLite
برای اجرای دستور SQLite در پایتون، نیاز به یک شی کرسر است. این شی را میتوان با استفاده از متد cursor() ساخت. کرسر SQLite3 متدی از شی اتصال است.
برای اجرای دستور SQLite3، کاربر ابتدا باید اتصالی را بسازد و سپس، شیئی از کرسر را با استفاده شی connection به صورت زیر راهاندازی کند.
1con = sqlite3.connect('mydatabase.db')
2
3cursorObj = con.cursor()
اکنون میتوان از فراخوانی شی کرسر برای اجرای متد execute() برای اجرای هر کوئری SQL استفاده کرد.
ساخت پایگاه داده در SQLite
هنگامی که یک اتصال با SQLite ساخته شد، یک فایل پایگاه داده به صورت خودکار ساخته میشود؛ البته در صورتی که این فایل از پیش موجود نباشد. این فایل پایگاه داده روی دیسک ساخته میشود. همچنین، میتوان یک پایگاه داده را در رم با استفاده از عبارت «:memory:» در تابع اتصال، ساخت. به چنین پایگاه دادهای، «پایگاه داده در حافظه» (In-Memory Database) گفته میشود.
اکنون، میتوان کد زیر را در نظر گرفت که در آن پایگاه دادهای با بلوکهای try ،except و finally برای مدیریت همه استثناها ساخته شده است.
import sqlite3 from sqlite3 import Error def sql_connection(): try: con = sqlite3.connect(':memory:') print("Connection is established: Database is created in memory") except Error: print(Error) finally: con.close() sql_connection()
ابتدا، ماژول sqlite3 بارگذاری میشود. سپس، تابع sql_connection تعریف میشود. درون این تابع، یک بلوک try وجود دارد که تابع connect() شی اتصال (connection object) را پس از ارهاندازی اتصال بازمیگرداند. سپس، بلوک except وجود دارد که در صورت هرگونه استثنائی پیغام خطا را چاپ میکند. اگر خطایی وجود نداشته باشد، اتصال راهاندازی میشود و پیغامی را به صورت زیر نمایش میدهد.
پس از آن، اتصال در بلوک Finally بسته میشود. بستن یک connection (اتصال) اختیاری است؛ اما یک تمرین برنامهنویسی خوب محسوب میشود که طی آن کاربر حافظه را از منابع استفاده نشده خالی میکند.
ساخت جدول در SQLite
برای ساخت جدول در SQLite3، میتوان از کوئری Create Table در متد execute() استفاده کرد.
در این راستا، باید گامهای زیر را در نظر داشت.
- ساخت شی اتصال (Connection Object)
- ساخت شی کرسر (Cursor Object) از شی اتصال
- استفاده از شی کرسر، فراخوانی متد اجرا با کوئری ساخت جدول به عنوان پارامتر
در ادامه، Employees (کارکنان) با استفاده از خصیصههای زیر ساخته میشوند.
1employees (id, name, salary, department, position, hireDate)
کد، به صورت زیر خواهد بود.
1import sqlite3
2
3from sqlite3 import Error
4
5def sql_connection():
6
7 try:
8
9 con = sqlite3.connect('mydatabase.db')
10
11 return con
12
13 except Error:
14
15 print(Error)
16
17def sql_table(con):
18
19 cursorObj = con.cursor()
20
21 cursorObj.execute("CREATE TABLE employees(id integer PRIMARY KEY, name text, salary real, department text, position text, hireDate text)")
22
23 con.commit()
24
25con = sql_connection()
26
27sql_table(con)
در کد بالا، دو متد تعریف شده است. اولین متد یک اتصال برقرار میکند و دومین متد یک شی کرسر برای اجرای دستور ساخت جدول میسازد. متد commit() همه تغییراتی را که کاربر انجام داده است ذخیره میکند. در پایان، هر دو متد فراخوانی میشوند. برای بررسی اینکه آیا جدول ساخته شده است یا خیر، میتوان از مرورگر DB استفاده کرد تا جدول را نمایش دهد. اکنون با باز کردن فایل mydatabase.db با برنامه، میتوان جدول زیر را مشاهده کرد.
درج (Insert) در جدول در SQLite
برای درج دادهها در جدول، از دستور INSERT INTO استفاده میشود. اکنون باید خط کد زیر را در نظر گرفت.
1cursorObj.execute("INSERT INTO employees VALUES(1, 'John', 700, 'HR', 'Manager', '2017-01-04')")
2
3con.commit()
برای بررسی اینکه آیا این دادهها درج شدهاند، میتوان روی Browse Data در مرورگر DB کلیک کرد.
همچنین، میتوان مقادیر/آرگومانها را به دستور INSERT در متد execute() پاس داد. میتوان از علامت سئوال (؟) به عنوان ظرفی برای هر مقدار استفاده کرد. نحو دستور INSERT به صورت زیر خواهد بود.
1cursorObj.execute('''INSERT INTO employees(id, name, salary, department, position, hireDate) VALUES(?, ?, ?, ?, ?, ?)''', entities)
موجودیتها (entities) حاوی مقادیری برای ظرفها (Placeholders) به صورت زیر هستند.
1entities = (2, 'Andrew', 800, 'IT', 'Tech', '2018-02-06')
کد کامل به صورت زیر است.
1import sqlite3
2
3con = sqlite3.connect('mydatabase.db')
4
5def sql_insert(con, entities):
6
7 cursorObj = con.cursor()
8
9 cursorObj.execute('INSERT INTO employees(id, name, salary, department, position, hireDate) VALUES(?, ?, ?, ?, ?, ?)', entities)
10
11 con.commit()
12
13entities = (2, 'Andrew', 800, 'IT', 'Tech', '2018-02-06')
14
15sql_insert(con, entities)
به روز رسانی جدول در SQLite
برای به روز رسانی جدول، به سادگی میتوان یک connection و سپس، یک شی کرسر (Cursor Object) را با استفاده از connection ساخت و سپس در نهایت، از دستور UPDATE در متد execute() استفاده کرد. فرض میشود که هدف به روز رسانی نام کارمندی است که شماره شناسه (ID) آن برابر با ۲ است. در اینجا از عبارت WHERE به عنوان شرطی برای انتخاب این کارمندان استفاده میشود.
کد زیر، Andrew را به Rogers تغییر میدهد که میتوان خروجی آن را در تصویر مشاهده کرد.
1import sqlite3
2
3con = sqlite3.connect('mydatabase.db')
4
5def sql_update(con):
6
7 cursorObj = con.cursor()
8
9 cursorObj.execute('UPDATE employees SET name = "Rogers" where id = 2')
10
11 con.commit()
12
13sql_update(con)
دستور Select در SQLite
میتوان از دستور Select برای انتخاب دادهها از یک جدول خاص استفاده کرد. در صورتی که کاربر قصد داشته باشد همه ستونهای دادهها از یک جدول را انتخاب کند، میتواند از علامت ستاره (* | Asterisk) استفاده کند.
نحو این دستور به صورت زیر است:
1select * from table_name
در SQLite3، دستور SELECT در متد execute از شی کرسر (Cursor Object) اجرا میشود. برای مثال، میتوان همه ستونهای جدول employees را انتخاب و کد زیر را اجرا کرد.
1cursorObj.execute('SELECT * FROM employees ')
در صورتی که کاربر تمایل به انتخاب برخی از ستونها از جدول داشته باشد، باید ستونها را به صورت زیر مشخص کند.
1select column1, column2 from tables_name
به عنوان مثالی از این مورد، کد زیر قابل توجه است.
1cursorObj.execute('SELECT id, name FROM employees')
دستور select دادههای مورد نیاز را از جدول پایگاه داده انتخاب میکند و اگر کاربر تمایل به واکشی دادههای انتخاب شده داشته باشد، متد fetchall() از شی کرسر استفاده میشود. این مورد در بخش بعدی نمایش داده میشود.
واکشی همه دادهها در SQLite
برای واکشی همه دادها از پایگاه داده، عبارت SELECT اجرا و سپس، از متد fetchall() شی کرسر برای ذخیرهسازی مقادیر در یک متغیر استفاده میشود. پس از آن، حلقهای در متغیر زده و همه مقادیر چاپ میشود.
کد لازم برای انجام این کار به صورت زیر است.
1import sqlite3
2
3con = sqlite3.connect('mydatabase.db')
4
5def sql_fetch(con):
6
7 cursorObj = con.cursor()
8
9 cursorObj.execute('SELECT * FROM employees')
10
11 rows = cursorObj.fetchall()
12
13 for row in rows:
14
15 print(row)
16
17sql_fetch(con)
کد بالا رکوردها در پایگاه داده را به صورت زیر چاپ میکند.
همچنین، میتوان ازfetchall() به صورت زیر در یک خط استفاده کرد.
1[print(row) for row in cursorObj.fetchall()]
در صورتی که کاربر تمایل داشته باشد دادههای خاصی را از پایگاه داده واکشی کند، میتواند از عبارت WHERE استفاده کند. برای مثال، کاربر قصد دارد تا IDها و اسامی کارکنانی که حقوق آنها بالای ۸۰۰ دلار است را واکشی کند. بدین منظور، باید جدول را با سطرهای بیشتری جمع و سپس، کوئری را اجرا کرد.
میتوان از دستور insert برای جمع کردن دادهها استفاده کرد و یا آنها را به طور دستی در برنامه مرورگر DB وارد کرد. اکنون، برای واکشی شناسه و اسامی افرادی که حقوقی بالاتر از ۸۰۰ دارند، میتوان از کد زیر استفاده کرد.
1import sqlite3
2
3con = sqlite3.connect('mydatabase.db')
4
5def sql_fetch(con):
6
7 cursorObj = con.cursor()
8
9 cursorObj.execute('SELECT id, name FROM employees WHERE salary > 800.0')
10
11 rows = cursorObj.fetchall()
12
13 for row in rows:
14
15 print(row)
16
17sql_fetch(con)
در دستور SELECT، به جای استفاده از ستاره (* | Asterisk)، شناسه (ID) و خصیصههای نام تعیین شده اند. نتایج به صورت زیر است.
شمارش سطرها در SQLite
rowcount در SQLite3 برای بازگرداندن تعداد سطرهایی که به وسیله آخرین کوئری SQL اجرا شده، انتخاب و یا متاثر شدهاند، مورد استفاده قرار میگیرد.
هنگامی که از rowcount با دستور SELECT استفاده میشود، در خروجی «۱-» ظاهر میشود زیرا اینکه چه تعداد از سطرها شناخته شدهاند تا هنگامی که همه آنها واکشی شوند ناشناخته است. در این راستا، مثال زیر قابل توجه است.
1print(cursorObj.execute('SELECT * FROM employees').rowcount)
بنابراین، برای شمارش سطرها، نیاز به واکشی همه دادهها و سپس، به دست آوردن طول (Length) حاصل است. هنگامی که از دستور DELETE بدون هیچ شرطی استفاده شود (عبارت Where)، همه سطرها در جدول حذف خواهند شد و تعداد کل سطرهای حذف شده در rowcount بازگردانده میشود.
1print(cursorObj.execute('DELETE FROM employees').rowcount)
اگر هیچ سطری پاک نشود، صفر را باز میگرداند.
لیست کردن جداول در SQLite
برای لیست کردن جداول در پایگاه داده SQLite3 کاربر باید به جدول sqlite_master کوئری بزند و سپس، از fetchall() برای واکشی نتایج از دستور SELECT استفاده شود.
sqlite_master جدول مستر در SQLite3 است که همه جداول را ذخیره میکند.
1import sqlite3
2
3con = sqlite3.connect('mydatabase.db')
4
5def sql_fetch(con):
6
7 cursorObj = con.cursor()
8
9 cursorObj.execute('SELECT name from sqlite_master where type= "table"')
10
11 print(cursorObj.fetchall())
12
13sql_fetch(con)
این امر موجب میشود تا همه جداول به صورتی که در ادامه آمده است لیست شوند.
بررسی وجود/عدم وجود یک جدول در SQLite
هنگام ساخت یک جدول، باید اطمینان حاصل کرد که جدول در حال حاضر موجود نیست. به طور مشابه، هنگام حذف یک جدول، آن جدول باید از پیش موجود باشد.
برای بررسی اینکه جدول از پیش وجود نداشته باشد، «if not exists» با دستور CREATE TABLE به صورتی که در ادامه آمده است استفاده میشود.
1create table if not exists table_name (column1, column2, …, columnN)
مثالی از این مورد در ادامه آمده است.
1import sqlite3
2
3con = sqlite3.connect('mydatabase.db')
4
5def sql_fetch(con):
6
7 cursorObj = con.cursor()
8
9 cursorObj.execute('create table if not exists projects(id integer, name text)')
10
11 con.commit()
12
13sql_fetch(con)
به طور مشابه برای بررسی اینکه جدول در هنگام حذف موجود است، از دستور «if exists» همراه با دستور DROP TABLE به صورت زیر استفاده میشود.
1drop table if exists table_name
مثالی از این مورد در ادامه آمده است.
1cursorObj.execute('drop table if exists projects')
همچنین، میتوان بررسی کرد که آیا جدولی که قصد دسترسی به آن وجود دارد، موجود است یا نه؛ این کار با استفاده از کوئری زیر انجام میشود.
1cursorObj.execute('SELECT name from sqlite_master WHERE type = "table" AND name = "employees"')
2
3print(cursorObj.fetchall())
اگر جدول employees وجود داشته باشد، نام را به صورت زیر بازمیگرداند.
در صورتی که نام جدولی که توسط کاربر تعیین شده است وجود نداشته باشد، یک آرایه خالی بازگردانده میشود.
حذف جدول در SQLite
میتوان یک جدول را با استفاده از دستور DROP حذف کرد. نحو دستور DROP به صورت زیر است.
1drop table table_name
برای حذف جدول، جدول باید در پایگاه داده وجود داشته باشد. بنابراین، توصیه میشود که از «if exists» با دستور drop به صورت زیر استفاده شود.
1drop table if exists table_name
برای مثال،
1import sqlite3
2
3con = sqlite3.connect('mydatabase.db')
4
5def sql_fetch(con):
6
7 cursorObj = con.cursor()
8
9 cursorObj.execute('DROP table if exists employees')
10
11 con.commit()
12
13sql_fetch(con)
استثناهای SQLite3
استثناها (Exceptions) خطاهای زمان اجرا هستند. در برنامهنویسی پایتون، همه استثناها نمونههایی از کلاس مشتق شده از BaseException هستند.
در SQLite3، سه استثنای پایتون زیر وجود دارد.
خطای پایگاه داده یا DatabaseError
خطای مرتبط با پایگاه داده منجر به خطای DatabaseError میشود.
خطای یکپارچگی یا IntegrityError
IntegrityError زیرکلاسی از DatabaseError است و هنگامی به وقوع میپیوندد که مشکل یکپارچگی دادهها وجود داشته باشد. برای مثال، اگر دادههای خارجی در همه جدولها به روز رسانی نشوند منجر به عدم سازگاری دادهها میشود.
خطای برنامهنویسی یا ProgrammingError
ProgrammingError هنگامی به وقوع میپیوندد که خطاهای نحوی وجود دارد یا جدول پیدا نمیشود یا تابع با تعداد اشتباهی از پارامترها/آرگومانها فراخوانی شود.
خطای عملیاتی
استثنای OperationalError هنگامی به وقوع میپیوندد که عملیات پایگاه داده با شکست مواجه شود. به عنوان مثالی از این مورد میتوان به قطعی ارتباط اشاره کرد. این خطای برنامهنویسها نیست.
خطای عدم پشتیبانی
هنگامی که از متدهایی استفاده میشود که توسط پایگاه داده پشتیبانی و یا تعریف نشدهاند، خطای NotSupportedError به وقوع میپیوندد.
درج انبوه رکوردها (Bulk insert)
میتوان از دستور executemany برای درج کردن چندین سطر به صورت یکباره استفاده کرد. اکنون، میتوان کد زیر را در نظر گرفت.
1import sqlite3
2
3con = sqlite3.connect('mydatabase.db')
4
5cursorObj = con.cursor()
6
7cursorObj.execute('create table if not exists projects(id integer, name text)')
8
9data = [(1, "Ridesharing"), (2, "Water Purifying"), (3, "Forensics"), (4, "Botany")]
10
11cursorObj.executemany("INSERT INTO projects VALUES(?, ?)", data)
12
13con.commit()
در اینجا یک جدول با دو ستون ساخته شده است و data دارای چهار مقدار برای هر ستون است. متغیر، همراه با کوئری، به متد executemany() پاس داده میشود. شایان توجه است که از ظرف (Placeholder) برای پاس دادن مقادیر استفاده میشود. کد بالا نتایج زیر را به همراه دارد.
بستن اتصال در SQLite
در این بخش از آموزش SQlite در پایتون به صورت گام به گام و به زبان ساده چگونگی بستن اتصال (Connection) در SQLite مورد بررسی قرار میگیرد.
هنگامی که کار با پایگاه داده تمام شد، بهتر است که اتصال بسته شود. اتصال (Connection) را میتوان با استفاده از متد close() بست. برای بستن یک اتصال (Connection) میتوان از شی اتصال استفاده کرد و متد close() را به صورت زیر فراخوانی کرد.
1con = sqlite3.connect('mydatabase.db')
2
3#program statements
4
5con.close()
تاریخ و ساعت در SQLite
در پایگاه داده پایتون SQLite3، میتوان به سادگی دادهها یا زمان را با وارد کردن ماژول datatime ذخیره کرد. فرمتهای زیر متداولترین فرمتهایی هستند که میتوان از آنها برای datetime استفاده کرد.
1YYYY-MM-DD
2
3YYYY-MM-DD HH:MM
4
5YYYY-MM-DD HH:MM:SS
6
7YYYY-MM-DD HH:MM:SS.SSS
8
9HH:MM
10
11HH:MM:SS
12
13HH:MM:SS.SSS
14
15now
کد زیر مفروض است.
1import sqlite3
2
3import datetime
4
5con = sqlite3.connect('mydatabase.db')
6
7cursorObj = con.cursor()
8
9cursorObj.execute('create table if not exists assignments(id integer, name text, date date)')
10
11data = [(1, "Ridesharing", datetime.date(2017, 1, 2)), (2, "Water Purifying", datetime.date(2018, 3, 4))]
12
13cursorObj.executemany("INSERT INTO assignments VALUES(?, ?, ?)", data)
14
15con.commit()
در این کد، ابتدا ماژول datetime وارد (ایمپورت | Import) شده است و جدولی با نام assignments با سه ستون ساخته شده است. نوع داده ستون سوم date است. برای وارد کردن دادها در ستون، از datetime.date استفاده شده است. به طور مشابه، میتوان از datetime.time نیز برای مدیریت زمان استفاده کرد. کد بالا خروجی زیر را تولید میکند.
انعطافپذیری خوب و قابلیت حمل پایگاه داده SQLite3 این پایگاه داده را به اولین انتخاب برای هر توسعهدهندهای برای استفاده از آن و ارائه آن همراه با محصول مبدل میکند.
میتوان از پایگاه داده SQLite3 در ویندوز، لینوکس، مکاواس، اندروید و iOS به دلیل قابلیت حمل فوقالعاهای که دارند استفاده کرد. بنابراین، یک فایل با پروژه تحویل میشود.
جمعبندی آموزش SQlite در پایتون به صورت گام به گام و به زبان ساده
در مطلب آموزش SQlite در پایتون به صورت گام به گام و به زبان ساده، هر آنچه که برای شروع به کار با SQLite در پایتون مورد نیاز است، به طور خاص برای ساخت جدول در SQLite با پایتون، مورد بررسی قرار گرفت.
در این راستا، چگونگی بارگذاری کتابخانه SQLite 3، چگونگی ساخت پایگاه داده و جدولها، چگونگی اضافه کردن پایگاه داده و جدولها، چگونگی اضافه کردن دادهها، چگونگی کوئری زدن به جدول و چگونگی حذف دادهها مورد بررسی قرار گرفت. همچنین، چگونگی انجام سایر اعمال قابل انجام روی پایگاه داده مانند انتخاب کردن، حذف و درج دادهها، بستن اتصال و دیگر موارد به طور کامل مورد بررسی قرار گرفت.
مثل همیشه عالی
سلام. خیلی ممنون بسیار مفید بود. یک مشکلی برام پیش اومده.
با استفاده از tkinter.filedialog محل ذخیره سازی فایلی رو بدست آوردم حالا میخوام این محل رو برای ساخت فایل دیتابیس به sqlite بدم. چون داخل رشته از / استفاده شده باید از r قبل از رشته استفاده بشه ولی یک مشکلی هست این که تایپ خود مسیر رشته هست و برای استفاده از r باید اون رو قبل از یک رشته قرار داد اما نمیتونیم قبل از متغیری که توش مسیر دریافت شده اون رو قرار بدیم ( چون اسم متغیر تغییر میکنه ) و اگر از f string استفاده کنیم یک رشته درون یه رشته دیگه قرار میگیره که باز هم با ارور مواجه میشیم.
ممکنه راهنمایی کنید؟
چون مسیر در متغیر قرار دارد ممکن است نیازی به قرار دادن r قبل از آن نباشد
خیلی مفید بود. واقعا ممنونم. سردرگم بودم که راهنماییم کرد.
تشکر استاد قند واقعا عالی بود