ייצוא הוא עבודה של המעטפת, לא פקודת SQL
ל-SQLite אין COPY ... TO או SELECT INTO OUTFILE כמו ב-Postgres או ב-MySQL. ייצוא נתונים נעשה במעטפת שורת הפקודה sqlite3, בעזרת פקודות נקודה: .mode, .headers, .output, .dump. ברגע שמכירים את ארבע אלה, אפשר להפיק CSV, JSON, טקסט פשוט או dump מלא של SQL מכל מסד נתונים.
המודל המנטלי: אתם אומרים למעטפת איך לעצב את התוצאות (.mode), האם לכלול שמות עמודות (.headers) ולאן לשלוח את הפלט (.output). אחר כך מריצים שאילתה, והתוצאות שלה נוחתות בקובץ.
בואו ניצור מסד נתונים קטנטן להתנסות:
שלוש שורות, ארבע עמודות. נייצא את זה בכמה פורמטים.
CSV: .mode csv עם כותרות
CSV הוא פורמט הייצוא הנפוץ ביותר: גיליונות אלקטרוניים, צינורות נתונים ורוב הכלים האחרים מדברים בו. בתוך מעטפת sqlite3:
sqlite> .mode csv
sqlite> .headers on
sqlite> .output users.csv
sqlite> SELECT * FROM users;
sqlite> .output stdout
מה קרה כאן:
.mode csvמעצב כל שורה כערכים מופרדים בפסיקים, ומקיף במירכאות שדות שמכילים פסיקים, מירכאות או ירידות שורה..headers onמוסיף שורה ראשונה עם שמות העמודות. בלי זה, ל-CSV שלכם אין כותרת, ובדרך כלל זה לא מה שאתם רוצים..output users.csvמפנה את התוצאות לקובץ. מהנקודה הזו פלט השאילתות הולך לשם במקום למסך.- ה-
SELECTרץ וכותב לקובץ בשקט. .output stdoutמחזיר את הפלט לטרמינל כדי שתוכלו לראות את התוצאות של השאילתה הבאה.
הקובץ שמתקבל:
id,name,email,signup_date
1,"Ada Lovelace",ada@example.com,2025-01-15
2,"Boris Johnson",boris@example.com,2025-02-03
3,"Carmen Diaz",carmen@example.com,2025-03-22
אפשר לייצא את התוצאה של כל שאילתה, לא רק טבלאות שלמות: סננו, חברו, צברו, ואז הפנו את הפלט:
sqlite> .output recent_users.csv
sqlite> SELECT name, email FROM users WHERE signup_date >= '2025-02-01';
sqlite> .output stdout
שורה אחת מהמעטפת
לא חייבים להיכנס למעטפת האינטראקטיבית בכלל. העבירו בצינור את פקודות הנקודה ואת ה-SQL ל-sqlite3 ממעטפת מערכת ההפעלה:
sqlite3 mydb.sqlite <<EOF
.headers on
.mode csv
.output users.csv
SELECT * FROM users;
EOF
זו הצורה שתרצו לסקריפטים ולמשימות cron: ניתנת לחזרה, בלי הקלדה ידנית. ה-.output מקומי לסשן, כך שהוא לא משאיר מצב בשום מקום.
JSON: .mode json
לייצוא שמיועד לאפליקציית ווב או לכלי שצורך JSON, .mode json מפיק מערך של אובייקטים, אחד לכל שורה:
sqlite> .mode json
sqlite> .output users.json
sqlite> SELECT * FROM users;
sqlite> .output stdout
הקובץ:
[{"id":1,"name":"Ada Lovelace","email":"ada@example.com","signup_date":"2025-01-15"},
{"id":2,"name":"Boris Johnson","email":"boris@example.com","signup_date":"2025-02-03"},
{"id":3,"name":"Carmen Diaz","email":"carmen@example.com","signup_date":"2025-03-22"}]
ב-JSON הכותרות מובלעות (המפתחות), ולכן .headers לא רלוונטי כאן. אם אתם רוצים מבנה מותאם, כמו אובייקטים מקוננים או שדות עם שמות אחרים, בנו אותו בתוך השאילתה עם json_object():
כך מקבלים מחרוזת JSON לכל שורה עם שליטה מלאה על המבנה. שלבו עם json_group_array() כדי לגלגל את כל התוצאה למסמך JSON יחיד.
dump מלא של SQL: .dump
.dump שונה במהותו מ-CSV או מ-JSON. הוא מפיק קובץ .sql שמכיל את הסכמה וגם את כל הנתונים כפקודות CREATE TABLE ו-INSERT, מספיק כדי לבנות מחדש את מסד הנתונים מריק:
sqlite3 mydb.sqlite .dump > backup.sql
קטע ממה שיוצא:
PRAGMA foreign_keys=OFF;
BEGIN TRANSACTION;
CREATE TABLE users (
id INTEGER PRIMARY KEY,
name TEXT NOT NULL,
email TEXT NOT NULL,
signup_date TEXT NOT NULL
);
INSERT INTO users VALUES(1,'Ada Lovelace','ada@example.com','2025-01-15');
INSERT INTO users VALUES(2,'Boris Johnson','boris@example.com','2025-02-03');
INSERT INTO users VALUES(3,'Carmen Diaz','carmen@example.com','2025-03-22');
COMMIT;
השחזור הוא הפעולה ההפוכה: העבירו את הקובץ בחזרה בצינור למסד נתונים חדש:
sqlite3 restored.sqlite < backup.sql
.dump הוא הכלי הנכון לגיבויים, לתמונות מצב של נתוני בדיקה בניהול גרסאות ולהעברה בין מחשבים. הוא שומר על אינדקסים, טריגרים, views, כל מה שיש בסכמה.
dump של טבלה בודדת
.dump מקבל שם טבלה (או תבנית) כדי להגביל את הפלט:
sqlite3 mydb.sqlite ".dump users" > users_only.sql
זה מייצא רק את הסכמה והשורות של הטבלה users. שימושי כשרוצים להעתיק טבלה אחת למסד נתונים אחר בלי לגרור איתה את כל השאר. אפשר גם להשתמש בתבנית: .dump 'log_%' מייצא כל טבלה שמתחילה ב-log_.
סכמה בלי נתונים
לפעמים רוצים את המבנה בלי השורות: לתיעוד, לסביבת פיתוח נקייה או להשוואת סכמות בין מסדי נתונים. .schema מדפיס רק את פקודות ה-CREATE:
sqlite3 mydb.sqlite .schema > schema.sql
צרפו שם טבלה כדי לקבל רק אחת:
sqlite3 mydb.sqlite ".schema users" > users_schema.sql
הפלט הוא SQL פשוט, CREATE TABLE, CREATE INDEX, CREATE TRIGGER, מוכן להרצה מול מסד נתונים ריק.
מצבים שימושיים נוספים
ל-.mode יש יותר אפשרויות מ-CSV ו-JSON. כמה ששווה להכיר:
.mode column -- עמודות מיושרות, נוח לקריאה בטרמינל
.mode markdown -- מופרד בקווים אנכיים, טבלאות שמתאימות ל-GitHub
.mode html -- פלט של <table> ב-HTML
.mode tabs -- ערכים מופרדים בטאבים (TSV)
.mode insert users -- מפיק פקודות INSERT עבור הטבלה שצוינה
.mode quote -- ערכים במירכאות בסגנון SQL, שימושי לבדיקה
.mode markdown מצוין להדבקת תוצאות שאילתה ב-README או ב-pull request. .mode insert <table> הוא דרך מהירה לייצר נתוני seed: הריצו SELECT, תפסו את פקודות ה-INSERT והדביקו אותן בקובץ fixture.
sqlite> .mode insert users
sqlite> .output seed.sql
sqlite> SELECT * FROM users WHERE signup_date >= '2025-02-01';
sqlite> .output stdout
כמה הערות מעשיות
.output stdout(או.outputבלי ארגומנט) מחזיר את הפלט לטרמינל. אם תשכחו, התוצאות של השאילתה הבאה ייעלמו בשקט לתוך הקובץ.- ייצוא ל-CSV לא שומר על טיפוסים. הכול הופך לטקסט בקובץ, וייבוא חוזר דורש סכמת יעד כדי לפרש אותו. השתמשו ב-
.dumpאם חשוב לכם להעביר את הנתונים הלוך ושוב למסד SQLite אחר. - ייצוא גדול מוזרם.
.outputכותב שורות תוך כדי שהן מופקות, כך שאפשר לייצא טבלאות גדולות מה-RAM בלי בעיה. - לגיבוי חם של מסד נתונים פעיל,
.dumpעובד, אבל הפקודה הייעודית.backup(עליה נדבר בהמשך תוכנית הלימודים) מהירה ובטוחה יותר, כי היא משתמשת ב-API של הגיבוי המקוון של SQLite.
הצעד הבא: שליפת נתונים
עכשיו יש לכם תמונה מלאה של כתיבת נתונים: INSERT, UPDATE, DELETE, UPSERT, RETURNING, ייבוא מ-CSV וייצוא החוצה. הבא בתור הוא החצי השני של העבודה עם מסד נתונים: קריאת נתונים ביעילות. בפקודה SELECT תבלו את רוב הזמן, והיא הנושא של העמוד הבא.
שאלות נפוצות
איך מייצאים טבלת SQLite ל-CSV?
במעטפת sqlite3, עברו למצב CSV, הפעילו כותרות, הפנו את הפלט לקובץ והריצו שאילתה: .mode csv, .headers on, .output users.csv, ואז SELECT * FROM users;. אחר כך הריצו .output stdout כדי להחזיר את התוצאות לטרמינל.
מה ההבדל בין .dump לייצוא ל-CSV?
.dump מפיק קובץ .sql שמכיל פקודות CREATE TABLE ופקודות INSERT: כל מה שצריך כדי לבנות את מסד הנתונים מחדש מאפס. CSV מייצא רק את השורות של שאילתה או טבלה אחת, בלי סכמה. השתמשו ב-.dump לגיבויים ולמיגרציות, וב-CSV כדי להעביר נתונים לגיליונות אלקטרוניים או לכלים אחרים.
אפשר לייצא תוצאות שאילתה של SQLite ל-JSON?
כן. אפשר להגדיר .mode json במעטפת ולהריץ כל SELECT, או להשתמש בפונקציות המובנות json_object() ו-json_group_array() כדי לבנות JSON בתוך השאילתה. הגישה של .mode json פשוטה יותר לייצוא חד-פעמי; הגישה של הפונקציות נותנת שליטה מלאה על המבנה.