如何转储数据库的一些SQLite3表(而不是所有表)的数据,并且只转储数据,而不转储模式? 转储应该是SQL格式的,因为它以后可以很容易地重新输入到数据库中,并且应该从命令行完成。类似的
sqlite3 db .dump
但是没有转储模式和选择要转储的表。
如何转储数据库的一些SQLite3表(而不是所有表)的数据,并且只转储数据,而不转储模式? 转储应该是SQL格式的,因为它以后可以很容易地重新输入到数据库中,并且应该从命令行完成。类似的
sqlite3 db .dump
但是没有转储模式和选择要转储的表。
当前回答
根据命令行Shell的SQLite文档,对于SQLite,您可以将一个SQLite表(或表的一部分)导出为CSV,只需将“mode”设置为“CSV”,然后运行查询来提取表中所需的行:
sqlite> .header on
sqlite> .mode csv
sqlite> .once c:/work/dataout.csv
sqlite> SELECT * FROM tab1;
sqlite> .exit
然后使用"。import"命令导入CSV(逗号分隔值)数据到SQLite表中。
sqlite> .mode csv
sqlite> .import C:/work/dataout.csv tab1
sqlite> .exit
请阅读关于这两种情况的进一步文档,以考虑:(1)表“tab1”以前不存在,(2)表“tab1”已经存在。
其他回答
根据命令行Shell的SQLite文档,对于SQLite,您可以将一个SQLite表(或表的一部分)导出为CSV,只需将“mode”设置为“CSV”,然后运行查询来提取表中所需的行:
sqlite> .header on
sqlite> .mode csv
sqlite> .once c:/work/dataout.csv
sqlite> SELECT * FROM tab1;
sqlite> .exit
然后使用"。import"命令导入CSV(逗号分隔值)数据到SQLite表中。
sqlite> .mode csv
sqlite> .import C:/work/dataout.csv tab1
sqlite> .exit
请阅读关于这两种情况的进一步文档,以考虑:(1)表“tab1”以前不存在,(2)表“tab1”已经存在。
在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
作为对Paul Egan的回答的改进,这可以实现如下:
sqlite3 database.db3 '.dump "table1" "table2"' | grep '^INSERT'
——或
sqlite3 database.db3 '.dump "table1" "table2"' | grep -v '^CREATE'
当然,需要注意的是必须安装grep。
伸缩的答案应该是最接近的一个,但它并不适用于我的情况。一个插入查询中途中断,导出就停止了。不知道是什么原因。但是,它在.dump期间工作正常。
最后我写了一个工具来分解.dump生成的SQL:
https://github.com/motherapp/sqlite_sql_parser/
你还没说你想怎么处理被丢弃的文件。
获取CSV文件(可以导入到几乎所有文件中)
.mode csv
-- use '.separator SOME_STRING' for something other than a comma.
.headers on
.out file.csv
select * from MyTable;
获取一个SQL文件(可以重新插入到不同的SQLite数据库中)
.mode insert <target_table_name>
.out file.sql
select * from MyTable;