כיצד להתמחות בחיפוש מתקדם ב-JSON ב-SQLite

במאמר הקודם, למידת היסודות: איך להשתמש ב-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, כרשומה שתשמש לשם החקירה:

A sample JSON file which is generated in Dadroit JSON Generator, and opened in Dadroit JSON Viewer

אפשר להכניס את הנתונים לטבלה בשם 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