Методы БД

<< Click to Display Table of Contents >>

Navigation:  Modbus Universal MasterOPC Server > Руководство по языку Lua 5.1 > Руководство по LuaSQLite3 >

Методы БД

Методы БД

mbul_mail db:busy_handler

mbul_mail db:busy_timeout

mbul_mail db:changes

mbul_mail db:close

mbul_mail db:close_vm

mbul_mail db:create_aggregate

mbul_mail db:create_collation

mbul_mail db:create_function

mbul_mail db:errcode

mbul_mail db:errmsg

mbul_mail db:error_code

mbul_mail db:error_message

mbul_mail db:exec

mbul_mail db:execute

mbul_mail db:interrupt

mbul_mail db:isopen

mbul_mail db:last_insert_rowid

mbul_mail db:nrows

mbul_mail db:prepare

mbul_mail db:progress_handler

mbul_mail db:rows

mbul_mail db:total_changes

mbul_mail db:trace

mbul_mail db:urows

После открытия БД с помощью sqlite3.open или sqlite3.open_memory возвращенный объект БД должен использоваться для всех вызовов методов этой БД. Объект открытой БД поддерживает следующие методы.

db:busy_handler

db:busy_handler([func[,udata]])

Задает или удаляет дескриптор занятости БД. func – или функция Lua, которая встраивает дескриптор занятости, или nil для удаления ранее заданного дескриптора. Данная функция ничего не возвращает.

Функция дескриптора вызывается с двумя параметрами: udata и числом попыток для незаконченных транзакций. Функция вернет nil, FALSE или 0, если транзакция должна быть прервана. Любые другие значения означают следующую попытку выполнить транзакцию (см. советы по написанию дескрипторов занятости в документации SQLite).

db:busy_timeout

db:busy_timeout(t)

Задает дескриптор занятости, который ждет t миллисекунд, если транзакция не может быть продолжена. Вызов этой функции удаляет любой дескриптор занятости, заданный с помощью db:busy_handler ; вызов этой функции с аргументом, меньшим или равным 0, выключает все дескрипторы занятости.

db:changes

db:changes()

Эта функция возвращает число строк ДБ, измененных, вставленных или удаленных последним оператором SQL. Подсчитываются только изменения, которые непосредственно заданы операторами INSERT, UPDATE или DELETE. Другие изменения, обусловленные триггерами, не учитываются. Используйте db:total_changes , чтобы найти общее число изменений.

db:close

db:close()

Закрывает БД. Все операторы SQL, подготовленные с помощью db:prepare , должны быть завершены перед вызовом этой функции. Функция возвращает sqlite3.OK в случае успешного закрытия БД, в противном случае возвращается код ошибки (см. список в разделе Результирующие коды и коды ошибок ).

db:close_vm

db:close_vm(temponly)

Завершает все операторы, которые не завершены явно. Если temponly – TRUE, завершаются только внутренние, временные операторы. Эта функция ничего не возвращает.

db:create_aggregate

db:create_aggregate(name,nargs,step,final)

Эта функция создает агрегатную функцию обратного вызова. Агрегатные функции выполняют операцию над всеми строками в запросе. name – строка с именем агрегатной функции как задано в операторе SQL; nargs – число аргументов в вызове. step – реальная функция Lua, которая вызывается однократно для каждой строки; она примет контекст функции (см. Методы контекстов обратного вызова ) плюс такое же число параметров, как задано nargs. final – функция, которая вызывается однократно после того, как все строки обработаны; она получает один аргумент (контекст функции).

Контекст функции может быть использован внутри двух функций обратного вызова для взаимодействия с SQLite3. Простой пример:

db:exec[=[

 CREATE TABLE numbers(num1,num2);

 INSERT INTO numbers VALUES(1,11);

 INSERT INTO numbers VALUES(2,22);

 INSERT INTO numbers VALUES(3,33);

]=]

local num_sum=0

local function oneRow(context,num) -- добавить один столбец во все строки

 num_sum=num_sum+num

end

local function afterLast(context)   -- возвратить сумму после того, как обработана последняя строка

 context:result_number(num_sum)

 num_sum=0

end

db:create_aggregate("do_the_sums",1,oneRow,afterLast)

for sum in db:urows('SELECT do_the_sums(num1) FROM numbers') do print("Sum of col 1:",sum) end

for sum in db:urows('SELECT do_the_sums(num2) FROM numbers') do print("Sum of col 2:",sum) end

Этот код печатает следующее:

Sum of col 1:   6

Sum of col 2:   66

db:create_collation

db:create_collation(name,func)

