我从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上的某处读过,一个ALWAYS应该使用大括号来表示DB eval语句(我认为这是出于安全原因)。 那么,使用“”确定还是我应该以某种方式做到不同?
答案 0 :(得分:3)
SQLite表达式中的表名称不支持作为参数;参数只能用于值。你必须使用普通的Tcl变量替换表名,所以应该非常小心不要让用户指定名称(有另一个表来保存用户指定的名称到表名的映射) ;你有一个数据库,你也可以使用它。)
尽量避免将数据定义语句或数据查询语句与表创建混合,并注意您也可以使用:var
而不是$var
作为要替换的参数名称;当你必须从动态命名的表中查找内容时,这可以使事情变得更容易:
db eval "SELECT component FROM $TableName WHERE LC = :lc" {
puts "component = $component"
}