במאמר הקודם, למידת היסודות: איך להשתמש ב-JSON ב-SQLite, צללנו לתוך הפונקציות הבסיסיות של JSON ב-SQLite ולתפקודיהן. חקרנו את השימוש ב-JSON כנתונים לא מובנים בתוך מסד נתונים SQLite. באופן קריטי, תיארנו כמה מהפונקציות ההכרחיות של SQLite JSON, ודנו בתפקידן באחסון ובשליפת נתונים, ואחריו דוגמאות שאילתא SQL מעשיות. ההבנה הבסיסית זה איך לעבוד עם נתוני JSON ב-SQLite מקדמת את ההתחלה למחקר המתקדם של הנושא.
בואו נתחיל!
שילוב יכולות SQL ו-NoSQL דרך הבנה מלאה של עיבוד JSON ב-SQLite
השיפור של הידע שלך על יכולות עיבוד JSON של SQLite משלב את הטוב ביותר של SQL ו-NoSQL, ומספק פתרון אפקטיבי, כולל לניהול פורמטים נתונים מעורבים. תמיכת נתוני JSON ב-SQLite הופכת את SQLite ליכולת ענקית לנתונים לא מובנים, דומה למסדי נתונים כמו MongoDB.
שילוב הפורטמה המתקדמת של SQLite משלבת את הגמישות של JSON עם החוזק של SQLite, מה שמתאים מאוד ליישומים המושקעים בנתונים של היום. יכולות ה-JSON של SQLite עושות יותר מאשר רק אחסון ושליפת נתונים. הן מאפשרות פעולות דמויות SQL על נתוני JSON, יצירת גשר בין ניהול נתונים מובנים ובלתי מובנים.
מדריך זה מתמקד במלווה את קבוצת הכישורים הפרקטיים שלך עם פונקציות JSON של SQLite דרך דוגמאות של שאילתות SQL ידניות. כל סעיף נועד לשפר את ההבנה שלך ולתת לך דילמה על ניהול נתוני JSON בפועל ב-SQLite.
בסוף, תהיה מצוידת היטב עם סט הכלים הזמין לטפל בנתוני JSON ב-SQLite כדי להתמודד עם מבנים נתונים כלשהם של JSON. תלמד על כך כיצד ליישם אינדקסים, לשאול בביטויים של מסלול, לסנן, ואף לאמת נתונים – משימות חיוניות לטיפול בנתונים דינמיים בסביבות מובנות באמצעות פונקציות JSON ב-SQLite.
1. איך לשלב JSON בתוך SQLite
פונקציות מקושרות ל-JSON המובנות ב-SQLite משחקות תפקיד מרכזי בשילוב JSON ו-SQLite. מאז גרסת SQLite 3.38.0, שנפרסמה ב-2022-02-22, פונקציות JSON כלולות כברירת מחדל, בעוד שלפני כן היו פיזוריות. זה אומר שלפני גרסה זו, פונקציות JSON ב-SQLite היו ברורות, וכעת הן זמינות כברירת מחדל וניתן לבחור להגדיר אפשרות ברזרבה במקרה שתצטרך להשבית אותן.
אפשר ליישבר נתוני JSON לתוך SQLite באמצעות שאילתות SQL פשוטות להכנסת נתונים. כמו כן, ניתן להשתמש בכלי שלישי או טכניקות תסריטים לפי ייבוא מערכי נתוני JSON נרחבים גם כן. כדי למשוך נתוני JSON, ניתן לנצל את הפונקציה json_extract() שמשיגה ערכים הקשורים למפתח ספציפי מעמודת נתוני JSON.
2. השימוש בפונקציות SQLite JSON לפירוק מתקדם של JSON ושאילתות SQL
בסעיף זה, אנו עומדים לחקור פונקציות JSON מתקדמות ויכולותיהן ב-SQLite, באמצעות דוגמאות שאלות SQL עבור כל אחת מהן. לאורך פוסט הבלוג הזה, אנו נשתמש בנתוני JSON דוגמא שנוצרו באופן מלאכותי, הנקראים movie, כרשומה שתשמש לשם החקירה:
אפשר להכניס את הנתונים לטבלה בשם movie עם שדה אחד הנקרא data, ולהתחיל לרוץ עליהם את השאלות הדוגמא מעכשיו. בשאלות הבאות, אנו נשתמש בטקסט הקלט של פונקציות JSON, כדי להיות ישירים לגבי ההסבר של הפונקציות, ואז נחזור לנתונים שהוכנסו למסד הנתונים מהסעיף 3.
לשם הפשטות בדוגמא זו, אנו נשתמש בגרסה פשוטה יותר של הנתונים הראשונים של JSON:
{
"Name": "Naked of Truth",
"Year": 1979,
"Director": "Ellynn O'Brien",
"Producer": "Kayley Byron Tutt",
"Runtime": 183,
"Rate": 8.0,
"Description": "Donec pretium nec dolor in auctor."
}
גילוי שגיאות עם json_error_position()
פונקציה ב-SQLite
הפונקציה json_error_position() יכולה לשמש לגילוי כל שגיאה בתחביר ה-JSON של הנתונים שלך. אם המחרוזת המקורית תקינה, היא תחזיר 0, אחרת, היא תחזיר את מיקום התו הראשון של השגיאה.
לדוגמא, אם יש לך מחרוזת JSON שבורה כקלט לפונקציה זו כזו:
SELECT
json_error_position ( '{"Name":"Naked of Truth","Year":1979,' ) AS err_position
תוצאת השאלה שתתקבל תהיה מיקום השגיאה בתחביר שהתרחשה, שבמקרה זה הוא מיקום הגזירה החסרה "}" בסוף:
error_position |
---|
38 |
מיזוג אובייקטים JSON עם פונקציה json_patch()
ב-SQLite
הפונקציה json_patch() ממזגת 2 אובייקטים JSON, מאפשרת להוסיף, לשנות ולמחוק אובייקטים JSON.
לדוגמה, שאילתה זו תשלב את 2 הקלטים ה-JSON לתוך 1 JSON:
SELECT
json_patch ( '{"Name":"Naked of Truth"}', '{"Year": 2011}' ) AS patched_json;
התוצאה תהיה משהו כזה, אובייקט JSON המורכב משני השדות:
patched_json |
---|
{"Name":"Naked of Truth","Year":2011} |
לכוון שדות JSON באמצעות הפונקציה json_set()
ב-SQLite
הפונקציה json_set() משמשת להוספת או החלפת תכונות JSON. json_set()
מקבלת מחרוזת JSON כארגומנט הראשון ואחריה אפס או יותר זוגות של נתיב/ערך. התוצאה תהיה מחרוזת JSON המופקת מהוספת או החלפת ערכים על פי הנתיב וזוגות הערך המוצעים.
לדוגמה, בניית על השאילתה הקודמת של נתוני JSON, אם אתה רוצה להוסיף שדה Director
לנתוני ה-JSON, אתה יכול לכתוב שאילתה כזו:
SELECT
json_set ( '{"Name":"Naked of Truth","Year":2011}', '$.Director', 'Ellynn OBrien' ) AS json_data;
והתוצאה תהיה משהו כזה:
json_data |
---|
{"Name":"Naked of Truth","Year":2011,"Director":"Ellynn OBrien"} |
הפונקציה json_quote()
ב-SQLite
פונקציית ה-json_quote() היא פשוטה, היא פשוט עוטפת את הערך הקלט במרכאות כפולות כדי להפוך אותו למחרוזת JSON תקינה. הנה דוגמה פשוטה לשאילתה:
SELECT
json_quote ( 'Naked Of Truth' ) AS valid_json_string;
והתוצאה תהיה משהו כזה:
valid_json_string |
---|
"Naked of Truth" |
כיצד להשתמש json_group_object()
ו-json_group_array()
בפונקציות JSON ב-SQLite לצורך אגרגציה
עבור סט פונקציות JSON זה ב-SQLite, עלינו להרחיב את הנתונים הדוגמא בהשוואה לדוגמאות הקודמות, כדי להדגים את שימוש כל פונקציה בצורה ברורה. נניח שזו ה-movie
שלך בטבלה במסד הנתונים עם שדה אחד הנקרא data
, כפי שציינו בתחילת הסעיף:
data |
---|
{"ID": 1, "Name": "Forgotten in the Planet", "Year": 1970, "Genre": ["Comedy", "Crime"], "Director": "Henrie Randell Githens", "Cast": ["Adrian Gratianna", "Tani O'Hara", "Tessie Delisle"], "Runtime": 90, "Rate": 7.0} |
{"ID": 2, "Name": "The Obsessed's Fairy", "Year": 1972, "Genre": ["Adventure"], "Director": "Susanne Uriel Lorimer", "Cast": ["Dacy Dex Elsa", "Matilde Kenton Collins"], "Runtime": 98, "Rate": 9.5} |
{"ID": 3, "Name": "Last in the Kiss", "Year": 1965, "Genre": ["History", "Animation"], "Director": "Simone Mikey Bryn", "Cast": ["Margery Maximilianus Shirk","Harri Garwood Michelle"], "Runtime": 106, "Rate": 4.1} |
פונקציה הצטברות json_group_array()
עם דוגמה לשאילת SQL
פונקציית ה-json_group_array() דומה לכל פונקציה צטברות אחרת ב-SQLite, מאגדת מספר שורות נתונים למערך JSON יחיד.
לדוגמה, שאילתה זו תחזיר מערך JSON עם כל שמות הסרטים עם דירוג גבוה מ-6:
SELECT
json_group_array ( json_extract ( data, '$.Name' ) ) AS movie_names
FROM
movie
WHERE
json_extract ( data, '$.Rate' ) > 6
והתוצאה תהיה משהו כזה:
movie_names |
---|
["Forgotten in the Planet", "The Obsessed's Fairy"] |
הפונקציה json_group_object()
ב-JSON עם דוגמה של שאילתת SQL
הפונקציה json_group_object() יוצרת אובייקט JSON על ידי קיבוץ שתי עמודות של שאילתה, כאשר העמודה הראשונה משמשת כמפתח, והשנייה כערך. הראשונה תשמש כשם המפתח של השדות ה-JSON, והשנייה כערכיהם.
לדוגמה, שאילתה זו תחזיר אובייקט JSON שבו שם כל שדה הוא מזהה הסרט והערך של השדה הוא השם המתאים אם ל-סרט
יש דירוג גבוה מ-6, מה שימנע מאתר הסרט האחרון:
SELECT
json_group_object ( json_extract ( Data, '$.ID' ), json_extract ( Data, '$.Name' ) ) AS movie_rates
FROM
movie
WHERE
json_extract ( Data, '$.Rate' ) > 5
התוצאה תהיה משהו כזה, אובייקט JSON המורכב ממזהה ושם של הסרטים הראשונים והשניים מכיוון שיש להם דירוג
גבוה מ-5:
movie_rates |
---|
{"1": "Forgotten in the Planet","2":"The Obsessed's Fairy"} |
ניתוח נתוני JSON עם json_each()
ו-json_tree()
פונקציות ב-SQLite המיוצרות לטבלאות
SQLite מציעה שתי פונקציות מובנות לטבלאות עוצמתיות לעבודה עם הנתונים שלך ב-JSON, json_each()
ו-json_tree()
. יש להם גרסאות עם ובלי פרמטר הנתיב, מה שמאפשר לך לפעול עם ה-JSON בעומקים שונים.
נניח שזהו הערך ה JSON היחידי שהוכנס בשדה הנתונים של טבלת הסרטים במסד הנתונים SQLite, בואו נתחיל להסביר את פונקציות הסכום עליו:
data |
---|
{ "ID": 1, "Name": "Forgotten in the Planet", "Year": 1970, "Genre": ["Comedy", "Crime"], "Director": "Henrie Randell Githens", "Cast": ["Adrian Gratianna", "Tani O'Hara", "Tessie Delisle"], "Runtime": 90, "Rate": 7.0 } |
פונקציית json_each()
ב-SQLite עם דוגמה לשאילתת SQL
פונקציית json_each() מפרקת אובייקט JSON לשורות, כשכל שורה מייצגת שדה באובייקט ה-JSON, ופונה רק לרמה 1 של שדות JSON מקושרים.
לדוגמה, השאילתה הזו תחזיר 8 שורות עבור כל שדה בנתוני ה-JSON:
SELECT
key,
value,
type
FROM
movie,
json_each ( data )
התוצאה תהיה משהו כזה, המפרט את המפתחות והערכים של כל שדה ב-JSON כשורה, כפי שאתה רואה, השדה המערך Genre
ו-Cast
מופיעים כפי שהם, והפונקציה לא עברה עליהם לרשום את הפריטים ברמה השנייה:
key | Value | Type |
---|---|---|
ID | 1 | integer |
Name | Forgotten in the Planet | text |
Year | 1970 | integer |
Genre | ["Comedy","Crime"] | array |
Director | Henrie Randell Githens | text |
Cast | ["Adrian Gratianna","Tani O'Hara","Tessie Delisle"] | array |
Runtime | 90 | integer |
Rate | 7.0 | real |
פונקציית json_tree()
ב-SQLite עם דוגמה לשאילתת SQL
פונקציית json_tree() משמשת לניידת ופירוק נתוני JSON לגמרי, כלומר היא תיכנס לכל שדה דרך כל הרמות המקושרות. פונקציית json_tree()
עוברת על ה-JSON, בחוק כל חלק ממנו, ואז נותנת לך טבלה המפרטת כל אלמנט שהיא מצאה.
הjson_tree()
מציג את התוצאות כסט שורות, מה שמאפשר תצוגה ברורה של אפילו הנתונים המורכבים ביותר ב-JSON המקושרים. הטבלה מספרת לך את שמכל אלמנט, איזה סוג נתונים הוא, הערך שלו ואיפה הוא ממוקם בתוך מבנה ה-JSON.
אז השאילתה זו תחזיר מספר שורות, המתארות את מבנה אובייקט ה-JSON, כולל השדה המקושר Cast:
SELECT
key,
value,
type
FROM
movie,
json_tree ( data )
התוצאה של השאילתה לעיל תהיה משהו כזה:
key | Value | Type |
---|---|---|
{"ID":1,"Name":"Forgotten in the Planet","Year":1970,"Genre":["Comedy","Crime"],"Director":"Henrie Randell Githens","Cast":["Adrian Gratianna","Tani O'Hara","Tessie Delisle"],"Runtime":90,"Rate":7.0} | object | |
ID | 1 | integer |
Name | Forgotten in the Planet | text |
Year | 1970 | integer |
Genre | ["Comedy","Crime"] | array |
0 | Comedy | text |
1 | Crime | text |
Director | Henrie Randell Githens | text |
Cast | ["Adrian Gratianna","Tani O'Hara","Tessie Delisle"] | array |
0 | Adrian Gratianna | text |
1 | Tani O'Hara | text |
2 | Tessie Delisle | text |
Runtime | 90 | integer |
Rate | 7 | real |
עם פרמטר הנתיב, json_tree()
יכול להתמקד בחלק ספציפי של ה-JSON. אם תיתן לjson_tree()
נתיב ספציפי ב-JSON כטענה השנייה, הוא יתחיל את החקירה משם.
לדוגמה, השאילתה זו מתעלמת מכל דבר מחוץ לשדה Cast, ומציעה תצוגה ממוקדת של מערך ה-JSON המקושר זה:
SELECT
key,
value,
type
FROM
movie,
json_tree ( data, '$.Cast' )
התוצאה של השאילתה לעיל תהיה משהו כזה:
key | Value | Type |
---|---|---|
0 | Adrian Gratianna | text |
1 | Tani O'Hara | text |
2 | Tessie Delisle | text |
עובדה מהנה: האם שמתם לב לספרת ה-1 בכתובת האתר של התיעוד הרשמי של JSON ב-SQLite ותהיתם אם יש לזה סיפור? כשתמיכת JSON יצאה לראשונה ב-SQLite בשנת 2015, הייצרן ציפה ש-JSON1 יהיה רק ההתחלה של סדרת גרסאות – JSON2, JSON3 וכן הלאה. אבל הנה החלק המהנה: JSON1 היה כל כך יעיל ואפקטיבי שלא היה צורך ליצור JSON2 או JSON3. אז ה-1 ב-JSON1 אינו רק סמן גרסה – זו סימן הצלחה!
3. גישות מעשיות לשאילת כל נתוני JSON מורכבים ב-SQLite
משתמשים בפונקציות JSON של SQLite בשיתוף פעולה עם פונקציות מובנות מראש של SQLite מאפשר לך לבצע חיפוש נתונים מורכב יותר. הנה ראיה על כמה דוגמאות אלה כוללות אגרגציה, סינון וביטויי מסלול.
כפי שציינו בתחילת הפוסט, הנתונים הJSON בטבלה movie
בדוגמאות עבור כל הסעיפים הנותרים יהיו ככה:
data |
---|
{"ID": 1, "Name": "Forgotten in the Planet", "Year": 1970, "Genre": ["Comedy", "Crime"], "Director": "Henrie Randell Githens", "Cast": ["Adrian Gratianna", "Tani O'Hara", "Tessie Delisle"], "Runtime": 90, "Rate": 7.0} |
{"ID": 2, "Name": "The Obsessed's Fairy", "Year": 1972, "Genre": ["Comedy", "Adventure"], "Director": "Susanne Uriel Lorimer", "Cast": ["Dacy Dex Elsa", "Matilde Kenton Collins"], "Runtime": 98, "Rate": 9.5} |
{"ID": 3, "Name": "Last in the Kiss", "Year": 1965, "Genre": ["History", "Animation"], "Director": "Simone Mikey Bryn", "Cast": ["Margery Maximilianus Shirk","Harri Garwood Michelle"], "Runtime": 106, "Rate": 4.1} |
יצירת שאילתות SQL אגרגטיביות עם פונקציות JSON ב-SQLite
גישה זו כוללת שימוש בפונקציות JSON יחד עם פונקציות אגרגטיביות מובנות מראש של SQLite לבצע חישובים על נתוני JSON. לדוגמה, אפשר לחשב את הממוצע של זמן הרצה של הסרטים שמסוגרים תחת הקטגוריה של קומדיה באמצעות השאילתה הבאה:
SELECT
AVG( json_extract ( data, '$.Runtime' ) ) AS average_runtime
FROM
movie AS M,
json_each ( json_extract ( M.data, '$.Genre' ) ) AS T
WHERE
T.value = 'Comedy';
תוצאת השאילתה לעיל תהיה משהו כזה מאחר ויש שני סרטים במסד הנתונים עם הזכרון של ז'אנר הקומדיה, והזמן המרכזי שלהם הוא 90 ו-98, ולכן הממוצע שלהם יהיה ככה:
average_runtime |
---|
94 |
פירוק וסינון נתונים עם תנאים מרובים ב-JSON
אפשר להשתמש בפונקציה json_extract()
ב-SQLite לסינון מעמיק על ידי שימוש בה בסעיף WHERE
של שאילתת SQL. לדוגמה, אפשר לסנן סרטים על פי תנאים ספציפיים, כגון הסרטים שיש להם שני שחקנים בצפיות או יותר וRate
גבוה מערך ערך מסוים.
SELECT
json_extract ( data, '$.Name' ) AS movie_name,
json_extract ( data, '$.Rate' ) AS movie_rate,
json_array_length ( json_extract ( data, '$.Cast' ) ) AS cast_size
FROM
movie
WHERE
json_array_length ( json_extract ( data, '$.Cast' ) ) >= 2
AND json_extract ( data, '$.Rate' ) > 8;
תוצאת השאילתה לעיל תהיה משהו כזה:
movie_name | movie_rate | cast_size |
---|---|---|
The Obsessed's Fairy | 9.5 | 2 |
שימוש בביטויי מסלול להוצאת ערכים ספציפיים מנתוני JSON ב-SQLite
ביטויי בתים יכולים לשמש לגשת לנתונים ג'יסון מקופלים בכתובת ספציפית זו. דוגמה זו מחזירה רשימה של כל סרט
במאים
שבמה סרט בסוג גנרי מסוים, כמו היסטוריה.
SELECT DISTINCT
json_extract ( data, '$.Director' ) AS movie_director
FROM
movie,
json_each ( json_extract ( data, '$.Genre' ) )
WHERE
value = 'History';
התוצאה של שאילתה לעיל תהיה משהו כזה:
movie_director |
---|
Simone Mikey Bryn |
4. איך לבדוק את תווית השיטה של הנתונים הג'יסוניים שלך ב-SQLite
בדיקת תבנית נתונים ג'יסוניים ב-SQLite היא דרך להבטיח את המבנה והעקביות של הנתונים שלך, לשפר בקרת שגיאות עתידית ולפשט שימוש בנתונים מורכבים. אמנם SQLite חסר פונקציות מובנות מאליהן לאימות תבנית, אך אפשר להשתמש בפונקציות הג'יסון שלו ובפונקציה בדיקה למטרה זו.
בדיקת מבנה ג'יסון עם json_type()
ו-בדיקה()
פונקציות SQLite
הפונקציה json_type()
יכולה לשמש לבדוק את סוג השדה בנתונים הג'יסוניים. לדוגמה, בנסיבות היצירה הקודמת של השולחן הסרט, נניח כאשר יוצרים את השולחן לאחסון נתונים ג'יסון של סרט, אתה רוצה להבטיח שלכל רשומה יש את השדות שמות ושנה, כאשר השנה היא מספר. לצורך זה, אפשר להשתמש באילוץ בדיקה עם הפונקציה json_type()
ביצירת השולחן:
CREATE TABLE movie ( data TEXT CHECK ( json_type ( data, '$.Name' ) IS NOT NULL AND json_type ( data, '$.Year' ) = 'integer' ) );
הנה json_type()
בודק את סוג השדות המסוימים בנתוני JSON שלך, השם והשנה. אם פעולת הזנה חדשה או עדכון מנסה להוסיף נתונים שבהם השם אינו קיים או שנה אינה מספר שלם, האילוץ CHECK() ייכשל והפעולה תידחה. זה עוזר לשמור על אמינות הנתונים של הנתונים ה-JSON שלך בטבלת הסרטים.
אימות נתוני JSON באמצעות הפונקציה json_valid()
ב-SQLite
הפונקציה json_valid()
בודקת את תקינות הנתונים ה-JSON מנקודת מבט של פורמט ה-JSON הסטנדרטי, ומספקת רמה של אימות תבנית. לדוגמה, כדי להבטיח את אמינות הנתונים ה-JSON לפני הזנה, ניתן לבצע בדיקות אימות כזו:
INSERT INTO movie ( data ) SELECT
'{"Name":"Naked of Truth","Year":1979}' AS movie_input
WHERE
json_valid ( movie_input );
בהצהרה זו, json_valid()
בודק האם המחרוזת JSON המוצגת תקינה. אם כן, הנתונים מוזנים לטבלת הסרטים ואם לא, הפעולה מומשקת. זהו אבטחה שמונעת מהזנת נתוני JSON שגויים.
בואו נבחן דוגמה נוספת המשלבת את שתי הכללים, האילוץ בשלב היצירה של טבלת הסרטים ובדיקת json_valid()
בפעולות ההזנה. בהתחשב בשאלה הבאה:
INSERT INTO movie ( data ) SELECT
'{"Year":"1979"}' AS movie_input
WHERE
json_valid ( movie_input );
תוצאת השאילתה הזו תהיה הודעת שגיאה "CHECK constraint failed" מאחר והערך המבוקש אינו כולל שדה שם ושדה השנה אינו מספר שלם, ולכן הכנסה תיכשל, למרות שהנתונים ה JSON שסופקים תקינים מבחינת JSON.
כמו כן, לשפר את וילות הווילוניה על נתוני JSON מורכבים ומקונגים, כדאי לשקול גם את ספריית JSONschema של פייתון.
5. כיצד לנהל נתוני JSON מקונגים ב-SQLite
ניווט בנתוני JSON מקונגים והיפר-היפררכיים ב-SQLite עשוי להציג בעיות מסוימות. עם זאת, פונקציות בניית ה-JSON הבנויות בתוך SQLite מקלות על התהליך ומקלים עליו. כאן, תוכלו לראות כמה אסטרטגיות לניהול נתוני JSON מקונגים ב-SQLite.
פריצה לתוך נתוני JSON היפררכיים באמצעות שאילתת SQL
פונקציות json_each()
ו-json_extract()
של SQLite יכולות לעזור לכם לנווט דרך שכבות ה-JSON המקונגים. שקול את השאילתה הזו שמשתמשת ב-json_each()
כדי לנתח את הנתונים וב-json_extract()
כדי למשוך באופן סלקטיבי את המידע הנדרש.
לדוגמה, השאילתה הזו תחפור לתוך מערך ה-Cast בכל רשומת JSON בשדה data
בטבלת movie
, ותרשום את ה-movies
שיש להם יותר משני חברי Cast
:
SELECT
key,
json_extract ( data, '$.Name' ) AS movie_name,
json_extract ( data, '$.Year' ) AS movie_year,
json_array_length ( json_extract ( data, '$.Cast' ) ) AS cast_size
FROM
movie,
json_each ( data )
WHERE
type = 'array'
AND cast_size > 2
GROUP BY
movie_name;
תוצאות השאילתה לעיל יהיו משהו כזה:
key | movie_name | movie_year | cast_size |
---|---|---|---|
Simone Mikey Bryn | Forgotten in the Planet | 1970 | 3 |
נavigating Through JSON Arrays by SQL Querying
אובייקטים JSON יכולים להחזיק מידע חשוב בצורת מערך, על ידי שימוש בjson_tree()
וjson_extract()
בשילוב, אפשר לעבור על מערכים מקוננים אלה ולהוציא מידע מהם.
לדוגמה, השאילתה זו משיגה את שמו של כל Actor
ממערך הקרות של כל רשומת הסרט:
SELECT
json_extract ( data, je.fullkey ) AS actor,
json_extract ( data, '$.Name' ) AS movie_name,
json_array_length ( data, '$.Cast' ) AS cast_size
FROM
movie,
json_tree ( data ) AS je
WHERE
( je.type = 'text' )
AND ( je.fullkey LIKE '%Cast%' );
תוצאת השאילתה זו תהיה זו:
actor | movie_name | cast_size |
---|---|---|
Adrian Gratianna | Forgotten in the Planet | 3 |
Tani O'Hara | Forgotten in the Planet | 3 |
Tessie Delisle | Forgotten in the Planet | 3 |
Dacy Dex Elsa | The Obsessed's Fairy | 2 |
Matilde Kenton Collins | The Obsessed's Fairy | 2 |
Margery Maximilianus Shirk | Last in the Kiss | 2 |
Harri Garwood Michelle | Last in the Kiss | 2 |
Adrian Gratianna | Forgotten in the Planet | 3 |
Tani O'Hara | Forgotten in the Planet | 3 |
Tessie Delisle | Forgotten in the Planet | 3 |
מש flattening JSON Data Using the json_each()
Function in SQLite
לפעמים, הפשטת מבנים JSON מקוננים על ידי השטח יכולה להיות גישה מעשית לפתרון שאילתות מורכבות נגד אובייקטים JSON. פונקציית json_tree()
של SQLite יכולה לשמש להשטח של אובייקטים JSON.
לדוגמה, השאילתה זו משתמשת בjson_tree()
להמרת הנתונים JSON לטבלה של זוגות ערך-מפתח, לגמרי משוטחת, השאילתה תשיג כל סוג ערך ראשוני, עובר גם במערכים ובאובייקטים, של הרשומה הראשונה של הסרט:
SELECT
jt.fullkey,
jt.key,
jt.value
FROM
movie,
json_tree ( data ) AS jt
WHERE
( jt.key<> '' )
AND ( jt.type IN ( 'integer', 'text', 'real' ) )
AND json_extract ( data, '$.ID' ) = 1
תוצאת השאילתה זו תהיה זו:
fullkey | key | value |
---|---|---|
$.ID | ID | 1 |
$.Name | Name | Forgotten in the Planet |
$.Year | Year | 1970 |
$.Genre[0] | 0 | Comedy |
$.Genre[1] | 1 | Crime |
$.Director | Director | Henrie Randell Githens |
$.Cast[0] | 0 | Adrian Gratianna |
$.Cast[1] | 1 | Tani O'Hara |
$.Cast[2] | 2 | Tessie Delisle |
$.Runtime | Runtime | 90 |
$.Rate | Rate | 7 |
על ידי אימוץ השיטות אלה, אפשר לנתח, לנהל ולפענח ביעילות נתוני JSON ב-SQLite, מה שהוגן עבור נתוני JSON מורכבים.
6. איך להשתמש באינדקסון לייעול שאילתות על נתוני JSON ב-SQLite
להדפסה של מידע JSON ב-SQLite היא דרך יעילה לייעל את פעולות החיפוש ולשפר ביצועים השאילתה, במיוחד עבור קבצי נתונים גדולים. על ידי יצירת אינדקס על פי תכונות JSON מסוימות, ניתן לזרז פעולות החיפוש על עמודת JSON באופן משמעותי.
העיקרון מאחורי הגישה הזו הוא פשוט. במקום לבצע סריקה מלאה של הטבלה ולנתח את ה-JSON עבור כל שורה, מה שיכול להיות צריך משאבים, SQLite יכול לנצל את ה-אינדקס כדי למצוא במהירות את שורות העניין.
כיצד להוסיף אינדקס SQL על נתוני JSON ב-SQLite
בואו נביא דוגמה מעשית עם קבצי סרט
. למשל, אם אתה מחפש לעתים קרובות סרטים לפי שם
, יצירת אינדקס על תכונה זו תהיה מועילה:
CREATE INDEX idx_name ON movie ( json_extract ( data, '$.item.Name' ) );
כאן, נתונים
היא העמודה עם הנתונים ה-JSON, ו-סרט
היא הטבלה. פונקציית json_extract()
מוציאה את שמות
של כל סרט
מהנתונים ה-JSON, ו-SQLite משתמש בערך זה כדי ליצור אינדקס.
פעם שאתה מריץ את השאילתה הזו והאינדקס נקבע, SQLite יכול לאחזר נתונים במהירות כשאתה משאילת על סרט לפי ה-שם
. השאילתה הזו תהיה מהירה בהרבה עם האינדקס idx_name במקום. לכן, הוספת אינדקסים לנתוני JSON ב-SQLite מציעה יכולות אופטימיזציה חזקות, מה שהופך אותו לדרך יעילה לנהל מערכים גדולים של נתוני JSON.
כיצד ליצור אינדקס אחד על שדות מרובים של נתוני JSON ב-SQLite
בואו נחשוב על דוגמה נוספת שבה ייתכן שתשאל בדרך כלל לנתונים מסוימים על פי יותר משדה אחד. לדוגמה, אם אתה חופשי לחפש אחר סרטים
לפי שם ושנה, יהיה מועיל ליצור אינדקס על תכונות אלו יחדיו. ב-SQLite, זה יכול להיעשות על ידי יצירת אינדקס על ביטוי מחושב:
CREATE INDEX idx_name_year ON movie ( json_extract ( data, '$.Item.Name' ), json_extract ( data, '$.Item.Year' ) );
שוב, כשהאינדקס הזה נקבע, SQLite יכול לאחזר נתונים במהירות כשאתה משאילת על סרט לפי שם ושנה.
7. תמיכת Json5 ב-SQLite
הJSON5 הוצג כדי לתמוך בכמה תחביר תואם ECMA ולהפוך את JSON לקצת יותר מתאים לשימוש כשפת הגדרות. SQLite הציג את התמיכה בגרסה המרוכבת של JSON5 בגרסה 3.42.0. בעוד שSQLite יכול לקרוא ולפענח טקסט JSON שכולל גרסאות JSON5, כל טקסט JSON שפונקציות SQLite מייצרות יתאפס בהגיון הקנוני של JSON. הנה כמה מהמאפיינים העיקריים שהגרסה המרוכבת של JSON5 מוסיפה לתמיכה בJSON ב-SQLite.
אובייקטים JSON עם הערות ב-SQLite JSON
JSON5 מאפשר ביטויים חד-שורתיים (//…) ורב-שורתיים (/…/). זה יכול להיות שימושי במיוחד להוספת הקשר או הסברים ישירות בתוך הנתונים שלך JSON. הנה דוגמה להערות באובייקטים JSON:
/* A
multi-line
comment
in JSON5 */
{
"key": "value" // A single-line comment in JSON5
}
מפתחות אובייקטים ללא ציטוטים ב-SQLite JSON
ב-JSON5, מפתחות האובייקט יכולים להיות מזוהים ללא ציטוט, מה שמפשט את התחביר של JSON שלך. עם זאת, �חשוב לציין שזה עשוי להגביל את ההתאמה עם מערכות המקבלות את תקני JSON באופן קיצוני.
{ key: "value" }
מחרוזות רב-שורתיות באובייקטים JSON
JSON5 תומך במחרוזות רב-שורתיות, שניתן להשיג על ידי ברירת כוכביות חדשות. זה שימושי כשמתעסקים עם מחרוזות גדולות או כשמסדרים את המחרוזת בפורמט קריא יותר.
{ key: "This is a \\\\\\\\ multiline string" }
Json5 מול ולידציה קנונית של JSON ב-SQLite
כאן, נעבור על שיטות האימות המלאות עבור אובייקטים JSON5 ו-JSON קנוניים, ונסביר את תמיכתם בדוגמאות של שאילתות SQL מדויקות במסד הנתונים SQLite.
כדי לקבוע אם מחרוזת היא תקינה ב-JSON5, תוכלו להשתמש בפונקציה json_error_position()
. פונקציה זו תחזיר ערך שאינו אפס אם המחרוזת אינה מוצקת היטב ב-JSON או JSON5. הנה דוגמה:
SELECT
json_error_position ( '{ key: "value"}' ) AS error_position;
התוצאה של שאילתה זו תהיה 0, מה שמעיד על כך שאין שגיאה מודעת כאן, למרות שהמפתח אינו מסומן בכפתורים מכיוון שזו הרחבה תקינה של JSON5.
error_position |
---|
0 |
מצד שני, כדי להמיר מחרוזת JSON5 ל-JSON קנוני, תוכלו להשתמש בפונקציה json()
. בעוד שפונקציה זו מזהה ומעבדת קלט JSON5, היא תוציא רק JSON קנוני. זה מאפשר סנכרון אחורי עם מערכות שמצפות ל-JSON קנוני. הנה דוגמה:
SELECT
JSON ( '{key: "value"}' ) AS canonical_json;
התוצאה של שאילתה זו תהיה JSON קנוני, המומר מפורמט JSON5, מה שגרם לכפיית המפתח כאן:
canonical_json |
---|
{"key": "value"} |
עם זאת, שימו לב שפונקציה json_valid()
תמשיך לדווח שקרי לקלטים שאינם JSON קנוניים, אפילו אם הקלט הוא JSON5 תקין. זו הבחנה חשובה כשעובדים גם עם JSON קנוני וגם JSON5 ב-SQLite. לדוגמה, שקול את השאילתה הבאה:
SELECT
json_valid ( '{key: "value"}' ) AS valid_json;
התוצאה של שאילתה זו תהיה 0, מה שמעיד על כך שזה אינו JSON תקין מכיוון שיש לו מפתח לא מסומן בכפתורים, מה שהוא הפרה של פורמט JSON קנוני:
valid_json |
---|
{"key": "value"} |
8. טעויות נפוצות ופתרון בעיות בעבודה עם JSON ב-SQLite
עיבוד נתוני JSON ב-SQLite כרוך בכמה מלכודות נפוצות שניתן להימנע מהן באמצעות הבנה עמוקה יותר של האופן הספציפי של המנגנונים, כגון השימוש הנכון בפונקציות. הנה מספר שיקולים מרכזיים.
איך לבדוק שגיאות תחביר בנתוני JSON בשלב הפירוק של JSON ב-SQLite
נתוני JSON חייבים להיות מתואמים באופן נכון ולעמוד בתחביר ספציפיסטנדרטי תחביר כדי להיות מפורקים ומעובדים במסד הנתונים של SQLite. אם מחרוזת ה-JSON שלך מותאמת לא נכון, SQLite לא תוכל לפענח אותה, וכך תתרחש שגיאות. לדוגמה, ייתכן שיש לך סוגריים שאינם מתאימים, שימוש לא נכון בכמותיות, או פסאודים מוזרקים.
SQLite מספק את הפונקציהjson_valid()
לאימות מחרוזת JSON, כפי שנובע מהשם. הפונקציהjson_valid()
מחזירה אחד אם הקלט הוא מחרוזת JSON בנויה היטב ואפס אחרת. הנה דוגמה:
SELECT json_valid('{"Name":"Naked of Truth","Year":1979}');
במקרה של שגיאת תחביר במחרוזת JSON, ניתן להשתמש בפונקציהjson_error_position()
כדי לזהות את המיקום במחרוזת שבו התרחשה השגיאה:
SELECT json_error_position('{"Name":"Naked of Truth","Year":1979}');
שימוש לא נכון בפונקציות JSON בעת שאילתה נגד נתוני JSON
שימוש לא נכון בפונקציות JSON הוא בעיה נפוצה נוספת, ולכן חשוב להבין היטב את פונקציות ה-JSON ואת שימושן ב-SQLite על מנת לנהל נתונים בהצלחה. לדוגמה, שימוש בנתיב שגוי או חוסר קשר למערכים מדגדרים ב-SQLite עשוי להוביל לשגיאות או לאיחזור נתונים לא נכונים.
אין תמיכה ב-BLOB בפונקציות JSON של SQLite
חשוב לוודא שאינך מנסה להשתמש ב-BLOBs עם פונקציות JSON ב-SQLite מכיוון שכל פונקציות ה-JSON ב-SQLite כרגע משגיחות שגיאה אם כל אחד מארגומנטיהם הוא BLOB ולא קלט JSON תקין. SQLite לא תומכת כרגע בכל קידוד בינארי של JSON, בעוד שזו שיפור עתידי אפשרי.
כיצד לבצע אימות JSON בעת שאילתת נתוני JSON ב-SQLite
הפונקציה json()
ב-SQLite משמשת בעיקר לאימות הפירוט ה-JSON של מחרוזת על ידי הוספת ציטוטים, הסרת דמויות חייבת התאמה וכו '. השימוש בפונקציה json()
באופן שגוי עשוי לגרום לחוסר בתפיסת שגיאות ולכאוס נתונים אפשרי.
עם זאת, היא אינה מיועדת לאימות JSON. לאימות מחרוזת JSON או למציאת שגיאת תחביר, השתמש בפונקציות json_valid()
ו-json_error_position()
כפי שנדון קודם.
סיכום
במדריך המקיף זה, טיילנו בשילוב העוצמתי של JSON ו-SQLite, וסיפקנו תובנות להזדמנויות הרחבות שנותנת השילוב הזה. התחלנו עם סקירה של פונקציות JSON של SQLite וכן השתמשנו בדוגמאות שאילתת SQL מפורטות.
בחנו טכניקות שאילתה מתקדמות כמו התמודדות עם נתוני JSON מדרגתיים בתוך SQLite. המסע התעמק לתוך המכניקה של פיענוח וניהול נתוני JSON, והדגיש את השימושיות של פונקציות SQLite כמו json_each()
ו-json_tree()
. דנו גם בערכו של שטחת הנתונים של JSON לניהול נתונים יעיל.
לאחר מכן, עברנו לתחום משמעותי שלעיתים נזרק מהראש: קידום ביצועים באמצעות אינדקסון. האופטימיזציה החזקה הזו יכולה להאיץ באופן משמעותי את ביצועי השאילתה ולשפר את חווית SQLite שלך עם JSON. נדונה גם הרחבת JSON5 המודרנית, המביאה יותר גמישות לפורמט נתוני JSON שלך.
לבסוף, דנו בכמה טעויות נפוצות וטיפים לפתרון בעיות כדי לחלץ את המסע שלך דרך JSON ב-SQLite, ולחזק את החשיבות של תחביר JSON נכון והשימוש הנכון בפונקציות SQLite ל-JSON.
זיכרו, למידה וניסוי הם המפתחות לשחרור הפוטנציאל המלא של JSON ב-SQLite. כשאתם מיישמים את הטכניקות הללו בפרויקטים שלכם, שתף את חוויותיך כדי לעזור לאחרים במסע דומה. אז, בואו נמשיך ללמוד ולדחוף גבולות עם JSON ב-SQLite. שימו לב לשימוש הטוב ב-JSON!
Source:
https://dzone.com/articles/how-to-master-advanced-json-querying-in-sqlite