Действия с базами данных


AutoPlay Media Studio имеет поддержку нескольких технологий баз данных включая MySQL, Oracle, и Sqlite3. Функциональные возможности этих баз данных сделаны при помощи библиотеки LuaSQL, разработанной и осуществленной командой Kepler Project.

Каждая технология поддерживаемых баз данных имеет соответствующую категорию действий. По умолчанию эти действия скрыты в Мастере действий (Action Wizard), и будут показаны только после разрешения поддержки баз данных в проекте.

Можно разрешить или запретить поддержку баз данных отдельно в диалоговом окне Базы данных (Databases), что доступны при выборе в меню Проект (Project) > Базы данных (Databases).

Примечание: При включении поддержки баз данных в AutoPlay, соответствующий LuaSQL запрос оператора будет автоматически выполняться при запуске программы (autorun.exe). Например, если разрешается поддержка MySQL, не нужно добавлять к скрипту require "luasql.mysql", это будет сделано автоматически.

Обработка ошибок

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

Обычно первая возвращаемая переменная будет содержать значение, а вторая будет нулем.

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

Примечание: Использование второго возвращаемого значения необязательно - можно не указывать любую переменную для его получения, и оно будет просто проигнорировано.

Действия с базами данных

Все действия с базами данных имеют почти тот же синтаксис, что и различные технологии баз данных.

В следующей секции заменяйте часть "xxxx" каждого имени метода, названием каждой категории действия. Например:
Если видите это:Делайте так:
xxxx:close()MySQL:close(), SQLite3:close(), и т.п.
xxxxConnection:commit()MySQLConnection:commit(), OracleConnection:commit(), и т.п.
Некоторые из действий возвращают объект, например MySQL:connect() возвращает объект, представляющий подключение к базе данных. Несмотря на то, что технически можно называть эти объекты любым, правильным в Lua, именем переменной, AutoPlay требует использования специальных названий в порядке разрешения интеграции с редактором скрипта (Quick Help, intellisense, и т.п.). Таким образом, следует называть первую возвращаемую переменную из MySQL:connect() "MySQLConnection", если для работы нужны свойства редактора скрипта.

Объекты среды

Объект среды представляет собой связь с драйвером базы данных и обычно возвращается из вызова функции инициализации. Эта инициализация выполняется автоматически при запуске любой базы данных, задействованной в диалоговом окне Базы данных (Databases). Объект среды любой базы данных также автоматически будет закрыт при выключении.

Таким образом, в AutoPlay не нужно выполнять вызов, такой как:
env = luasql.mysql()
Вместо этого, автоматически выполняется следующий равноценный заменитель:
MySQL = luasql.mysql();

В AutoPlay, объекты среды представлены следующими категориями действий:

  • MySQL
  • SQLite3
  • Oracle
  • ODBC
  • PostgreSQL

Действия среды

xxxx:connect(sourcename[,username[,password]])

Подключение к источнику данных указанного в sourcename используя username и password, если они заданы. Sourcename (имя источника) может изменяться соответственно типа каждой базы данных.
Для MySQL и PostgreSQL, также можно предоставлять дополнительные hostname и port:

MySQL:connect(sourcename[,username[,password[,hostname[,port]]]])
PostgreSQL:connect(sourcename[,username[,password[,hostname[,port]]]])

Примечание: Для PostgreSQL, MySQL и SQLite sourcename (имя источника) это имя базы данных. Для ODBC это имя из DSN, а для драйвера Oracle это имя службы.

Возвращает объект соединения, который представляет соединение с источником данных.

xxxx:close()

Закрывает среду баз данных. Успешно только если вначале закрываются все соединения, относящиеся к нему.

Возвращает истину (true) в случае успеха. Возвращает ложь (false), если объект уже закрыт.

Действия подключения

Объект соединения содержит специфические атрибуты и параметры для одиночного соединения с источником данных. Объект соединения создается при помощи действия xxxx:connect().
Для полной интеграции с редактором скрипта следует называть объекты соединения "xxxxConnection", где "xxxx" заменяется названием базы данных, например MySQLConnection.

xxxxConnection:close()

Закрывает соединение. Успещно только в случае, если все курсоры, относящиеся к нему, были закрыты, а соединение осталось открытым.

Возвращает истину (true) в случае успеха.

xxxxConnection:commit()

Фиксирует (завершает) текущую транзакцию. Это свойство может не работать в системах баз данных, которые не выполняют транзакции.

Возвращает истину (true) в случае успеха. Возвращает ложь (false), если операция не может быть выполнена или не осуществлена.

xxxxConnection:execute(statement)

Выполняет данную SQL инструкцию.

Если есть результат, возвращает объект курсора или, в другом случае, число рядов, затронутых командой.

xxxxConnection:rollback()

Откат текущей транзакции. Это свойство может не работать в системах баз данных, которые не выполняют транзакции.

Возвращает истину (true) в случае успеха. Возвращает ложь (false), если операция не может быть выполнена или не осуществлена.

