如何转储数据,只转储数据库的某些SQLite3表(不是所有表)的数据,而不是模式?转储应该是SQL格式的,因为它应该稍后可以很容易地重新输入到数据库中,并且应该从命令行完成.就像是
sqlite3 db .dump
但是没有转储模式并选择要转储的表.
你没有说你想对转储文件做什么.
我会使用以下内容来获取CSV文件,我可以将其导入几乎所有内容
.mode csv -- use '.separator SOME_STRING' for something other than a comma. .headers on .out file.csv select * from MyTable;
如果要重新插入另一个SQLite数据库,则:
.mode insert.out file.sql select * from MyTable;
你可以通过.schema和.dump命令来区分它们.例如用grep:
sqlite3 some.db .schema > schema.sql sqlite3 some.db .dump > dump.sql grep -vx -f schema.sql dump.sql > data.sql
data.sql
文件将只包含没有架构的数据,如下所示:
BEGIN TRANSACTION; INSERT INTO "table1" VALUES ...; ... INSERT INTO "table2" VALUES ...; ... COMMIT;
我希望这可以帮助你.
不是最好的方法,但至少不需要外部工具(除了grep,无论如何都是*nix盒子上的标准)
sqlite3 database.db3 .dump | grep '^INSERT INTO "tablename"'
但是你确实需要为你正在寻找的每个表执行此命令.
请注意,这不包括架构.
您可以为.dump特殊命令指定一个或多个表参数,例如sqlite3 db ".dump 'table1' 'table2'"
.
任何建议使用grep排除CREATE
行或只是INSERT
从sqlite3 $DB .dump
输出中获取行的答案都会失败.这些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
.
作为对Paul Egan的回答的改进,这可以通过以下方式实现:
sqlite3 database.db3 '.dump "table1" "table2"' | grep '^INSERT'
- 要么 -
sqlite3 database.db3 '.dump "table1" "table2"' | grep -v '^CREATE'
当然,需要注意的是你必须安装grep.
在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的单个条目将其添加到with 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