From 6f3d393bf53376e39c6ec137f96deafc2de6e9bf Mon Sep 17 00:00:00 2001 From: ocelot-inc <pgulutzan@ocelot.ca> Date: Mon, 5 Oct 2015 12:06:20 -0600 Subject: [PATCH] PostgreSQL rock --- doc/sphinx/book/app_d_plugins.rst | 304 +++++++++++++++++++++--------- 1 file changed, 216 insertions(+), 88 deletions(-) diff --git a/doc/sphinx/book/app_d_plugins.rst b/doc/sphinx/book/app_d_plugins.rst index 64b7bc6f9b..93d63be7b1 100644 --- a/doc/sphinx/book/app_d_plugins.rst +++ b/doc/sphinx/book/app_d_plugins.rst @@ -1,30 +1,31 @@ .. _dbms-plugins: ------------------------------------------------------------------------------- - Appendix D. Plugins + Appendix D. Modules ------------------------------------------------------------------------------- -A plugin is an optional library which enhances Tarantool functionality. +A module is an optional library which enhances Tarantool functionality. -The details of creating one's own plugin are described on the `Tarantool Plugin API wiki page`_. +For examples of creating one's own module with Lua or C, see +`gist.github.com/rtsisyk/aa95cf9ed9bbb538ff80`_. The discussion here in the user guide is about incorporating and using two -plugins that have already been created: the "SQL DBMS plugins" for +modules that have already been created: the "SQL DBMS rocks" for MySQL and PostgreSQL. =========================================================== - SQL DBMS Plugins + SQL DBMS Modules =========================================================== To call another DBMS from Tarantool, the essential requirements are: another -DBMS, and Tarantool. +DBMS, and Tarantool. The module which connects Tarantool to another DBMS may +be called a "connector". Within the module there is a shared library which +may be called a "driver". -It will be necessary to build Tarantool from source, as described in -“:ref:`building-from-source`â€. +Tarantool supplies DBMS connector modules with the package manager for Lua, +LuaRocks. So the connector modules may be called "rocks". -.. _Tarantool Plugin API wiki page: https://github.com/tarantool/tarantool/wiki/Plugin-API - -The Tarantool plugins allow for connecting to an SQL server and executing SQL +The Tarantool rocks allow for connecting to an SQL server and executing SQL statements the same way that a MySQL or PostgreSQL client does. The SQL statements are visible as Lua methods. Thus Tarantool can serve as a "MySQL Lua Connector" or "PostgreSQL Lua Connector", which would be useful even if that was @@ -32,12 +33,13 @@ all Tarantool could do. But of course Tarantool is also a DBMS, so the plugin also is useful for any operations, such as database copying and accelerating, which work best when the application can work on both SQL and Tarantool inside the same Lua routine. - -The connection method is -:samp:`box.net.sql.connect('mysql'|'pg', {host}, {port}, {user}, {password}, {database})`. -The methods for select/insert/etc. are the same as the ones in the +The methods for connect/select/insert/etc. are similar to the ones in the :ref:`net.box <package_net_box>` package. +From a user's point of view the MySQL and PostgreSQL rocks are +very similar, so the following sections -- "MySQL Example" and +"PostgreSQL Example" -- contain some redundancy. + =========================================================== MySQL Example @@ -72,12 +74,13 @@ with luarocks or with github. With luarocks ... Begin by installing luarocks and making sure that tarantool is among the upstream servers, as in the instructions on `rocks.tarantool.org`_, the Tarantool luarocks page. Now execute this: |br| -:codenormal:`luarocks install mysql [MYSQL_LIBDIR=...] [MYSQL_INCDIR=...] [--local]` |br| +:codenormal:`luarocks install mysql [MYSQL_LIBDIR=` :codeitalic:`name` :codenormal:`] [MYSQL_INCDIR=` :codeitalic:`name` :codenormal:`] [--local]` |br| For example: |br| :codebold:`luarocks install mysql MYSQL_LIBDIR=/usr/local/mysql/lib` With github ... go the site `github.com/tarantool/mysql`_. Follow the instructions there, saying + | :codebold:`git clone https://github.com/tarantool/mysql.git` | :codebold:`cd mysql && cmake . -DCMAKE_BUILD_TYPE=RelWithDebugInfo` | :codebold:`make` @@ -90,8 +93,7 @@ is on a directory that is searched by the :code:`require` request. HOW TO CONNECT: Begin by making a :code:`require` request for the mysql driver. -For example, |br| -:codebold:`mysql = require('mysql')` |br| +For example, :codebold:`mysql = require('mysql')`. We will assume that the name is :code:`mysql` in further examples. Now, say |br| @@ -129,7 +131,7 @@ Example, creating a function which sets each option in a separate line: | :codenormal:`tarantool>` :codebold:`console.delimiter('')!` | :codenormal:`---` | :codenormal:`...` - | :codenormal:`tarantool>` :codebold:`conn = mysql.connect()` + | :codenormal:`tarantool>` :codebold:`conn = mysql_connect()` | :codenormal:`---` | :codenormal:`...` @@ -137,8 +139,10 @@ We will assume that the name is 'conn' in further examples. HOW TO PING: -To ensure that a connection is working, the request is: |br| -:codeitalic:`connection-name` :codenormal:`:` :codenormal:`ping()` |br| +To ensure that a connection is working, the request is: + + | :codeitalic:`connection-name` :codenormal:`:` :codenormal:`ping()` + Example: |br| | :codenormal:`tarantool>` :codebold:`conn:ping()` | :codenormal:`---` @@ -211,7 +215,7 @@ mysqld server is already running on the local host 127.0.0.1. | :codenormal:`$` :codebold:`sudo apt-get -y install luarocks | grep "Setting up"` | :codenormal:`Setting up luarocks (2.0.8-2) ...` | - | :codenormal:`# Set up the Tarantool rock pile in ~/.luarocks,` + | :codenormal:`# Set up the Tarantool rock list in ~/.luarocks,` | :codenormal:`# following instructions at rocks.tarantool.org` | :codenormal:`$` :codebold:`mkdir ~/.luarocks` | :codenormal:`$` :codebold:`echo "rocks_servers = {[[http://rocks.tarantool.org/]]}" >> ~/.luarocks/config.lua` @@ -285,30 +289,145 @@ mysqld server is already running on the local host 127.0.0.1. | :codenormal:`# So this is the row that was inserted into the MySQL database.` | :codenormal:`# And now it's been selected with the Tarantool client.` -.. _rocks.tarantool.org: http://rocks.tarantool.org/ -.. _github.com/tarantool/mysql: https://github.com/tarantool/mysql -.. _dev.mysql.com/doc/refman/5.6/en/connecting.html: https://dev.mysql.com/doc/refman/5.6/en/connecting.html -.. _github.com/tarantool/mysql: https://github.com/tarantool/mysql =========================================================== PostgreSQL Example =========================================================== -This example assumes that a recent version of PostgreSQL has been installed. -The PostgreSQL library and include files are also necessary. On Ubuntu they -can be installed with - - | :codebold:`$ sudo apt-get install libpq-dev` - -If that works, then cmake will find the necessary files without requiring any -special user input. However, because not all platforms are alike, for this +This example assumes that PostgreSQL 8 or PostgreSQL 9 has been installed. +More recent versions should also work. +The package that matters most is the PostgreSQL +developer package, typically named something like libpq-dev. +On Ubuntu this can be installed with |br| +:codebold:`sudo apt-get install libpq-dev` |br| +However, because not all platforms are alike, for this example the assumption is that the user must check that the appropriate PostgreSQL files are present and must explicitly state where they are when -building Tarantool from source. +building the Tarantool/PostgreSQL driver. +One can use :code:`find` or :code:`whereis` to see what +directories PostgreSQL files are installed in. + +It will be necessary to install Tarantool's PostgreSQL driver shared library, +load it, and use it to connect to a PostgreSQL server. +After that, one can pass any PostgreSQL statement to the server and +receive results. + +HOW TO INSTALL: + +Check the instructions for +:ref:`Downloading and installing a binary package <downloading-and-installing-a-binary-package>` +that apply for the environment where tarantool was installed. +In addition to installing :code:`tarantool`, install :code:`tarantool-dev`. +For example, on Ubuntu, add the line |br| +:codebold:`sudo apt-get install tarantool-dev` + +Now, for the PostgreSQL driver shared library, there are two ways to install: +with luarocks or with github. + +With luarocks ... Begin by installing luarocks and making sure that +tarantool is among the upstream servers, as in the instructions on +`rocks.tarantool.org`_, the Tarantool luarocks page. Now execute this: |br| +:codenormal:`luarocks install pg [POSTGRESQL_LIBDIR=` :codeitalic:`name` :codenormal:`] [POSTGRESQL_INCDIR=` :codeitalic:`name` :codenormal:`] [--local]` |br| +For example: |br| +:codebold:`luarocks install pg POSTGRESQL_LIBDIR=/usr/local/postgresql/lib` + +With github ... go the site `github.com/tarantool/pg`_. +Follow the instructions there, saying + + | :codebold:`git clone https://github.com/tarantool/pg.git` + | :codebold:`cd pg && cmake . -DCMAKE_BUILD_TYPE=RelWithDebugInfo` + | :codebold:`make` + | :codebold:`make install` + +At this point it is a good idea to check that the installation +produced a file named :code:`driver.so`, and to check that this file +is on a directory that is searched by the :code:`require` request. + +HOW TO CONNECT: + +Begin by making a :code:`require` request for the pg driver. +For example, :codebold:`pg = require('pg')`. +We will assume that the name is :code:`pg` in further examples. + +Now, say |br| +:codenormal:`connection_name = pg.connect(` :codeitalic:`connection options` :codenormal:`)` |br| +The connection-options parameter is a table. +The possible options are: |br| +:codenormal:`host =` :codeitalic:`host-name` -- string |br| +:codenormal:`port =` :codeitalic:`port-number` -- number |br| +:codenormal:`user =` :codeitalic:`user-name` -- string |br| +:codenormal:`password =` :codeitalic:`password` or :codenormal:`pass =` :codeitalic:`password` -- string |br| +:codenormal:`db =` :codeitalic:`database-name` -- string |br| +The names are similar to the names that PostgreSQL itself uses. +|br| + +Example, using a table literal enclosed in {braces}: |br| +:codebold:`conn = pg.connect({host='127.0.0.1', port=3306, user='p', password='p', db='test'})` |br| + +Example, creating a function which sets each option in a separate line: + | :codenormal:`# Connection function. Usage: conn = pg_connect()` + | :codenormal:`tarantool>` :codebold:`console = require('console'); console.delimiter('!')` + | :codenormal:`tarantool>` :codebold:`function pg_connect ()` + | |nbsp| |nbsp| |nbsp| :codenormal:`>` :codebold:`p = {}` + | |nbsp| |nbsp| |nbsp| :codenormal:`>` :codebold:`p.host = 'widgets.com'` + | |nbsp| |nbsp| |nbsp| :codenormal:`>` :codebold:`p.db = 'test'` + | |nbsp| |nbsp| |nbsp| :codenormal:`>` :codebold:`conn = pg.connect(p)` + | |nbsp| |nbsp| |nbsp| :codenormal:`>` :codebold:`return conn` + | |nbsp| |nbsp| |nbsp| :codenormal:`>` :codebold:`end!` + | :codenormal:`---` + | :codenormal:`...` + | :codenormal:`tarantool>` :codebold:`console.delimiter('')!` + | :codenormal:`---` + | :codenormal:`...` + | :codenormal:`tarantool>` :codebold:`conn = pg_connect()` + | :codenormal:`---` + | :codenormal:`...` + +We will assume that the name is 'conn' in further examples. + +HOW TO PING: + +To ensure that a connection is working, the request is: + + | :codeitalic:`connection-name` :codenormal:`:` :codenormal:`ping()` + +Example: |br| + | :codenormal:`tarantool>` :codebold:`conn:ping()` + | :codenormal:`---` + | :codenormal:`- true` + | :codenormal:`...` + +HOW TO EXECUTE A STATEMENT: |br| -The example was run on a Linux machine where the base directory had a copy of -the Tarantool source on ~/tarantool, and a copy of PostgreSQL on /usr. The -postgres server is already running on the local host 127.0.0.1. +For all PostgreSQL statements, the request is: |br| +:codeitalic:`connection-name` :codenormal:`:` :codenormal:`execute(` :codeitalic:`sql-statement` [, :codeitalic:`parameters` :codenormal:`])` |br| +where :code:`sql-statement` is a string, and the optional :code:`parameters` +are extra values that can be plugged in to replace any question marks ("?"s) in the SQL statement. |br| + +For example: |br| + | :codenormal:`tarantool>` :codebold:`conn:execute('select tablename from pg_tables')` + | :codenormal:`---` + | :codenormal:`- - table_name: ALL_PLUGINS` + | |nbsp| |nbsp| :codenormal:`- tablename: pg_statistic` + | |nbsp| |nbsp| :codenormal:`- tablename: pg_type` + | |nbsp| :codenormal:`...` + | :codenormal:`...` + +HOW TO CLOSE: + +To end a session that began with :code:`pg.connect`, the request is: |br| +:codeitalic:`connection-name` :codenormal:`:` :codenormal:`close()` |br| +For example: |br| +:codebold:`conn:close()` + +For further information, including examples of rarely-used requests, +see the README.md file at `github.com/tarantool/pg`_. + +LONG EXAMPLE: + +The example was run on an Ubuntu 12.04 ("precise") machine where tarantool +had been installed in a /usr subdirectory, and a copy of PostgreSQL had been installed on /usr. The +PostgreSQL server is already running on the local host 127.0.0.1. | :codenormal:`# Check that the include subdirectory exists` | :codenormal:`# by looking for /usr/include/postgresql/libpq-fe-h.` @@ -316,7 +435,7 @@ postgres server is already running on the local host 127.0.0.1. | :codenormal:`OK` | | :codenormal:`# Check that the library subdirectory exists and has the necessary .so file.` - | :codenormal:`$` :codebold:`[ -f /usr/lib/libpq.so ] && echo "OK" || echo "Error"` + | :codenormal:`$` :codebold:`[ -f /usr/lib/x86_64-linux-gnu/libpq.so ] && echo "OK" || echo "Error"` | :codenormal:`OK` | | :codenormal:`# Check that the psql client can connect using some factory defaults:` @@ -336,80 +455,89 @@ postgres server is already running on the local host 127.0.0.1. | :codenormal:`postgres=#` :codebold:`\\q` | :codenormal:`$` | - | :codenormal:`# Build the Tarantool server. Make certain that "cmake" gets the right` - | :codenormal:`# paths for the PostgreSQL include directory and the PostgreSQL libpq` - | :codenormal:`# library which were checked earlier.` - | :codenormal:`$` :codebold:`cd ~/tarantool` - | :codenormal:`$` :codebold:`make clean` - | :codenormal:`$` :codebold:`rm CMakeCache.txt` - | :codenormal:`$` :codebold:`cmake . -DWITH_POSTGRESQL=on -DPostgreSQL_LIBRARY=/usr/lib/libpq.so\\` - | :codenormal:`>` |nbsp| :codebold:`-DPostgreSQL_INCLUDE_DIR=/usr/include/postgresql` - | :codenormal:`...` - | :codenormal:`-- Found PostgreSQL: /usr/lib/libpq.so (found version "9.3.2")` - | :codenormal:`...` - | :codenormal:`-- Configuring done` - | :codenormal:`-- Generating done` - | :codenormal:`-- Build files have been written to: ~/tarantool` - | :codenormal:`$` :codebold:`make` - | :codenormal:`...` - | :codenormal:`[ 79%] Building CXX object src/plugin/pg/CMakeFiles/pg.dir/pg.cc.o` - | :codenormal:`Linking CXX shared library libpg.so` - | :codenormal:`[ 79%] Built target pg` - | :codenormal:`...` - | :codenormal:`[100%] Built target man` + | :codenormal:`# Install luarocks` + | :codenormal:`$` :codebold:`sudo apt-get -y install luarocks | grep "Setting up"` + | :codenormal:`Setting up luarocks (2.0.8-2) ...` + | + | :codenormal:`# Set up the Tarantool rock list in ~/.luarocks,` + | :codenormal:`# following instructions at rocks.tarantool.org` + | :codenormal:`$` :codebold:`mkdir ~/.luarocks` + | :codenormal:`$` :codebold:`echo "rocks_servers = {[[http://rocks.tarantool.org/]]}" >> ~/.luarocks/config.lua` + | + | :codenormal:`# Ensure that the next "install" will get files from Tarantool master repository` + | :codenormal:`# The resultant display is normal for Ubuntu 12.04 precise` + | :codenormal:`$` :codebold:`cat /etc/apt/sources.list.d/tarantool.list` + | :codenormal:`deb http://tarantool.org/dist/master/ubuntu/ precise main` + | :codenormal:`deb-src http://tarantool.org/dist/master/ubuntu/ precise main` + | + | :codenormal:`# Install tarantool-dev. The displayed line should show version = 1.6` + | :codenormal:`$` :codebold:`sudo apt-get -y install tarantool-dev | grep "Setting up"` + | :codenormal:`Setting up tarantool-dev (1.6.6.222.g48b98bb~precise-1) ...` | :codenormal:`$` | + | :codenormal:`# Use luarocks to install locally, that is, relative to $HOME` + | :codenormal:`$` :codebold:`luarocks install pg POSTGRESQL_LIBDIR=/usr/lib/x86_64-linux-gnu --local` + | :codenormal:`Installing http://rocks.tarantool.org/pg-scm-1.rockspec...` + | :codenormal:`... (more information about building the Tarantool/PostgreSQL driver appears here) ...` + | :codenormal:`pg scm-1 is now built and installed in ~/.luarocks/` + | + | :codenormal:`# Ensure driver.so now has been created in a place tarantool will look at` + | :codenormal:`$` :codebold:`find ~/.luarocks -name "driver.so"` + | :codenormal:`~/.luarocks/lib/lua/5.1/pg/driver.so` + | | :codenormal:`# Change directory to a directory which can be used for temporary tests.` | :codenormal:`# For this example we assume that the name of this directory is` | :codenormal:`# /home/pgulutzan/tarantool_sandbox. (Change "/home/pgulutzan" to whatever` - | :codenormal:`# is the actual base directory for the machine that's used for this test.)` - | :codenormal:`# Now, to help tarantool find the essential mysql.so file, execute these lines:` + | :codenormal:`# is the user's actual home directory for the machine that's used for this test.)` | :codebold:`cd /home/pgulutzan/tarantool_sandbox` - | :codebold:`mkdir box` - | :codebold:`mkdir box/net` - | :codebold:`cp ~/tarantool/src/module/pg/pg.so ./box/net/pg.so` | | :codenormal:`# Start the Tarantool server. Do not use a Lua initialization file.` | - | :codenormal:`$` :codebold:`~/tarantool/src/tarantool` - | :codenormal:`~/tarantool/src/tarantool: version 1.6.3-439-g7e1011b` + | :codenormal:`$` :codebold:`tarantool` + | :codenormal:`tarantool: version 1.6.6-222-g48b98bb` | :codenormal:`type 'help' for interactive help` | :codenormal:`tarantool>` :codebold:`box.cfg{}` - | - | :codenormal:`# Enter the following lines on the prompt (again, change "/home/pgulutzan"` - | :codenormal:`# to whatever the real directory is that contains tarantool):` - | :codenormal:`package.path = "/home/pgulutzan/tarantool/src/module/sql/?.lua;"..package.path` - | :codenormal:`require("sql")` - | :codenormal:`if type(box.net.sql) ~= "table" then error("net.sql load failed") end` - | :codenormal:`require("box.net.pg")` - | :codenormal:`# ... Make sure that tarantool replies "true" for the calls to "require()".` + | :codenormal:`...` + | :codenormal:`# Request the pg package` + | :codenormal:`tarantool>` :codebold:`pg = require('pg')` + | :codenormal:`# ... Make sure that tarantool does not reply "error" for the call to "require()".` | | :codenormal:`# Create a Lua function that will connect to the PostgreSQL server,` + | :codenormal:`# (using some factory default values for the port and user and password),` | :codenormal:`# retrieve one row, and display the row.` | :codenormal:`# For explanations of the statement types used here, read the` - | :codenormal:`# Lua tutorial in the Tarantool user manual.` + | :codenormal:`# Lua tutorial earlier in the Tarantool user manual.` | :codenormal:`tarantool>` :codebold:`console = require('console'); console.delimiter('!')` - | :codenormal:`tarantool>` :codebold:`function postgresql_select ()` - | |nbsp| |nbsp| |nbsp| |nbsp| |nbsp| :codenormal:`->` |nbsp| |nbsp| :codebold:`local dbh = box.net.sql.connect(` - | |nbsp| |nbsp| |nbsp| |nbsp| |nbsp| :codenormal:`->` |nbsp| |nbsp| |nbsp| |nbsp| :codebold:`'pg', '127.0.0.1', 5432, 'postgres', 'postgres', 'postgres')` - | |nbsp| |nbsp| |nbsp| |nbsp| |nbsp| :codenormal:`->` |nbsp| |nbsp| :codebold:`local test = dbh:select('SELECT * FROM test WHERE s1 = 1')` - | |nbsp| |nbsp| |nbsp| |nbsp| |nbsp| :codenormal:`->` |nbsp| |nbsp| :codebold:`local row = ''` - | |nbsp| |nbsp| |nbsp| |nbsp| |nbsp| :codenormal:`->` |nbsp| |nbsp| :codebold:`for i, card in pairs(test) do` - | |nbsp| |nbsp| |nbsp| |nbsp| |nbsp| :codenormal:`->` |nbsp| |nbsp| |nbsp| |nbsp| :codebold:`row = row .. card.s2 .. ' '` - | |nbsp| |nbsp| |nbsp| |nbsp| |nbsp| :codenormal:`->` |nbsp| |nbsp| |nbsp| |nbsp| :codebold:`end` - | |nbsp| |nbsp| |nbsp| |nbsp| |nbsp| :codenormal:`->` |nbsp| |nbsp| :codebold:`return row` - | |nbsp| |nbsp| |nbsp| |nbsp| |nbsp| :codenormal:`->` |nbsp| |nbsp| :codebold:`end!` + | :codenormal:`tarantool>` :codebold:`function pg_select ()` + | |nbsp| |nbsp| |nbsp| |nbsp| |nbsp| :codenormal:`->` |nbsp| :codebold:`local conn = pg.connect(` + | |nbsp| |nbsp| |nbsp| |nbsp| |nbsp| :codenormal:`->` |nbsp| |nbsp| |nbsp| :codebold:`{host='127.0.0.1', port=5432, user='postgres', password='postgres', db='postgres'})` + | |nbsp| |nbsp| |nbsp| |nbsp| |nbsp| :codenormal:`->` |nbsp| :codebold:`local test = conn:execute('SELECT * FROM test WHERE s1 = 1')` + | |nbsp| |nbsp| |nbsp| |nbsp| |nbsp| :codenormal:`->` |nbsp| :codebold:`local row = ''` + | |nbsp| |nbsp| |nbsp| |nbsp| |nbsp| :codenormal:`->` |nbsp| :codebold:`for i, card in pairs(test) do` + | |nbsp| |nbsp| |nbsp| |nbsp| |nbsp| :codenormal:`->` |nbsp| |nbsp| |nbsp| :codebold:`row = row .. card.s2 .. ' '` + | |nbsp| |nbsp| |nbsp| |nbsp| |nbsp| :codenormal:`->` |nbsp| |nbsp| |nbsp| :codebold:`end` + | |nbsp| |nbsp| |nbsp| |nbsp| |nbsp| :codenormal:`->` |nbsp| :codebold:`conn:close()` + | |nbsp| |nbsp| |nbsp| |nbsp| |nbsp| :codenormal:`->` |nbsp| :codebold:`return row` + | |nbsp| |nbsp| |nbsp| |nbsp| |nbsp| :codenormal:`->` |nbsp| :codebold:`end!` | :codenormal:`---` | :codenormal:`...` | :codenormal:`tarantool>` :codebold:`console.delimiter('')!` | :codenormal:`tarantool>` | | :codenormal:`# Execute the Lua function.` - | :codenormal:`tarantool>` :codebold:`postgresql_select()` + | :codenormal:`tarantool>` :codebold:`pg_select()` | :codenormal:`---` | :codenormal:`- 'PostgreSQL row '` | :codenormal:`...` - | | :codenormal:`# Observe the result. It contains "PostgreSQL row".` | :codenormal:`# So this is the row that was inserted into the PostgreSQL database.` | :codenormal:`# And now it's been selected with the Tarantool client.` + + +.. _gist.github.com/rtsisyk/aa95cf9ed9bbb538ff80: https://gist.github.com/rtsisyk/aa95cf9ed9bbb538ff80 +.. _rocks.tarantool.org: http://rocks.tarantool.org/ +.. _github.com/tarantool/mysql: https://github.com/tarantool/mysql +.. _dev.mysql.com/doc/refman/5.6/en/connecting.html: https://dev.mysql.com/doc/refman/5.6/en/connecting.html +.. _github.com/tarantool/mysql: https://github.com/tarantool/mysql +.. _github.com/tarantool/pg: https://github.com/tarantool/pg + -- GitLab