Создает сравнительный обратный вызов. Сравнительный обратный вызов используется для установки порядка – в основном, для целей сравнения строк и сортировки. name – строка с именем сопоставления, которое должно быть создано; func – функция, принимает два строковых аргумента, сравнивает их и возвращает 0, если строки идентичны, -1, если первый аргумент расположен в порядке ниже, чем второй, и 1, если первый аргумент расположен в порядке выше, чем второй. Простой пример:

local function collate(s1,s2)

 s1=s1:lower()

 s2=s2:lower()

 if s1==s2 then return 0

 elseif s1<s2 then return -1

 else return 1 end

end

db:exec[=[

 CREATE TABLE test(id INTEGER PRIMARY KEY,content COLLATE CINSENS);

 INSERT INTO test VALUES(NULL,'hello world');

 INSERT INTO test VALUES(NULL,'Buenos dias');

 INSERT INTO test VALUES(NULL,'HELLO WORLD');

]=]

db:create_collation('CINSENS',collate)

for row in db:nrows('SELECT * FROM test') do print(row.id,row.content) end

db:create_function

db:create_function(name,nargs,func)

Эта функция создает функцию обратного вызова. Функции обратного вызова вызываются SQLite3 один раз для каждой строки в запросе. name – строка с именем функции обратного вызова как указано в операторе SQL; nargs – число аргументов в вызове. func – реальная функция Lua, которая вызывается один раз для каждой строки, она примет контекст функции (см. Методы контекстов обратного вызова ) плюс такое же количество параметров, как задано nargs. Пример:

db:exec'CREATE TABLE test(col1,col2,col3)'

db:exec'INSERT INTO test VALUES(1,2,4)'

db:exec'INSERT INTO test VALUES(2,4,9)'

db:exec'INSERT INTO test VALUES(3,6,16)'

db:create_function('sum_cols',3,function(ctx,a,b,c)

 ctx:result_number(a+b+c)

end))

for col1,col2,col3,sum in db:urows('SELECT *,sum_cols(col1,col2,col3) FROM test') do

 util.printf('%2i+%2i+%2i=%2i\n',col1,col2,col3,sum)

end

db:errcode

db:errcode()

db:error_code()

Возвращает числовой результирующий код (или расширенный результирующий код) для последнего неудачного обращения, относящегося к базе данных db (см.. Результирующие коды и коды ошибок ).

db:errmsg

db:errmsg()

db:error_message()

Возвращает строку, которая содержит сообщение об ошибке для последнего неудачного обращения, относящегося к базе данных db.

db:error_code

См. db:errcode .

db:error_message

См. db:errmsg .

db:exec

db:exec(sql[,func[,udata]])

db:execute(sql[,func[,udata]])

Компилирует и выполняет SQL-операторы, заданные в строке sql. Операторы просто выполняются один за другим и не сохраняются. Функция возвращает sqlite3.OK при удачном выполнении или числовой код ошибки в противном случае (см. Результирующие коды и коды ошибок ).

Если один или несколько SQL-операторов – это запросы, функция обратного вызова, указанная в func, вызывается один раз для каждой строки результата запроса (если func = nil, обратный вызов не вызывается). Обратный вызов получает 4 аргумента: udata (третий аргумент db:exec()), число столбцов в строке, таблицу значений столбцов и таблицу имен столбцов. Функция обратного вызова вернет 0. Если обратный вызов возвращает ненулевое значение, запрос прерывается, все последующие SQL-операторы пропускаются, и db:exec() возвращает sqlite3.ABORT. Простой пример:

sql=[=[

 CREATE TABLE numbers(num1,num2,str);

 INSERT INTO numbers VALUES(1,11,"ABC");

 INSERT INTO numbers VALUES(2,22,"DEF");

 INSERT INTO numbers VALUES(3,33,"UVW");

 INSERT INTO numbers VALUES(4,44,"XYZ");

 SELECT * FROM numbers;

]=]

function showrow(udata,cols,values,names)

 assert(udata=='test_udata')

 print('exec:')

 for i=1,cols do print('',names[i],values[i]) end

 return 0

end

db:exec(sql,showrow,'test_udata')

db:execute

См. db:exec .

db:interrupt

db:interrupt()

Эта функция принуждает любую незаконченную операцию с БД прерваться и вернуть при первой возможности. Функция ничего не возвращает.

db:isopen

db:isopen()

Возвращает TRUE, если база данных db открыта, и FALSE в противном случае.

db:last_insert_rowid

db:last_insert_rowid()

