我有一个文件,里面装满了我想解析的 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/