SQLite导出列名

kpo*_*zin 23 sql sqlite

是否有任何SQLite命令或第三方工具允许数据库转储在INSERT INTO语句中包含列名?

代替

INSERT INTO "MyTable" VALUES ('A', 'B');
Run Code Online (Sandbox Code Playgroud)

我想看

INSERT INTO "MyTable" (Column1, Column2) VALUES ('A', 'B');
Run Code Online (Sandbox Code Playgroud)

.dumpSQLite中的命令仅提供第一个版本.

Mik*_*ll' 6

让我再来一次.

将列名和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;
Run Code Online (Sandbox Code Playgroud)

现在运行这个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);


}
Run Code Online (Sandbox Code Playgroud)

我们得到了

$ 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');
Run Code Online (Sandbox Code Playgroud)


abs*_*tx1 6

这并没有回答这个问题。我在这里写这个是因为这是我处理类似问题的方式。一种方法是分别转储结构和数据。对于像您在数据文件之外描述的插入:

sqlite> .headers on
sqlite> .mode insert MyTable
sqlite> .output MyTable_data.sql
sqlite> select * from MyTable;
sqlite> .quit
Run Code Online (Sandbox Code Playgroud)


小智 6

有一个 SQLite 扩展模块,用于从/向 SQL 源文本导入/导出数据库信息并导出为 CSV 文本。 http://www.ch-werner.de/sqliteodbc/html/impexp_8c.html

例如在 Ubuntu 中,您的步骤是:

  1. 从 ubuntu 存储库安装模块

    sudo apt install libsqlite3-mod-impexp
    
    Run Code Online (Sandbox Code Playgroud)
  2. 在sqlite命令行提示符运行中加载模块

    .load libsqlite3_mod_impexp
    
    Run Code Online (Sandbox Code Playgroud)
  3. 将数据库导出到 dump.sql 文件

    select export_sql('dump.sql','1');
    
    Run Code Online (Sandbox Code Playgroud)
  4. 我的数据库的结果示例是

    INSERT OR REPLACE INTO "camera" ("name","reviews") VALUES('BenQ GH700', NULL);  
    INSERT OR REPLACE INTO "camera" ("name","reviews") VALUES('Canon EOS 40D', NULL);
    
    Run Code Online (Sandbox Code Playgroud)


Mik*_*ll' 3

我快速浏览了一下源代码。我没有看到任何明显的方法可以做到这一点。但我编写了一个快速而肮脏的 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;
Run Code Online (Sandbox Code Playgroud)

我运行了这个 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);

}
Run Code Online (Sandbox Code Playgroud)

这给了我这个输出。

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');
Run Code Online (Sandbox Code Playgroud)