Bagaimana cara membuang data, dan hanya data, bukan skema, dari beberapa tabel SQLite3 dari database (tidak semua tabel)? Dump harus dalam format SQL, karena harus dengan mudah dimasukkan kembali ke dalam database nanti dan harus dilakukan dari baris perintah. Sesuatu seperti
sqlite3 db .dump
tetapi tanpa membuang skema dan memilih tabel mana yang akan dibuang.
Jawaban:
Anda tidak mengatakan apa yang ingin Anda lakukan dengan file yang dibuang.
Saya akan menggunakan yang berikut ini untuk mendapatkan file CSV, yang dapat saya impor ke hampir semuanya
Jika Anda ingin memasukkan kembali ke dalam database SQLite yang berbeda maka:
sumber
Anda dapat melakukan ini dengan mendapatkan perbedaan perintah .schema dan .dump. misalnya dengan grep:
data.sql
file hanya akan berisi data tanpa skema, seperti ini:Saya harap ini membantu Anda.
sumber
sqlite3 some.db < data.sql
sqlite3 storage/db/jobs.s3db .schema jobs > schema.sql
tidak bekerja, tetapiecho '.schema' jobs | sqlite3 storage/db/jobs.s3db > schema.sql
bekerja dengan baik);
, dan grep menghapus semua baris yang berisi);
Menambahkan-x
opsi untuk grep menyelesaikan masalah ini.Bukan cara terbaik, tetapi setidaknya tidak memerlukan alat eksternal (kecuali grep, yang merupakan standar pada * nix box)
tetapi Anda perlu melakukan perintah ini untuk setiap tabel yang Anda cari.
Perhatikan bahwa ini tidak termasuk skema.
sumber
sqlite3 Database.s3db .dump
grep -v '^CREATE'
seperti yang disarankan dalam salah satu jawaban laingrep -v '^CREATE;
akan rusak jikaCREATE
pernyataan memiliki garis istirahat di dalamnya (yang kadang-kadang mereka lakukan). Terbaik, IMO, tidak secara otomatis menghapusCREATE
pernyataan sama sekali, tetapi secara manual mengeditnya. Cukup gunakan editor teks apa pun yang Anda butuhkan, dan cariCREATE
dan hapus secara manual pernyataan-pernyataan itu. Selama databasenya tidak besar (dan karena Anda menggunakan sqlite, saya kira itu catatan), maka ini cukup sederhana.Anda bisa menentukan satu atau lebih argumen tabel ke perintah khusus .dump, mis
sqlite3 db ".dump 'table1' 'table2'"
.sumber
sqlite3 3.31.1 (2020/01/27)
. The changelog mengatakan apa-apa tentang itu. (Ngomong-ngomong,--preserve-rowids
itu bekerja tetapi tidak didokumentasikan sama sekali.)Setiap jawaban yang menyarankan penggunaan grep untuk mengecualikan
CREATE
garis atau hanya mengambilINSERT
garis darisqlite3 $DB .dump
output akan gagal parah. TheCREATE TABLE
daftar perintah satu kolom per baris (sehingga tidak termasukCREATE
tidak akan mendapatkan semua itu), dan nilai-nilai padaINSERT
baris dapat memiliki baris baru tertanam (sehingga Anda tidak bisa ambil hanyaINSERT
garis).Diuji pada sqlite3 versi 3.6.20.
Jika Anda ingin mengecualikan tabel tertentu Anda dapat memfilternya
$(sqlite $DB .tables | grep -v -e one -e two -e three)
, atau jika Anda ingin mendapatkan subset tertentu ganti denganone two three
.sumber
Sebagai peningkatan pada jawaban Paul Egan, ini dapat dicapai sebagai berikut:
--atau--
Peringatannya, tentu saja, adalah bahwa Anda harus menginstal grep.
sumber
cat database.sql | grep '^INSERT' > database_inserts.sql
grep '^CREATE'
grep '^INSERT' < database.sql > database_inserts.sql
bahwacat
adalah berlebihancat
dasarnya tidak ada biaya untuk mengeksekusi dan membuat rantai dari input ke output lebih jelas. Tentu saja, Anda juga bisa menulis< database.sql grep '^INSERT' ...
tetapi pipa eksplisit lebih mudah dibaca.Dalam Python atau Java atau bahasa tingkat tinggi apa pun. Dump tidak berfungsi. Kita perlu mengkodekan konversi ke CSV dengan tangan. Saya memberikan contoh Python. Lainnya, contoh akan dihargai:
Jika Anda memiliki 'data panel, dengan kata lain banyak entri individual dengan id menambahkan ini ke tampilan with dan juga membuang statistik ringkasan:
sumber
Menurut dokumentasi SQLite untuk Command Line Shell For SQLite Anda dapat mengekspor tabel SQLite (atau bagian dari tabel) sebagai CSV, cukup dengan mengatur "mode" ke "csv" dan kemudian menjalankan kueri untuk mengekstrak baris yang diinginkan dari meja:
Kemudian gunakan perintah ".import" untuk mengimpor data CSV (comma separated value) ke dalam tabel SQLite:
Silakan baca dokumentasi lebih lanjut tentang dua kasus untuk mempertimbangkan: (1) Tabel "tab1" sebelumnya tidak ada dan (2) tabel "tab1" sudah ada.
sumber
Metode terbaik adalah dengan mengambil kode dump sqlite3 db akan lakukan, tidak termasuk bagian skema.
Contoh kode semu:
Lihat:
src/shell.c:838
(untuk sqlite-3.5.9) untuk kode aktualAnda bahkan mungkin hanya mengambil shell itu dan mengomentari bagian skema dan menggunakannya.
sumber
Tinjau solusi lain yang mungkin
Sertakan hanya INSERT
Mudah diimplementasikan tetapi akan gagal jika salah satu kolom Anda menyertakan baris baru
Mode penyisipan SQLite
Ini adalah solusi yang bagus dan dapat disesuaikan, tetapi tidak berfungsi jika kolom Anda memiliki objek gumpalan seperti tipe 'Geometri' dalam spasial
Bedakan dengan skema
Tidak yakin mengapa, tetapi tidak berhasil untuk saya
Solusi (baru) lainnya yang mungkin
Mungkin tidak ada jawaban terbaik untuk pertanyaan ini, tetapi salah satu yang berfungsi untuk saya adalah ambil sisipan dengan mempertimbangkan baris baru di kolom yang bernilai dengan ekspresi seperti ini
Untuk memilih tabel jangan dibuang
.dump
mengakui argumen LIKE untuk mencocokkan nama tabel, tetapi jika ini tidak cukup mungkin skrip sederhana adalah pilihan yang lebih baikatau, sesuatu yang lebih rumit untuk menghormati kunci asing dan merangkum semua dump hanya dalam satu transaksi
Mempertimbangkan bahwa ekspresi grep akan gagal jika
);
ada string di salah satu kolomUntuk mengembalikannya (dalam database dengan tabel sudah dibuat)
sumber
Versi ini berfungsi baik dengan baris baru di dalam sisipan:
sqlite3 database.sqlite3 .dump | grep -v '^CREATE'
Dalam praktiknya mengecualikan semua baris yang dimulai dengan
CREATE
yang cenderung mengandung baris barusumber
Jawaban dengan retracile haruslah jawaban yang paling dekat, tetapi tidak berhasil untuk kasus saya. Satu permintaan memasukkan baru saja putus di tengah dan ekspor hanya berhenti. Tidak yakin apa alasannya. Namun itu berfungsi dengan baik selama
.dump
.Akhirnya saya menulis alat untuk membagi SQL yang dihasilkan dari
.dump
:https://github.com/motherapp/sqlite_sql_parser/
sumber
Anda bisa melakukan pilih pada tabel memasukkan koma setelah setiap bidang untuk menghasilkan csv, atau menggunakan alat GUI untuk mengembalikan semua data dan menyimpannya ke csv.
sumber