Menu

מה זה SQLite? הסבר על מסד הנתונים המשובץ

SQLite הוא מסד נתונים SQL ללא שרת, מבוסס קובץ, שרץ בתוך האפליקציה שלכם. הנה מה הוא באמת, במה הוא שונה משרת מסד נתונים, ומתי הוא מצטיין.

בדף הזה יש עורכים שאפשר להריץ - לערוך, להריץ ולראות את הפלט מיד.

SQLite הוא מסד נתונים בתוך התוכנית שלכם

רוב מסדי הנתונים ששמעתם עליהם, כמו MySQL, Postgres ו-SQL Server, רצים כתוכנית נפרדת. מפעילים שרת, הוא מאזין על פורט, והאפליקציה שלכם מתחברת אליו דרך הרשת כדי לשאול אותו שאלות. SQLite זורק את כל המודל הזה.

SQLite הוא ספרייה. מקשרים אותו לתוכנית שלכם, והוא נותן לכם מסד נתונים SQL שנמצא בקובץ אחד על הדיסק. אין שרת, אין פורט, אין daemon, אין pg_ctl start. האפליקציה שלכם פותחת קובץ, והקובץ הזה הוא מסד הנתונים.

sqlite3 mydata.db

הפקודה הזו פותחת (או יוצרת) קובץ בשם mydata.db ונותנת לכם שורת פקודה של SQL. כל מה שאתם עושים, טבלאות, שורות, אינדקסים, נשמר בקובץ האחד הזה. העתיקו אותו למכונה אחרת ומסד הנתונים עובר איתו. מחקו אותו ומסד הנתונים נעלם.

סיור קצר ב-SQL

ה-SQL עצמו נראה כמו SQL בכל מקום אחר. אם השתמשתם במסד נתונים אחר, כמעט הכול ירגיש מוכר:

SQL סטנדרטי: CREATE TABLE, INSERT, SELECT, ORDER BY. SQLite תומך בחלקים של תקן SQL שבאמת משתמשים בהם ביום יום, ועוד נוחויות מודרניות כמו CTEs, פונקציות חלון ופונקציות JSON. ההבדלים מ-Postgres או מ-MySQL הם בעיקר סביב טיפוסים וכמה מוזרויות תחביר, שנכסה בהמשך.

מה המשמעות האמיתית של "משובץ" ו"ללא שרת"

שתי מילים עולות כל הזמן בהקשר של SQLite. כדאי להבין אותן נכון.

משובץ (embedded) פירושו ש-SQLite רץ באותו תהליך כמו האפליקציה שלכם. אין תהליך נפרד של מסד נתונים. כשסקריפט ה-Python שלכם קורא ל-sqlite3.connect("data.db"), מנוע ה-SQL רץ בתוך תהליך ה-Python שלכם, וקורא וכותב לקובץ ישירות.

ללא שרת (serverless) פירושו שאין שרת להתקין, להגדיר, להריץ, לאבטח או לגבות. השוו את הצעדים שנדרשים כדי להתחיל להשתמש במסד נתונים:

  • Postgres: להתקין את Postgres, להפעיל את השירות, ליצור משתמש, ליצור מסד נתונים, להגדיר את pg_hba.conf, להתחבר דרך TCP.
  • SQLite: לפתוח קובץ.

זה כל ההבדל. פחות עוצמה, הרבה פחות טקסים.

כל מסד הנתונים הוא קובץ אחד

זה החלק שמפתיע אנשים. פורמט הקובץ מתועד ויציב: קובץ .db (או .sqlite, או .sqlite3, הסיומת היא רק מוסכמה) שאפשר:

  • לשלוח במייל לעמית לעבודה.
  • לעשות לו commit ל-git (לפחות לקטנים).
  • להעתיק עם cp לגיבוי מיידי.
  • לפתוח בכל כלי SQLite בכל מערכת הפעלה.
ls -lh mydata.db
# -rw-r--r--  1 you  staff   28K  Apr 23 14:02 mydata.db

הקובץ האחד הזה מכיל את הטבלאות, האינדקסים, הסכמה והנתונים שלכם. מסדי נתונים של SQLite על הדיסק זהים בייט אחר בייט ב-Windows, ב-macOS, ב-Linux, ב-iOS וב-Android. הפורמט יציב כל כך שספריית הקונגרס האמריקאית ממליצה עליו לשימור נתונים לטווח ארוך.

איפה אתם כבר משתמשים ב-SQLite

כמעט בוודאות יש מאות מסדי נתונים של SQLite על המכשיר שעליו אתם קוראים את זה. הוא מפעיל:

  • את אחסון המערכת של iOS ושל Android, ואפליקציות רבות בשתי הפלטפורמות.
  • את Firefox, Chrome ו-Safari (היסטוריה, סימניות, עוגיות).
  • את macOS (Mail, Photos, ה-dock).
  • את רוב אפליקציות הדסקטופ של Linux שצריכות אחסון מקומי.
  • את Skype, WhatsApp ו-Signal: היסטוריית צ'אט.
  • את הקטלוגים של Adobe Lightroom, המטא דאטה של Dropbox והספריות של Steam.

