是否有任何SQLite命令或第三方工具允许数据库转储在INSERT INTO
语句中包含列名?
而不是
INSERT INTO "MyTable" VALUES ('A', 'B');
我想看看
INSERT INTO "MyTable" (Column1, Column2) VALUES ('A', 'B');
SQLite中的.dump
命令仅提供第一个版本。
发布于 2011-01-26 12:59:35
让我再试一次。
将列名和INSERT语句转储到文件中。
sqlite> .output test.data
sqlite> pragma table_info(test);
sqlite> .dump test
sqlite> .quit
$ cat test.data
0|test_id|int|0||1
1|test_name|varchar(35)|0||0
PRAGMA foreign_keys=OFF;
BEGIN TRANSACTION;
CREATE TABLE test (test_id int primary key, test_name varchar(35));
INSERT INTO "test" VALUES(1,'Wibble');
INSERT INTO "test" VALUES(2,'Wobble');
INSERT INTO "test" VALUES(3,'Pernicious');
COMMIT;
现在运行这个awk脚本
/\|/ {
split($0, col_name, "|");
column_names[++n] = col_name[2];
}
/INSERT INTO \"[A-Za-z].*\"/ {
insert_part = match($0, /INSERT INTO \"[A-Za-z].*\"/);
printf("%s ", substr($0, RSTART, RLENGTH));
printf("(");
for (i = 1; i <= n; i++) {
if (i == 1) {
printf("%s", column_names[i]);
}
else {
printf(", %s", column_names[i]);
}
}
printf(") ");
values_part = substr($0, RLENGTH+1, length($0) - RSTART);
printf("%s\n", values_part);
}
我们就会得到
$ awk -f dump_with_col_names.awk test.data
INSERT INTO "test" (test_id, test_name) VALUES(1,'Wibble');
INSERT INTO "test" (test_id, test_name) VALUES(2,'Wobble');
INSERT INTO "test" (test_id, test_name) VALUES(3,'Pernicious');
发布于 2017-05-24 19:38:07
这并没有回答这个问题。我之所以在这里写这篇文章,是因为这是我解决类似问题的方法。一种方法是分别转储结构和数据。对于像您在数据文件外部描述的插入:
sqlite> .headers on
sqlite> .mode insert MyTable
sqlite> .output MyTable_data.sql
sqlite> select * from MyTable;
sqlite> .quit
发布于 2011-01-26 12:20:46
我快速浏览了一下源代码。我没有看到任何明显的方法来做到这一点。但是我使用了一个又快又脏的awk脚本来插入列名。
从这个转储开始:
PRAGMA foreign_keys=OFF;
BEGIN TRANSACTION;
CREATE TABLE test (test_id int primary key, test_name varchar(35));
INSERT INTO "test" VALUES(1,'Wibble');
INSERT INTO "test" VALUES(2,'Wobble');
INSERT INTO "test" VALUES(3,'Pernicious');
COMMIT;
我运行了这个awk脚本
/CREATE TABLE/ {
# Extract the part between parens. This part contains the
# column definitions.
first_col = match($0, /\(.*\)/ );
if (first_col) {
num_columns = split(substr($0, RSTART + 1, RLENGTH), a, ",");
for (i = 1; i <= num_columns; i++) {
sub(/^ /, "", a[i]);
split(a[i], names, " ");
column_names[i] = names[1];
}
}
}
/INSERT INTO \"[A-Za-z].*\"/ {
insert_part = match($0, /INSERT INTO \"[A-Za-z].*\"/);
printf("%s ", substr($0, RSTART, RLENGTH));
printf("(");
for (j = 1; j <= num_columns; j++) {
if (j == 1) {
printf("%s", column_names[j]);
}
else {
printf(", %s", column_names[j]);
}
}
printf(") ");
values_part = substr($0, RLENGTH+1, length($0) - RSTART);
printf("%s\n", values_part);
}
这给了我这个输出。
INSERT INTO "test" (test_id, test_name) VALUES(1,'Wibble');
INSERT INTO "test" (test_id, test_name) VALUES(2,'Wobble');
INSERT INTO "test" (test_id, test_name) VALUES(3,'Pernicious');
https://stackoverflow.com/questions/4199850
复制相似问题