it-swarm-tr.com

Bazı SQLite3 tablolarının verilerini nasıl atarım?

Bir veritabanındaki bazı SQLite3 tablolarının (tüm tabloların değil) şemasını değil, verilerini ve yalnızca verilerini nasıl atabilirim? Döküm, daha sonra veritabanına kolayca yeniden girilmesi ve komut satırından yapılması gerektiği gibi SQL biçiminde olmalıdır. Gibi bir şey

sqlite3 db .dump

ancak şema dökümü ve dökülecek tabloları seçmeden.

170
pupeno

Atılan dosyayla ne yapmak istediğini söylemiyorsun.

Hemen hemen her şeye içe aktarabileceğim bir CSV dosyası almak için aşağıdakileri kullanırdım

.mode csv 
-- use '.separator SOME_STRING' for something other than a comma.
.headers on 
.out file.csv 
select * from MyTable;

Farklı bir SQLite veritabanına tekrar yerleştirmek istiyorsanız:

.mode insert <target_table_name>
.out file.sql 
select * from MyTable;
207
CyberFonic

Bunu .schema ve .dump komutlarının farkını alarak yapabilirsiniz. örneğin grep ile:

sqlite3 some.db .schema > schema.sql
sqlite3 some.db .dump > dump.sql
grep -vx -f schema.sql dump.sql > data.sql

data.sql dosyası sadece şema içermeyen verileri içerecektir, şunun gibi:

BEGIN TRANSACTION;
INSERT INTO "table1" VALUES ...;
...
INSERT INTO "table2" VALUES ...;
...
COMMIT;

Umarım bu sana yardımcı olur.

144
jellyfish

En iyi yol değil, ancak kira kontratında harici araçlara ihtiyaç yok (yine de * nix kutularında standart olan grep hariç)

sqlite3 database.db3 .dump | grep '^INSERT INTO "tablename"'

ancak aradığınız her tablo için bu komutu yapmanız gerekir.

Bunun şema içermediğine dikkat edin.

37
polyglot

.Dump special komutuna bir veya daha fazla tablo argümanı belirleyebilirsiniz, örneğin, g ._sqlite3 db ".dump 'table1' 'table2'"_.

34
Paul Egan

CREATE satırlarını dışlamak veya sadece INSERT satırlarını sqlite3 $DB .dump çıktısından almak için grep kullanılmasını öneren herhangi bir cevap fena halde başarısız olur. CREATE TABLE komutları satır başına bir sütun listeler (bu nedenle CREATE bunların hepsini alamaz) ve INSERT satırlarındaki değerler gömülü yeni satırlara sahip olabilir (bu nedenle alamazsınız) sadece INSERT satırları).

for t in $(sqlite3 $DB .tables); do
    echo -e ".mode insert $t\nselect * from $t;"
done | sqlite3 $DB > backup.sql

Sqlite3 sürüm 3.6.20 üzerinde test edilmiştir.

Bazı tabloları hariç tutmak istiyorsanız, onları $(sqlite $DB .tables | grep -v -e one -e two -e three) ile filtreleyebilirsiniz veya belirli bir altküme almak istiyorsanız, bunu one two three ile değiştirin.

10
retracile

Paul Egan'ın cevabındaki bir gelişme olarak, bu şu şekilde başarılabilir:

sqlite3 database.db3 '.dump "table1" "table2"' | grep '^INSERT'

--veya--

sqlite3 database.db3 '.dump "table1" "table2"' | grep -v '^CREATE'

Dikkat, tabii ki, grep takmış olmanız gerektiğidir.

8
Drew

Python veya Java veya herhangi bir üst seviye dilde .dump çalışmıyor. CSV’ye dönüşümü elle kodlamamız gerekiyor. Bir Python örneği verdim. Diğerleri, örnekler takdir olurdu:

from os import path   
import csv 

def convert_to_csv(directory, db_name):
    conn = sqlite3.connect(path.join(directory, db_name + '.db'))
    cursor = conn.cursor()
    cursor.execute("SELECT name FROM sqlite_master WHERE type='table';")
    tables = cursor.fetchall()
    for table in tables:
        table = table[0]
        cursor.execute('SELECT * FROM ' + table)
        column_names = [column_name[0] for column_name in cursor.description]
        with open(path.join(directory, table + '.csv'), 'w') as csv_file:
            csv_writer = csv.writer(csv_file)
            csv_writer.writerow(column_names)
            while True:
                try:
                    csv_writer.writerow(cursor.fetchone())
                except csv.Error:
                    break

'Panel verileriniz varsa, başka bir deyişle, kimliği olan birçok bireysel giriş bunu görünümle ekler ve ayrıca özet istatistikleri de döker:

        if 'id' in column_names:
            with open(path.join(directory, table + '_aggregate.csv'), 'w') as csv_file:
                csv_writer = csv.writer(csv_file)
                column_names.remove('id')
                column_names.remove('round')
                sum_string = ','.join('sum(%s)' % item for item in column_names)
                cursor.execute('SELECT round, ' + sum_string +' FROM ' + table + ' GROUP BY round;')
                csv_writer.writerow(['round'] + column_names)
                while True:
                    try:
                        csv_writer.writerow(cursor.fetchone())
                    except csv.Error:
                        break 
