如何转储数据库的一些SQLite3表(而不是所有表)的数据,并且只转储数据,而不转储模式? 转储应该是SQL格式的,因为它以后可以很容易地重新输入到数据库中,并且应该从命令行完成。类似的

sqlite3 db .dump

但是没有转储模式和选择要转储的表。


当前回答

这个版本在插入的换行中工作得很好:

数据库sqlite3。sqlite3 .dump | grep '^CREATE'

实际上排除了所有以CREATE开头的行,这样不太可能包含换行符

其他回答

你可以获取.schema和.dump命令的不同。例如,使用grep:

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

数据。SQL文件将只包含没有模式的数据,就像这样:

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

您可以为.dump特殊命令指定一个或多个表参数,例如sqlite3 db "。Dump 'table1' 'table2' '”。

不是最好的方法,但至少不需要外部工具(除了grep,它是*nix盒子上的标准)

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

但是您确实需要为您正在寻找的每个表执行这个命令。

注意,这不包括模式。

在Python或Java或任何高级语言中。dump不起作用。我们需要手工编写转换到CSV的代码。我给出一个Python的例子。其他,例子将会很感激:

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

如果你有“面板数据”,换句话说,许多带有id的独立条目将this添加到with look中,它还会转储汇总统计数据:

        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 

任何建议使用grep排除CREATE行或仅从sqlite3 $DB .dump输出中获取INSERT行的答案都将严重失败。CREATE TABLE命令每行列出一列(因此排除CREATE不会得到全部),INSERT行上的值可以有嵌入的换行符(因此不能只获取INSERT行)。

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

在sqlite3 3.6.20版本上测试。

如果你想排除某些表,你可以用$(sqlite $DB .tables | grep -v -e one -e two -e three)过滤它们,或者如果你想获得一个特定的子集,用one two three替换它。