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 документация

ROWIDs и 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
@CL. Добре, не знаех това. Благодаря. - 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