Эта функция возвращает rowid последней вставки в БД. Если вставки не было, возвращается 0. (Каждая строка в таблице SQLite имеет уникальный 64-разрядный целый знаковый ключ, называемый ’rowid’. Этот ID всегда доступен как недекларируемый столбец с именем ROWID, OID или _ROWID_. Если таблица содержит столбец типа INTEGER PRIMARY KEY, то этот столбец есть еще один псевдоним для rowid).

Если вставка происходит из триггера, rowid вставленной строки возвращается до тех пор, пока триггер работает. Как только триггер останавливается, возвращается значение, предшествующее запуску триггера.

db:nrows

db:nrows(sql)

Создает итератор, который возвращает успешные строки, выбранные SQL-оператором, который задан в строке sql. Каждое обращение к итератору возвращает таблицу, в которой именованные поля соответствуют столбцам БД. Пример:

db:exec[=[

 CREATE TABLE numbers(num1,num2);

 INSERT INTO numbers VALUES(1,11);

 INSERT INTO numbers VALUES(2,22);

 INSERT INTO numbers VALUES(3,33);

]=]

for a in db:nrows('SELECT * FROM numbers') do table.print(a) end

Этот скрипт печатает следующее:

num2: 11

num1: 1

num2: 22

num1: 2

num2: 33

num1: 3

db:prepare

db:prepare(sql)

Эта функция компилирует SQL-оператор (запрос), заданный в строке sql, во внутреннее представление и возвращает этот объект внутреннего представления как userdata. Возвращаемый объект должен использоваться для всех последующих обращений к методам этого SQL-оператора (см. Методы подготовленных операторов ).

db:progress_handler

db:progress_handler(n,func,udata)

Эта функция устанавливает функцию обратного вызова func, которая периодически (через каждые n внутренних операций) вызывается в течение длительно исполняемых обращений к db:exec или stmt:step (n – первый аргумент функции db:progress_handler). udata передается в func при каждом вызове func. Если обращение к db:exec() или stmt:step() приводит к меньшему, чем n, числу исполняемых операций, func никогда не вызывается. Только одна периодически вызываемая функция обратного вызова может быть задана для каждой открытой БД, и обращение к такой функции перезаписывает любую ранее заданную функцию обратного вызова. Для удаления периодически вызываемой функции обратного вызова нужно передать nil в качестве второго аргумента.

Если периодически вызываемая функция обратного вызова возвращает ненулевое значение, текущий запрос немедленно прерывается, отменяются все изменения в БД, а содержащая функция db:exec() или stmt:step() возвращает sqlite3.INTERRUPT. Это свойство может быть использовано для отмены длительно исполняемых запросов.

db:rows

db:rows(sql)

Создает итератор, который возвращает успешные строки, выбранные с помощью SQL-оператора (запроса), который задан в строке sql. Каждое обращение к итератору возвращает таблицу, в которой числовые индексы от 1 до n соответствуют выбранным столбцам от 1 до n в БД. Пример:

db:exec[=[

 CREATE TABLE numbers(num1,num2);

 INSERT INTO numbers VALUES(1,11);

 INSERT INTO numbers VALUES(2,22);

 INSERT INTO numbers VALUES(3,33);

]=]

for a in db:rows('SELECT * FROM numbers') do table.print(a) end

Это скрипт печатает следующее:

1: 1

2: 11

1: 2

2: 22

1: 3

2: 33

db:total_changes

db:total_changes()

Эта функция возвращает число строк БД, которые были добавлены, изменены или удалены с помощью операторов INSERT, UPDATE или DELETE с момента открытия БД. В это число входят также изменения, выполненные с помощью операторов UPDATE, INSERT и DELETE из триггерных программ. Все изменения подсчитываются как только оператор, выполняющий эти изменения, завершается вызовом stmt:reset или stmt:finalize .

db:trace

db:trace(func,udata)

Устанавливает трассирующую функцию обратного вызова и возвращает ее дескриптор. func – это функция Lua, которая вызывается SQLite3 непосредственно перед выполнением оператора SQL. Трассировщик получает два аргумента: первый, udata, используется при установке функции, второй – это строка, содержащая SQL-оператор, который должен быть выполнен.

db:urows

db:urows(sql)

Создает итератор, который возвращает успешные строки, выбранные с помощью SQL-оператора, заданного в строке sql. Каждое обращение к итератору возвращает значения, соответствующие столбцам в текущей выбранной строке. Пример:

db:exec[=[

 CREATE TABLE numbers(num1,num2);

 INSERT INTO numbers VALUES(1,11);

 INSERT INTO numbers VALUES(2,22);

 INSERT INTO numbers VALUES(3,33);

]=]

for num1,num2 in db:urows('SELECT * FROM numbers') do print(num1,num2) end

Этот скрипт печатает следующее:

1       11

2       22

3       33