Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sqlite/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/firebase/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
sqlite3评估中的tcl var替换_Sqlite_Tcl - Fatal编程技术网

sqlite3评估中的tcl var替换

sqlite3评估中的tcl var替换,sqlite,tcl,Sqlite,Tcl,我有一个文件,里面装满了我想解析的sqlite语句。我以前使用C接口这样做过,但现在我在使用Tcl接口时遇到了问题 sqlite3 cspdb ":memory:" set s [read [set f [open csp_sql.txt]]] set ms [string map {"\n" "\0"} $s] puts $ms cspdb eval {$ms} 我得到的错误是: 靠近“$ms”:执行cspdb eval{$ms}时出现语法错误 当我将puts$ms的输出直接粘贴到eval括

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

sqlite3 cspdb ":memory:"
set s [read [set f [open csp_sql.txt]]]
set ms [string map {"\n" "\0"} $s]
puts $ms
cspdb eval {$ms}
我得到的错误是:

靠近“$ms”:执行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;

(不太确定是否有必要删除换行符…

Sqlite创建的
eval
子命令会限制变量替换,但仅在需要字符串值的地方

试一试


为了让Tcl解释器在将SQL语句发送到
eval
之前替换SQL语句,Sqlite创建的
eval
子命令会限制变量替换,但仅在需要字符串值的地方

试一试


要让Tcl解释器在将SQL语句发送到
eval

之前替换SQL语句,如果从文件中读取的字符串是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)应以不同的方式完成。

如果从文件中读取的字符串是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)应该以不同的方式完成。

结果表明,换行符为null是导致替换失败的罪魁祸首。最终工作代码:

sqlite3 cspdb ":memory:"
cspdb eval [read [set f [open csp_sql.txt]]]

出现换行符为null的原因是,当试图调试使字符串与我原来的工作C代码匹配时,该代码使用了多行字符串文字,其中出现了换行符。除此之外,“\0”不是“正在消失”的字符…

发现换行符为null是导致替换失败的罪魁祸首。最终工作代码:

sqlite3 cspdb ":memory:"
cspdb eval [read [set f [open csp_sql.txt]]]

出现换行符为null的原因是,当试图调试使字符串与我原来的工作C代码匹配时,该代码使用了多行字符串文字,其中出现了换行符。除此之外,“\0”不是“正在消失”的字符…

一般来说,SQL代码中实际替换的数量最好保持在非常小的范围内,因为很难正确地进行替换。边界参数更可靠,更易于在实践中使用;SQLite的Tcl接口强烈倾向于命名绑定参数,默认情况下将它们耦合到Tcl变量。事实证明,换行符为null是一个问题。一般来说,最好将SQL代码中实际替换的数量保持在非常小的范围内,因为很难正确地获得它们。边界参数更可靠,更易于在实践中使用;SQLite的Tcl接口强烈倾向于命名绑定参数,默认情况下将它们与Tcl变量耦合。结果显示,换行符为null是问题建议产生“接近”:执行“cspdb eval$ms”时出现语法错误如果$ms的值是合法的,则该行有效。请参阅我的回答:执行“cspdb eval$ms”时出现语法错误如果您是对的,那么如果$ms的值是合法的,该行就会工作。看到我的答案了吗