sqlite3评估中的tcl var替换
我有一个文件,里面装满了我想解析的sqlite语句。我以前使用C接口这样做过,但现在我在使用Tcl接口时遇到了问题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括
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的值是合法的,该行就会工作。看到我的答案了吗