0

我使用来自 tcl 的 sqllite。为了创建一个表,我使用:

DB eval { CREATE TABLE TableName (Component text NOT NULL, LC int NOT NULL) }

现在很好,但如果我想使用变量 $TableName 而不是固定表名,我将不得不使用:

DB eval "CREATE TABLE $TableName (Component text NOT NULL, LC int NOT NULL)"

但是我在 Stackoveflow 上的某处读到过,一个总是应该在 DB eval 语句中使用大括号(我认为这是出于安全原因)。那么,“”的使用是否可以,或者我应该以某种不同的方式使用它?

4

1 回答 1

3

SQLite 表达式中的表名不支持作为参数;参数只能用于。您必须使用普通的 Tcl 变量替换将表名放入,因此应该非常小心不要让用户指定名称(有另一个表来保存从用户指定的名称到表名的映射;您有一个数据库,你不妨使用它)。

尽量避免在建表中混用数据定义语句或数据查询语句,注意也可以用:varinstead$var作为参数名来替代;当您必须从动态命名的表中查找内容时,这可以使事情变得更容易:

db eval "SELECT component FROM $TableName WHERE LC = :lc" {
    puts "component = $component"
}
于 2013-10-07T13:23:30.787 回答