Вам нужна итеративная форма метода соединения с базой данных eval
. Вам, вероятно, следует также явно указать ваши столбцы, а не использовать *
, поскольку SQL в общем случае не гарантирует ничего в том порядке, в котором они находятся по умолчанию. (Первичный ключ , вероятно, стоит первым.)
package require sqlite3
# Put this outside the procedure; it can be shared
sqlite3 data /home/local/test.db
bind pub "-|-" !sqlpre pub:test:sqlpre
proc pub:test:sqlpre { nick host handle channel arg } {
set searchname [lindex [split $arg] 0]
set found no
# For each matching row...
data eval {
-- You can use “sqlExpr AS theName” to change the names of things
SELECT id, source, path, name
FROM folders
WHERE name LIKE $searchname
} row {
# The 'row' above names a Tcl array that holds the result row data.
# This means we can use the values out of it directly.
putnow "PRIVMSG $channel :$row(id) $row(source) $row(path) $row(name)"
# Remember that we have found something
set found yes
}
# If we didn't find anything, tell the user
if {!$found} {
putnow "PRIVMSG $channel :Nothing found"
}
}
Обратите внимание, что мы совместно используем соединение с базой данных для многих пользовательских действий. Это хорошая практика, так как это означает, что мы делимся ресурсами. И оператор запроса SQL теперь состоит из нескольких строк для удобства чтения. Хорошая читаемость.