Подключаемся к базе из разных языков программирования
Итак, мы создали базу данных в Tarantool. Теперь давайте посмотрим, как к ней можно подключиться из Python, PHP и Go.
Перед тем как идти дальше, выполним следующие действия:
Установим библиотеку
tarantool. Рекомендуется использоватьpython3иpip3.Запустим Tarantool (локально или в Docker) и обязательно создадим базу данных с тестовыми данными, как показано в предыдущем разделе:
box.cfg{listen = 3301} s = box.schema.space.create('tester') s:format({ {name = 'id', type = 'unsigned'}, {name = 'band_name', type = 'string'}, {name = 'year', type = 'unsigned'} }) s:create_index('primary', { type = 'hash', parts = {'id'} }) s:create_index('secondary', { type = 'hash', parts = {'band_name'} }) s:insert{1, 'Roxette', 1986} s:insert{2, 'Scorpions', 2015} s:insert{3, 'Ace of Base', 1993}
Важно
Не закрывайте окно терминала с запущенным Tarantool – оно пригодится нам позднее.
Чтобы иметь возможность подключаться к Tarantool в качестве администратора, сменим пароль пользователя
admin:box.schema.user.passwd('pass')
Для подключения к серверу достаточно выполнить следующее:
>>> import tarantool >>> connection = tarantool.connect("localhost", 3301) Также при необходимости можно указать имя пользователя и пароль:
>>> tarantool.connect("localhost", 3301, user=username, password=password) По умолчанию используется пользователь guest.
Спейс – это контейнер для кортежей. Чтобы обратиться к спейсу как к именованному объекту, воспользуемся функцией connection.space:
>>> tester = connection.space('tester') Для вставки нового кортежа в спейс воспользуемся функцией insert:
>>> tester.insert((4, 'ABBA', 1972)) [4, 'ABBA', 1972] Сначала выберем кортеж по первичному ключу (в нашем примере первичный индекс ––это индекс primary, построенный по полю id в каждом кортеже). Воспользуемся функцией select:
>>> tester.select(4) [4, 'ABBA', 1972] Теперь поищем кортежи по вторичному ключу. Для этого нужно указать номер или имя вторичного индекса.
Сначала сделаем запрос по номеру индекса:
>>> tester.select('Scorpions', index=1) [2, 'Scorpions', 2015] (Мы указываем index=1, потому что индексы в Tarantool нумеруются с нуля, а в данном случае мы обращаемся к индексу, который создавали вторым.)
Теперь сделаем аналогичный запрос по имени индекса и получим тот же результат:
>>> tester.select('Scorpions', index='secondary') [2, 'Scorpions', 2015] А чтобы выбрать все кортежи из спейса, вызовем select без аргументов:
>>> tester.select() Обновим значение поля с помощью update:
>>> tester.update(4, [('=', 1, 'New group'), ('+', 2, 2)]) Здесь мы обновляем значение поля 1 и увеличиваем значение поля 2 для кортежа с id = 4. Если кортежа с таким id нет, то Tarantool вернет ошибку.
Теперь с помощью функции replace мы полностью заменим кортеж с совпадающим первичным ключом. Если кортежа с указанным первичным ключом не существует, то эта операция ни к чему не приведет.
>>> tester.replace((4, 'New band', 2015)) Также мы можем обновлять данные с помощью функции upsert, которая работает аналогично update, но создает новый кортеж, если старый не был найден.
>>> tester.upsert((4, 'Another band', 2000), [('+', 2, 5)]) Здесь мы увеличиваем на 5 значение поля 2 в кортеже с id = 4 – или же вставляем кортеж (4, "Another band", 2000), если такого нет.
Чтобы удалить кортеж, нужно использовать delete(primary_key):
>>> tester.delete(4) [4, 'New group', 2012] Для удаления всех кортежей в спейсе (или всего спейса целиком) нужно воспользоваться функцией call. Мы поговорим о ней подробнее в следующем разделе.
Чтобы удалить все кортежи в спейсе, нужно вызвать функцию space:truncate:
>>> connection.call('box.space.tester:truncate', ()) Чтобы удалить весь спейс, нужно вызвать функцию space:drop. Для выполнения следующей команды необходимо подключиться из-под пользователя admin:
>>> connection.call('box.space.tester:drop', ()) Перейдем в терминал с запущенным Tarantool.
Примечание
О том, как установить удаленное подключение к Tarantool, можно прочитать здесь:
Напишем простую функцию на Lua:
function sum(a, b) return a + b end Итак, теперь у нас есть функция, описанная в Tarantool. Чтобы вызвать ее из python, нам нужна функция call:
>>> connection.call('sum', (3, 2)) 5 Также мы можем передать на выполнение любой Lua-код. Для этого воспользуемся функцией eval:
>>> connection.eval('return 4 + 5') 9 Перед тем как идти дальше, выполним следующие действия:
Установим библиотеку
tarantool/client.Запустим Tarantool (локально или в Docker) и обязательно создадим базу данных с тестовыми данными, как показано в предыдущем разделе:
box.cfg{listen = 3301} s = box.schema.space.create('tester') s:format({ {name = 'id', type = 'unsigned'}, {name = 'band_name', type = 'string'}, {name = 'year', type = 'unsigned'} }) s:create_index('primary', { type = 'hash', parts = {'id'} }) s:create_index('secondary', { type = 'hash', parts = {'band_name'} }) s:insert{1, 'Roxette', 1986} s:insert{2, 'Scorpions', 2015} s:insert{3, 'Ace of Base', 1993}
Важно
Не закрывайте окно терминала с запущенным Tarantool – оно пригодится нам позднее.
Чтобы иметь возможность подключаться к Tarantool в качестве администратора, сменим пароль пользователя
admin:box.schema.user.passwd('pass')
Для настройки подключения к серверу достаточно выполнить следующее:
use Tarantool\Client\Client; require __DIR__.'/vendor/autoload.php'; $client = Client::fromDefaults(); Само подключение будет установлено при первом запросе. Также при необходимости можно указать имя пользователя и пароль:
$client = Client::fromOptions([ 'uri' => 'tcp://127.0.0.1:3301', 'username' => '<username>', 'password' => '<password>' ]); По умолчанию используется пользователь guest.
Спейс – это контейнер для кортежей. Чтобы обратиться к спейсу как к именованному объекту, воспользуемся функцией getSpace:
$tester = $client->getSpace('tester'); Для вставки нового кортежа в спейс воспользуемся функцией insert:
$result = $tester->insert([4, 'ABBA', 1972]); Сначала выберем кортеж по первичному ключу (в нашем примере первичный индекс ––это индекс primary, построенный по полю id в каждом кортеже). Воспользуемся функцией select:
use Tarantool\Client\Schema\Criteria; $result = $tester->select(Criteria::key([4])); printf(json_encode($result)); [[4, 'ABBA', 1972]] Теперь поищем кортежи по вторичному ключу. Для этого нужно указать номер или имя вторичного индекса.
Сначала сделаем запрос по номеру индекса:
$result = $tester->select(Criteria::index(1)->andKey(['Scorpions'])); printf(json_encode($result)); [2, 'Scorpions', 2015] (Мы указываем index(1), потому что индексы в Tarantool нумеруются с нуля, а в данном случае мы обращаемся к индексу, который создавали вторым.)
Теперь сделаем аналогичный запрос по имени индекса и получим тот же результат:
$result = $tester->select(Criteria::index('secondary')->andKey(['Scorpions'])); printf(json_encode($result)); [2, 'Scorpions', 2015] А чтобы выбрать все кортежи из спейса, вызовем select:
$result = $tester->select(Criteria::allIterator()); Обновим значение поля с помощью update:
use Tarantool\Client\Schema\Operations; $result = $tester->update([4], Operations::set(1, 'New group')->andAdd(2, 2)); Здесь мы обновляем значение поля 1 и увеличиваем значение поля 2 для кортежа с id = 4. Если кортежа с таким id нет, то Tarantool вернет ошибку.
Теперь с помощью функции replace мы полностью заменим кортеж с совпадающим первичным ключом. Если кортежа с указанным первичным ключом не существует, то эта операция ни к чему не приведет.
$result = $tester->replace([4, 'New band', 2015]); Также мы можем обновлять данные с помощью функции upsert, которая работает аналогично update, но создает новый кортеж, если старый не был найден.
use Tarantool\Client\Schema\Operations; $tester->upsert([4, 'Another band', 2000], Operations::add(2, 5)); Здесь мы увеличиваем на 5 значение поля 2 в кортеже с id = 4 – или же вставляем кортеж (4, "Another band", 2000), если такого нет.
Чтобы удалить кортеж, нужно использовать delete(primary_key):
$result = $tester->delete([4]); Для удаления всех кортежей в спейсе (или всего спейса целиком) нужно воспользоваться функцией call. Мы поговорим о ней подробнее в следующем разделе.
Чтобы удалить все кортежи в спейсе, нужно вызвать функцию space:truncate:
$result = $client->call('box.space.tester:truncate'); Чтобы удалить весь спейс, нужно вызвать функцию space:drop. Для выполнения следующей команды необходимо подключиться из-под пользователя admin:
$result = $client->call('box.space.tester:drop'); Перейдем в терминал с запущенным Tarantool.
Примечание
О том, как установить удаленное подключение к Tarantool, можно прочитать здесь:
Напишем простую функцию на Lua:
function sum(a, b) return a + b end Итак, теперь у нас есть функция, описанная в Tarantool. Чтобы вызвать ее из php, нам нужна функция call:
$result = $client->call('sum', 3, 2); Также мы можем передать на выполнение любой Lua-код. Для этого воспользуемся функцией eval:
$result = $client->evaluate('return 4 + 5'); Перед тем как идти дальше, выполним следующие действия:
Установим библиотеку
go-tarantool.Запустим Tarantool (локально или в Docker) и обязательно создадим базу данных с тестовыми данными, как показано в предыдущем разделе:
box.cfg{listen = 3301} s = box.schema.space.create('tester') s:format({ {name = 'id', type = 'unsigned'}, {name = 'band_name', type = 'string'}, {name = 'year', type = 'unsigned'} }) s:create_index('primary', { type = 'hash', parts = {'id'} }) s:create_index('secondary', { type = 'hash', parts = {'band_name'} }) s:insert{1, 'Roxette', 1986} s:insert{2, 'Scorpions', 2015} s:insert{3, 'Ace of Base', 1993}
Важно
Не закрывайте окно терминала с запущенным Tarantool – оно пригодится нам позднее.
Чтобы иметь возможность подключаться к Tarantool в качестве администратора, сменим пароль пользователя
admin:box.schema.user.passwd('pass')
Простая программа, выполняющая подключение к серверу, будет выглядеть так:
package main import ( "fmt" "github.com/tarantool/go-tarantool" ) func main() { conn, err := tarantool.Connect("127.0.0.1:3301", tarantool.Opts{ User: "admin", Pass: "pass", }) if err != nil { log.Fatalf("Connection refused") } defer conn.Close() // Ваш код общения с базой } По умолчанию используется пользователь guest.
Для вставки нового кортежа в спейс воспользуемся функцией Insert:
resp, err = conn.Insert("tester", []interface{}{4, "ABBA", 1972}) В этом примере в спейс tester вставляется кортеж (4, "ABBA", 1972).
Код ответа и данные можно получить из структуры tarantool.Response:
code := resp.Code data := resp.Data Чтобы выбрать кортеж из спейса, воспользуемся функцией Select:
resp, err = conn.Select("tester", "primary", 0, 1, tarantool.IterEq, []interface{}{4}) В этом примере мы ищем кортеж по первичному ключу с offset = 0 и limit = 1 в спейсе tester (первичный индекс в нашем примере – это индекс primary, построенный по полю id в каждом кортеже).
Теперь поищем по вторичному ключу:
resp, err = conn.Select("tester", "secondary", 0, 1, tarantool.IterEq, []interface{}{"ABBA"}) Наконец, было бы интересно сделать полную выборку даных из спейса. Но в рамках языка Go эта задача не решается в одну строчку. Пример такой программы вы можете посмотреть в отдельном разделе документации.
Более сложные примеры выборок можно увидеть тут: https://github.com/tarantool/go-tarantool#usage
Обновим значение поля с помощью Update:
resp, err = conn.Update("tester", "primary", []interface{}{4}, []interface{}{[]interface{}{"+", 2, 3}}) Здесь мы увеличиваем на 3 значение поля 2 для кортежа с id = 4. Если кортежа с таким id нет, то Tarantool вернет ошибку.
Теперь с помощью функции Replace мы полностью заменим кортеж с совпадающим первичным ключом. Если кортежа с указанным первичным ключом не существует, то эта операция ни к чему не приведет.
resp, err = conn.Replace("tester", []interface{}{4, "New band", 2011}) Также мы можем обновлять данные с помощью функции Upsert, которая работает аналогично Update, но создает новый кортеж, если старый не был найден.
resp, err = conn.Upsert("tester", []interface{}{4, "Another band", 2000}, []interface{}{[]interface{}{"+", 2, 5}}) Здесь мы увеличиваем на 5 значение третьего поля в кортеже с id = 4 – или же вставляем кортеж (4, "Another band", 2000), если такого нет.
Чтобы удалить кортеж, воспользуемся функцией сonnection.Delete:
resp, err = conn.Delete("tester", "primary", []interface{}{4}) Для удаления всех кортежей в спейсе (или всего спейса целиком), нужно воспользоваться функцией Call. Мы поговорим о ней подробнее в следующем разделе.
Чтобы удалить все кортежи в спейсе, нужно вызвать функцию space:truncate:
resp, err = conn.Call("box.space.tester:truncate", []interface{}{}) Чтобы удалить весь спейс, нужно вызвать функцию space:drop. Для выполнения следующей команды необходимо подключиться из-под пользователя admin:
resp, err = conn.Call("box.space.tester:drop", []interface{}{}) Перейдем в терминал с запущенным Tarantool.
Примечание
О том, как установить удаленное подключение к Tarantool, можно прочитать здесь:
Напишем простую функцию на Lua:
function sum(a, b) return a + b end Итак, теперь у нас есть функция, описанная в Tarantool. Чтобы вызвать ее из go, нам нужна функция Call:
resp, err = conn.Call("sum", []interface{}{2, 3}) Также мы можем передать на выполнение любой Lua-код. Для этого воспользуемся функцией Eval:
resp, err = connection.Eval("return 4 + 5", []interface{}{})