sqlite - sqlite3 eval中的tcl var替换

标签 sqlite tcl

我有一个文件,里面装满了我想解析的 sqlite 语句。我以前使用 C 接口(interface)这样做过,但现在我在使用 Tcl 接口(interface)时遇到了麻烦。

sqlite3 cspdb ":memory:"
set s [read [set f [open csp_sql.txt]]]
set ms [string map {"\n" "\0"} $s]
puts $ms
cspdb eval {$ms}

我得到的错误是:

"near "$ms": syntax error while executing cspdb eval {$ms}"



当我将 puts $ms 的输出直接粘贴到 eval 括号中时,它工作正常。我也试过 "{$ms}"只是简单的 $ms 但结果是一样的;语法错误。

我可能会一起为该问题选择另一种解决方案,但这确实让我感到困惑,为什么它不起作用......

这是文件的样子:
  BEGIN TRANSACTION;
    CREATE TABLE Symbol (
      Label TEXT PRIMARY KEY,
      Type TEXT DEFAULT('no_type')
    );

    CREATE TABLE Process (
      Name INTEGER PRIMARY KEY,
      Type TEXT DEFAULT('no_type')
    );

    CREATE TABLE Named_Process (
      Label TEXT UNIQUE,
      Definition INTEGER UNIQUE,
      FOREIGN KEY(Label) REFERENCES Symbol (Label),
      FOREIGN KEY(Definition) REFERENCES Definition(Name)
    );

    CREATE TABLE Definition (
      Name INTEGER UNIQUE,
      Definition INTEGER,
      FOREIGN KEY(Name) REFERENCES Process(Name),
      FOREIGN KEY(Definition) REFERENCES Process(Name)
    );

    CREATE TABLE Reference (
      Name INTEGER UNIQUE,
      Reference TEXT,
      FOREIGN KEY(Name) REFERENCES Process(Name),
      FOREIGN KEY(Reference) REFERENCES Definition(Name)
    );

    CREATE TABLE Event (
      Label TEXT PRIMARY KEY,
      Type TEXT DEFAULT('no_type')
    );

    CREATE TABLE Environment (
      Label TEXT UNIQUE,
      FOREIGN KEY (Label) REFERENCES Event (Label)
    );

    CREATE TABLE Prefix (
      Name INTEGER UNIQUE,
      P INTEGER,
      Event TEXT,
      FOREIGN KEY (Name) REFERENCES Process (Name),
      FOREIGN KEY (P) REFERENCES Process (Name),
      FOREIGN KEY (Event) REFERENCES Event (Label)
    );

    CREATE TABLE Choice (
      Name INTEGER UNIQUE,
      P INTEGER,
      Q INTEGER,
      FOREIGN KEY(Name) REFERENCES Process(Name),
      FOREIGN KEY(P) REFERENCES Process(Name),
      FOREIGN KEY(Q) REFERENCES Process(Name)
    );

    /* Language defined processes */
    /* SKIP */
    INSERT INTO Symbol(Label,Type) VALUES('SKIP','named_process');
    INSERT INTO Named_Process(Label) VALUES('SKIP');
    INSERT INTO Process(type) VALUES('definition');
    UPDATE Named_Process SET Definition=last_insert_rowid() WHERE Label='SKIP';
    INSERT INTO Definition(Name,Definition) VALUES(last_insert_rowid(),last_insert_rowid());

  END TRANSACTION;

(不太确定是否需要删除换行符......)

最佳答案

如果您从文件中读取的字符串是 SQL,您应该可以这样做:

sqlite3 cspdb ":memory:"

set f [open "csp_sql.txt"]
set sql [read $f]
close $f

cspdb eval $sql

相比之下,文字字符串 $ms不是有效的 SQL 语句或查询,在 SQL 语句中用大括号括起来在语法上也不合法(这是 "{$ms}" 最终所做的;外部 " ... " 使内部只是一堆字符) .

我不知道您为什么要将换行符转换为 NUL,但这确实不太可能是一个好主意。数据的批量导入(可能包含 NUL)应该以不同的方式完成。

关于sqlite - sqlite3 eval中的tcl var替换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48730691/

相关文章:

python - 从 Tcl 字典获取 Python 字典

python - 如何将 Tkinter 安装到 Aptana Studio 35-32(非 Eclipse)

python - 对于一对多数据库模型,如何编写 sqlite 查询以避免 python 中的循环?

android - 在sqlite android中选择查询

linux - 打补丁后使用 .sh 脚本自动化 ZRP 协议(protocol)

performance - 我如何有效地(内存/时间)修改 Tcl 中列表的所有元素?

parameters - tcl - 如何保存进入 proc 的所有参数供以后重新使用?

Java SQLite 删除

c# - 类属性不包含在 sqlite 数据库列中

ios - NSPredicate 未执行