我该如何转储数据库的某些SQLite3表(而非所有表)的数据,而仅转储数据,而不是模式? 转储应采用SQL格式,因为以后应轻松将其重新输入数据库并应从命令行完成。 就像是

sqlite3 db .dump

但不转储架构并选择要转储的表。

===============>>#1 票数:209

您没有说要对转储的文件做什么。

我将使用以下内容获取CSV文件,该文件可以导入几乎所有内容

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

如果您想重新插入另一个SQLite数据库,则:

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

===============>>#2 票数:147

您可以这样做来获得.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;

我希望这可以帮助你。

===============>>#3 票数:38

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

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

但是您确实需要为要查找的每个表执行此命令。

请注意,这不包括架构。

===============>>#4 票数:34

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

===============>>#5 票数:10

任何建议使用grep排除CREATE行或仅从sqlite3 $DB .dump输出中获取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

===============>>#6 票数:8

作为对保罗·伊根(Paul Egan)答案的改进,可以按以下步骤完成:

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

- 要么 -

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

注意,当然,您必须安装grep。

===============>>#7 票数:6

在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外观中,并且还会转储摘要统计信息:

        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 

===============>>#8 票数:4

根据命令行外壳程序的SQLite文档对于SQLite ,只需将“模式”设置为“ csv”,然后运行查询以提取所需的行,即可将SQLite表(或表的一部分)导出为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”已存在。

===============>>#9 票数:3

审查其他可能的解决方案

仅包括INSERT

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

易于实现,但是如果您的任何列包含新行,它将失败

SQLite插入模式

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

这是一个不错的且可自定义的解决方案,但如果您的列在spacespaceite中具有Blob对象(例如“ Geometry”类型),则该方法将无效

与模式差异转储

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

不知道为什么,但对我不起作用

另一个(新的)可能的解决方案

这个问题可能没有最佳答案,但对我来说有用的是grep插入,考虑到列值中的换行符是这样的:

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

要选择要转储的表, .dump允许使用LIKE参数来匹配表名,但是如果这样做还不够的话,可能最好使用简单的脚本

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

或者,更详细地说明如何尊重外键并将所有转储封装在一个事务中

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表达式将失败); 是在任何列中存在的字符串

还原它(在已创建表的数据库中)

sqlite3 -bail database.db3 < /tmp/backup.sql

===============>>#10 票数:3

最好的方法是采用sqlite3 db dump可以执行的代码,不包括模式部分。

伪代码示例:

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

有关实际代码,请参见: src/shell.c:838 (对于sqlite-3.5.9)

您甚至可以只使用该shell并注释掉架构部分并使用它。

===============>>#11 票数:2

此版本可与插入符内的换行符一起使用:

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

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

===============>>#12 票数:0

retracile的答案应该是最接近的答案,但它不适用于我的情况。 一个插入查询刚刚在中间中断,并且导出刚刚停止。 不知道是什么原因。 但是,它在.dump期间工作正常。

最后,我编写了一个工具,用于拆分从.dump生成的SQL:

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

===============>>#13 票数:-3

您可以在表格上进行选择,在每个字段后插入逗号以产生csv,或使用GUI工具返回所有数据并将其保存到csv。

  ask by community wiki translate from so

未解决问题?本站智能推荐:

1回复

如何以SQL格式转储某些SQLite3表所需的数据?

我知道如何使用shell命令选择要以SQL格式转储的表:$ ./sqlite3 test.db'.dump mytable'> test.sql但是此命令选择“ mytable”的所有数据 我可以在转储之前选择表中想要的数据吗? 换句话说,我寻找一个命令,例如:$ ./sqlite
2回复

将表的内容转储到sqlite3中以导入到新数据库中

有没有一种简单的方法可以将SQLite数据库表转储到带有insert语句的文本字符串中,以insert其导入到其他数据库的同一表中? 在我的特定示例中,我有一个名为log_entries的表, 其中包含各种列。 每天结束时,我都想创建一个字符串,然后将其转储到另一个具有相同结构的表(称为
4回复

将SQLite3转储重新导入数据库

我觉得这是一个愚蠢的问题,因为它似乎是常识。 。 。 但没有谷歌搜索我可以放在一起似乎能够给我答案! 我知道如何使用.dump命令从sqlite3数据库中获取数据。 但现在我有这个名为export.sqlite3.sql的ASCII文件。 。 。 我似乎无法将它恢复到我想要的
1回复

使用所有表值创建sqlite3转储文件

我可以用生成一个sqlite3转储文件 但是,如果该数据库中存在没有条目的行,则该行仅在转储文件中被忽略。 使用转储文件将数据读入另一个数据库时,这是一个问题。 有没有一种方法可以强制转储文件在表中定义所有值? 因此,如果没有条目,它仅使用空字符串”之类的东西? 谢谢卡尔
2回复

如何将表添加到sqlite3数据库

如何将数据库添加到SQLite3数据库? 我总是会收到此错误。 我尝试将表添加到schema.rb ,但不起作用。 当我跑步时,它总是被覆盖 rake db:migrate RAILS_ENV=development
1回复

在SQLite3中的表之间复制数据

假设我正在像这样的表之间复制数据: 这将在一次交易中执行吗? 即。 我希望一个线程将数据从table1复制到table2,另一个线程将在复制表2时对表2中的数据进行select查询。 那可能吗? 我正在使用SQLite 3.7。
1回复

无法在iOS中更新sqlite3数据库表

我是iOS新手sqlite3,我试图更新设备表中的现有记录,如下所示我没有更新主键,虽然我正在更新基于主键的记录,其中deviceAppID是我的PK 这是我正在尝试的代码
1回复

SQLite3和Alter表..之后

有没有简单的方法可以在最近的sqlite版本中修改表,使其与预定义的架构匹配? 架构: 现在,我想在clanname之后插入clantag VARCHAR(16),使其与其他设置一致。 我不介意导出,删除,重新创建,但是我想知道是否有其他选择可以做到这一点,因为其他sql数据
1回复

SQLite3表减法

我有两个桌子。 一个是引用表all_grid ,另一个是客户表t_customer 。 我需要呈现参考表中但不在客户表中的行(即,显示在all_grid但在t_customer不存在customer_x和customer_y列的行)。 在两个表中,列的名称相同,但是t_customer
1回复

从sqlite3导出表

伙计们! 几周前,我通过提示符中的命令从sqlite3数据库中导出了一些表。 这些表已导出到文件中,并且存在创建表并将数据插入其中的实际sql代码。 就像这样: ...... 但是,当我现在尝试导出同一张表时,它只是将实际数据放入文件中 ...我使用以下命令:.out