קראו לו מנוע מסד הנתונים הנפוץ ביותר בעולם, וזה כנראה נכון. הסיבה פשוטה: כשאפליקציה צריכה אחסון מקומי מובנה, SQLite הוא הדרך הקלה ביותר.

מה SQLite לא

הוא לא מסד נתונים של לקוח ושרת. שתי תוכניות במכונות שונות לא יכולות להתחבר שתיהן למסד נתונים של SQLite דרך הרשת: אין שכבת רשת להתחבר אליה. אם צריך את זה, אתם רוצים Postgres או MySQL.

הוא לא בנוי למקביליות כתיבה גבוהה. SQLite משתמש בנעילה ברמת הקובץ (עם כמה אופטימיזציות חכמות במצב WAL), כך שבעוד שקוראים רבים יכולים לעבוד במקביל, רק כותב אחד בכל פעם זוכה לבצע commit. לאפליקציה של משתמש יחיד או לאתר עם תעבורה נמוכה, זו לא בעיה. ל-SaaS מרובה לקוחות שמקבל אלפי כתיבות בשנייה, זה הכלי הלא נכון.

הוא לא מנהל משתמשים או הרשאות. גישה למסד הנתונים היא גישה לקובץ: מי שיכול לקרוא את הקובץ יכול לקרוא את הנתונים. זה בסדר לאפליקציה שמחזיקה את קובץ מסד הנתונים שלה. זה לא בסדר להגדרה משותפת של לקוחות רבים.

למה לבחור בו

העסקה היא פשטות בתמורה למרווח גדילה שאולי לעולם לא תצטרכו:

  • אפס הגדרה. אין שירות להריץ. אין אי התאמה של גרסאות בין סביבת הפיתוח לפרודקשן. אין "מסד הנתונים נפל", כי אין שרת מסד נתונים.
  • מהיר. ברוב העומסים, במיוחד כאלה שעיקרם קריאה, SQLite מהיר יותר ממסד נתונים ברשת: אין הלוך ושוב דרך socket בכל שאילתה.
  • אמין. הוא נבדק באובססיביות. בפרויקט SQLite יש הרבה יותר קוד בדיקות מקוד מקור, והפורמט יציב מאז 2004.
  • נחלת הכלל. חינמי לכל שימוש, כולל מסחרי. אין רישיון לקרוא.
  • נייד. קובץ אחד, כל פלטפורמה.

לאפליקציות מקומיות, אבות טיפוס, מכשירים משובצים, כלי CLI, חבילות בדיקות, סקריפטים לניתוח נתונים ואתרים קטנים עד בינוניים, SQLite הוא לעיתים קרובות ברירת המחדל הנכונה, ולא אבן דרך בדרך למסד נתונים "אמיתי".

הבא בתור: SQLite מול MySQL

שאלה טבעית שבאה אחר כך היא איך SQLite עומד מול שרתי מסדי הנתונים שכנראה שמעתם עליהם יותר. נתחיל ב-MySQL: איפה כל אחד מנצח, ואיך לדעת מה מתאים לפרויקט שלפניכם.

שאלות נפוצות

מה זה SQLite?

SQLite הוא מנוע מסד נתונים SQL שרץ כספרייה בתוך האפליקציה שלכם, במקום כשרת נפרד. כל מסד הנתונים, כלומר טבלאות, אינדקסים, סכמה ונתונים, נמצא בקובץ אחד על הדיסק. מדברים איתו דרך ספריית C (או ספריית קישור לשפה שלכם) באמצעות SQL רגיל.

למה משתמשים ב-SQLite?

בכל מקום שבו צריך מסד נתונים SQL אמיתי בלי להריץ שרת: אפליקציות מובייל (גם iOS וגם Android מגיעות איתו), אפליקציות דסקטופ, דפדפנים, מכשירים משובצים, אתרים קטנים, מטמונים מקומיים, חבילות בדיקות וסקריפטים אנליטיים. אם הנתונים שלכם נכנסים במכונה אחת ותהליך אחד בכל פעם כותב, SQLite בדרך כלל מתאים.

האם SQLite הוא מסד נתונים אמיתי?

כן. הוא תומך בטרנזקציות, בהבטחות ACID, במפתחות זרים, ב-joins, בתת שאילתות, בפונקציות חלון, ב-CTE, בטריגרים, ב-views וב-JSON. חסרים בו דברים שיש במסד נתונים של שרת, כמו גישה ברשת, מקביליות של כמה כותבים וחשבונות משתמשים, כי זה לא התפקיד שלו. לאפליקציה של תהליך יחיד, הוא 'אמיתי' בדיוק כמו Postgres.

האם SQLite חינמי?

כן. SQLite נמצא בנחלת הכלל, וזה אפילו מתירני יותר מקוד פתוח. אפשר להשתמש בו במוצרים מסחריים, לשנות אותו ולהפיץ אותו בלי קרדיט ובלי דמי רישיון. בגלל זה הוא אחת מפיסות התוכנה הנפוצות ביותר על פני כדור הארץ.

איור של שפות התכנות ב-Coddy

ללמוד תכנות עם Coddy

להתחיל