xxxxConnection:setautocommit(boolean)

Включает или выключает режим "auto commit". Это свойство может не работать в системах баз данных, которые не выполняют транзакции.

Возвращает истину (true) в случае успеха. Возвращает ложь (false), если операция не может быть выполнена или не осуществлена.

Действия курсора

Объект курсора содержит методы для получения данных в результате выполнения инструкции. Объект курсора создается при помощи действия xxxxConnection:execute().
Для полной интеграции с редактором скрипта следует называть объекты соединения "xxxxCursor" где "xxxx" заменяется названием базы данных, например OracleCursor.

xxxxCursor:close()

Закрывает курсор.

Возвращает истину (true) в случае успеха. Возвращает ложь (false), если объект уже закрыт.

xxxxCursor:fetch([table[,modestring]])

Возвращает следующую строку результата.

Если инструкция fetch вызвана без параметров, результаты будут возвращены непосредственно вызывающему. Если инструкция fetch вызвана с таблицей, результаты будут копированы в эту таблицу и измененная таблица будет возвращена. В этом случае, может быть использован дополнительный параметр modestring. Это просто строка, показывающая как должна быть построена результирующая таблица. Режим строки может содержать:

"n"   - результирующая таблица будет иметь числовые индексы (по умолчанию)
"a"   - результирующая таблица будет иметь алфавитно-числовые индексы

Числовые индексы являются позициями полей в инструкции SELECT; алфавитно-числовые индексы являются именами полей.

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

Гарантированных типов результата нет: они могут быть конвертированы драйвером, а могут и нет, в соответствующие Lua типы. В текущей реализации драйвера PostgreSQL и MySQL возвращают все значения как строки, в то время как драйверы ODBC и Oracle конвертируют их в Lua типы.

Возвращает таблицу данных, как показано выше, или нуль (ничто - nil), если рядов больше нет. Отметьте, что это действие может возвратить нуль (ничто - nil) в качестве истинного результата.

Примечание: В настоящее время драйвер MySQL не поддерживает параметры дополнительной таблицы или modestring. Единственно допустимый синтаксис это MySQLCursor:fetch().

xxxxCursor:getcolnames()

Возвращает таблицу имен столбцов.

xxxxCursor:getcoltypes()

Возвращает таблицу типов столбцов.

xxxxCursor:numrows()

Возвращает количество строк в результате запроса.

Примечание: Доступно только для MySQL, Oracle и PostgreSQL.
Смотрите также: Связанные действия

Примеры

Пример 1

SQLite3Connection, err = SQLite3:connect("test-db");

if not SQLite3Connection and err then
    Dialog.Message("Error", err);
end

SQLite3Connection:execute("DROP TABLE people");
SQLite3Connection:execute("CREATE TABLE people(name varchar(50), email varchar(50))");

-- add a few elements from a Lua table into the database table
-- добавляем несколько элементов из таблицы Lua в таблицу базы данных
list = {
    {name = "Jose das Couves", email = "jose@couves.com"},
    {name = "Manoel Joaquim", email = "manoel.joaquim@cafundo.com"},
    {name = "Maria das Dores", email = "maria@dores.com"}
};

for i, p in pairs(list) do
    SQLite3Connection:execute(string.format("INSERT INTO people VALUES ('%s', '%s')", p.name, p.email));
end

-- retrieve a cursor
-- получаем курсор
SQLite3Cursor = SQLite3Connection:execute("SELECT name, email from people");

-- print all the rows
-- печатаем все строки (ряды)
row = SQLite3Cursor:fetch({}, "a");
local s = "";
while row do
    s = s .. (string.format("Name: %s, Email: %s\n", row.name, row.email));

    -- get the next row, reusing the same table
    row = SQLite3Cursor:fetch(row, "a");
end
Dialog.Message("The 'people' table contains", s);

-- close everything
-- закрываем все
SQLite3Cursor:close();
SQLite3Connection:close();

Пример 2

Для MySQL, вышеупомянутый пример нужно немного изменить, так как MySQL в настоящее время не поддерживает дополнительные параметры fetch().
-- print all the rows
-- печатаем все строки (ряды)
local s = "";
for i = 1, MySQLCursor:numrows() do
    local name, email = MySQLCursor:fetch();
    s = s .. "Name: " .. name .. ", Email: " .. email .. "\n";
end

Dialog.Message("The 'people' table contains", s);
Также можно выполнить итерацию результатов при помощи функции итератора:
function rows(connection, sql_statement)
    local cursor = assert(connection:execute(sql_statement));
    return function()
        return cursor:fetch()
    end
end

MySQLConnection = MySQL:connect("mydatabase");
local s = "";
for name, email in rows(MySQLConnection, "select * from contacts") do
    s = s .. string.format("Name: %s, Email: %s\n", name, email);
end

Dialog.Message("The 'people' table contains", s);
Смотрите также: Связанные действия