Lua-Sqlite3 получить rowid

Когда я запускаю код:

row = db:first_row("SELECT MIN(rowid) from table")
local minID = row.rowid

row = db:first_row("SELECT MAX(rowid) from table")
local maxID = row.rowid

Я получаю сообщение об ошибке:

Runtime error: ...\db_test\main.lua:33: attempt to call method 'first_row' (a nil value)
stack traceback:
    [C]: in function 'first_row'
    ...\main.lua:33: in main chunk

Тот же самый SQL-запрос работает в Python в той же базе данных.

Из документации sqlite.

ROWID и INTEGER PRIMARY KEY

Каждая строка каждой таблицы SQLite имеет 64-битный целочисленный ключ со знаком, который однозначно идентифицирует строку в этой таблице. Это целое число обычно называют rowid. Доступ к значению rowid можно получить, используя одно из специальных имен, не зависящих от регистра, rowid, oid или rowid вместо имени столбца.

Кому интересно, рабочий код в моем случае:

local minId
local maxId
for row in db:nrows("SELECT MIN(rowid) AS `rowmin` FROM " .. table) do
    minId = row.rowmin
end
for row in db:nrows("SELECT MAX(rowid) AS `rowmax` FROM " .. table) do
    maxId = row.rowmax
end

person Jay    schedule 28.03.2013    source источник


Ответы (1)


Если вы используете оболочку lua-sqlite3, вам нужно выполнить итерацию, используя db:rows(), а не first_row. Звонок будет:

row = db:rows("SELECT MIN(rowid) AS `rowmin`, MAX(rowid) AS `rowmax` FROM table")
local minID, maxID = row.rowmin, row.rowmax

На основе предложения @CL в комментариях:

row = db:rows("SELECT MIN(rowid) AS `rowmin` FROM table")
local minID = row.rowmin
row = db:rows("SELECT MAX(rowid) AS `rowmax` FROM table")
local maxID = row.rowmax
person hjpotter92    schedule 28.03.2013
comment
Обратите внимание, что оптимизатор SQLite может работать лучше, если вы используете отдельные запросы для значений MIN и MAX. - person CL.; 28.03.2013
comment
@КЛ. Хорошо, не знал этого. Спасибо. - person hjpotter92; 28.03.2013
comment
Работает, спасибо! Странно, что вы не можете получить одну строку, а также то, что это работает, только если вы выбираете rowid КАК что-то еще. Вы не могли бы объяснить, почему? - person Jay; 29.03.2013
comment
@JaredGlass Если вы не используете селектор AS, доступ к вашему ключу таблицы будет выглядеть следующим образом: row["MAX(rowid)"]. Я использовал AS, чтобы сократить последний сегмент. - person hjpotter92; 29.03.2013
comment
Ах ха. Имеет смысл. Спасибо :D - person Jay; 30.03.2013