6

SQLite İçin Komut Satırı Kabuğ için SQLite dokümantasyonuna göre, bir SQLite tablosunu (veya tablonun bir bölümünü) CSV olarak dışa aktarabilirsiniz, sadece "mod" u "csv" ye ayarlayıp sonra tablonun istenen satırlarını çıkarmak için sorgu:

sqlite> .header on
sqlite> .mode csv
sqlite> .once c:/work/dataout.csv
sqlite> SELECT * FROM tab1;
sqlite> .exit

Ardından, CSV (virgülle ayrılmış değer) verilerini bir SQLite tablosuna içe aktarmak için ".import" komutunu kullanın:

sqlite> .mode csv
sqlite> .import C:/work/dataout.csv tab1
sqlite> .exit

Lütfen dikkate almanız gereken iki durum hakkında daha fazla dokümantasyon okuyun: (1) "tab1" tablosu daha önce mevcut değil ve (2) "tab1" tablosu zaten mevcut.

4
PeterCo

En iyi yöntem şema bölümleri hariç olmak üzere sqlite3 db dökümü kodunun alınmasıdır.

Örnek sözde kodu:

SELECT 'INSERT INTO ' || tableName || ' VALUES( ' || 
  {for each value} ' quote(' || value || ')'     (+ commas until final)
|| ')' FROM 'tableName' ORDER BY rowid DESC

Bakınız: gerçek kod için src/Shell.c:838 (sqlite-3.5.9 için)

Sadece bu Shell'i alıp şema parçalarını yorumlayıp onu kullanabilirsiniz.

3
harningt

Diğer olası çözümlerin gözden geçirilmesi

Yalnızca INSERT’leri dahil et

sqlite3 database.db3 .dump | grep '^INSERT INTO "tablename"'

Uygulaması kolaydır, ancak sütunlarınızdan herhangi biri yeni satırlar içeriyorsa başarısız olur

SQLite ekleme modu

for t in $(sqlite3 $DB .tables); do
    echo -e ".mode insert $t\nselect * from $t;"
done | sqlite3 $DB > backup.sql

Bu Güzel ve özelleştirilebilir bir çözümdür, ancak sütunlarınızın spatialite içinde 'Geometry' tipi gibi blob nesneleri varsa işe yaramaz

Dökümü şemaya göre dağıtın

sqlite3 some.db .schema > schema.sql
sqlite3 some.db .dump > dump.sql
grep -v -f schema.sql dump > data.sql

Neden olduğundan emin değilim, ama benim için çalışmıyor

Başka (yeni) bir olası çözüm

Muhtemelen bu sorunun en iyi cevabı yoktur, fakat benim için çalışan bir tanesi sütun değerlerinde yeni satırlar olduğunu dikkate alan ekleri bir bu gibi bir ifade ile

grep -Pzo "(?s)^INSERT.*\);[ \t]*$"

Tabloları seçmek için atıldı .dump, tablo adlarını eşleştirmek için bir LIKE argümanını itiraf eder, ancak bu yeterli değilse, basit bir komut dosyası daha iyi bir seçenek olabilir.

TABLES='table1 table2 table3'

echo '' > /tmp/backup.sql
for t in $TABLES ; do
    echo -e ".dump ${t}" | sqlite3 database.db3 | grep -Pzo "(?s)^INSERT.*?\);$" >> /tmp/backup.sql
done

veya, yabancı anahtarlara saygı duymak ve tüm çöplüğü tek bir işlemde kapamak için daha ayrıntılı bir şey

TABLES='table1 table2 table3'

echo 'BEGIN TRANSACTION;' > /tmp/backup.sql
echo '' >> /tmp/backup.sql
for t in $TABLES ; do
    echo -e ".dump ${t}" | sqlite3 $1 | grep -Pzo "(?s)^INSERT.*?\);$" | grep -v -e 'PRAGMA foreign_keys=OFF;' -e 'BEGIN TRANSACTION;' -e 'COMMIT;' >> /tmp/backup.sql
done

echo '' >> /tmp/backup.sql
echo 'COMMIT;' >> /tmp/backup.sql

Grep ifadesinin, );, sütunların herhangi birinde bulunan bir dize olduğunda başarısız olacağını dikkate alın

Geri yüklemek için (önceden oluşturulmuş tabloların bulunduğu bir veritabanında)

sqlite3 -bail database.db3 < /tmp/backup.sql
3
Francisco Puga

Bu sürüm ekler içindeki yeni satırlarla iyi çalışır:

sqlite3 database.sqlite3 .dump | grep -v '^CREATE'

Uygulamada, CREATE ile başlayan ve yeni satırlar içermesi daha düşük olan tüm satırları kapsamaz.

2
Elia Schito

Retracile tarafından cevap en yakın olan olmalı, ancak bu benim durumum için işe yaramıyor. Bir ekleme sorgusu tam ortada kırdı ve dışa aktarma durdu. Sebebinin ne olduğundan emin değilim. Ancak .dump sırasında iyi çalışıyor.

Sonunda .dump: 'dan üretilen SQL' u bölmek için bir araç yazdım:

https://github.com/motherapp/sqlite_sql_parser/

0
Walty Yeung