как можно выбрать несколько выходов из sqlite - PullRequest
1 голос
/ 19 апреля 2020

Я хочу сделать запрос sql и получить только ответ, хотя его должно быть пять.

только канал помещен на канал

bind pub "-|-" !sqlpre pub:test:sqlpre
proc pub:test:sqlpre { nick host handle channel arg } {

set searchname [lindex [split $arg] 0]

sqlite3 data /home/local/test.db
set result [data eval {SELECT * FROM folders WHERE name LIKE $searchname}]


if {[llength $result] == 0} {
    putnow "PRIVMSG $channel :Nothing found";
    return 0;
} else {
    set id [lindex $result 0];
    set source [lindex $result 1];
    set path [lindex $result 2];
    set name [lindex $result 3];

}
putnow "PRIVMSG $channel :$id $source $path $name"
}

проблема сейчас здесь:

1 aa /tmp searchtest1

но здесь должно быть так:

1 aa /tmp searchtest1
4 ab /tmp searchtest1
17 ac /tmp searchtest1
18 ad /tmp searchtest1
9 ae /tmp searchtest1

1 Ответ

1 голос
/ 19 апреля 2020

Вам нужна итеративная форма метода соединения с базой данных 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 теперь состоит из нескольких строк для удобства чтения. Хорошая читаемость.

...