RussianLDP Рейтинг@Mail.ru
WebMoney: 
WMZ Z294115950220 
WMR R409981405661 
WME E134003968233 
Visa 
4274 3200 2453 6495 

Глава 2. Связи и понятие сессии

Этот раздел объясняет понятие связей и сессий, как используются в X DevAPI. Примеры кода для соединения с MySQL Document Store (см. Using MySQL as a Document Store) и применения сессий.

Сессия X DevAPI это понятие сессии базы данных высокого уровня, которое отличается от работы с традиционными подключениями низкого уровня MySQL. Сессии могут заключить в капсулу одно или несколько фактических подключений MySQL, используя X-протокол. Использование этого более высокого уровня абстракции отцепляет физическую установку MySQL от кода приложения. Сессии оказывают полную поддержку X DevAPI и ограниченную поддержку SQL. При использовании MySQL Shell, когда подключение mysql низкого уровня к единственному серверу MySQL необходимо, это все еще поддерживается при помощи ClassicSession, который оказывает полную поддержку SQL.

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

2.1. Пример соединения с базой данных

Код, который необходим, чтобы соединиться с MySQL document store, походит на традиционный код подключения mysql, но теперь запросы могут установить логические сессии к серверу MySQL с X Plugin. Сессии производятся mysqlx и возвращенные сессии могут заключить в капсулу доступ к одному или более экземпляру сервера MySQL с X Plugin. Приложения, которые используют объекты сессии по умолчанию, могут быть развернуты на единственном сервере и на кластере базы данных без кодовых изменений. Создайте сессию, используя mysqlx.getSession(connection). Вы передаете параметры связи, чтобы соединиться с сервером MySQL, такие как имя хоста, пользователь и так далее, как код в одном из классического API. Параметры связи могут быть определены как любая последовательность типа URI, например, user:@localhost:33060, или как словарь данных, например, {user: myuser, password: mypassword, host: example.com, port: 33060}. См. Connecting to the Server Using URI-Like Strings or Key-Value Pairs.

Учетная запись пользователя MySQL, используемая для связи, должна использовать любой плагин mysql_native_password или caching_sha2_password, см. Pluggable Authentication. Сервер, с которым вы соединяетесь, должен зашифровать позволенные связи, по умолчанию как MySQL 8.0. Это гарантирует, что клиент использует механизм пароля X Protocol PLAIN, который работает с учетными записями пользователей, которые используют любой из плагинов идентификации. При попытке соединиться с сервером, у которого нет поддержки зашифрованных связей для учетных записей пользователей, которые используют плагин mysql_native_password, применяя формат MYSQL41 и caching_sha2_password, задействуется идентификация SHA256_MEMORY.

Следующий пример кода показывает, как соединиться с сервером MySQL и получить документ от коллекции my_collection, у которой есть поле name, начиная с S. Пример предполагает, что названная схема test существует, как и коллекция my_collection. Чтобы заставить пример работать, замените user вашим именем пользователя и password паролем. Если вы соединяетесь с иным хостом или через иной порт, поменяйте localhost и порт как надо.

MySQL Shell JavaScript Code

var mysqlx = require('mysqlx');

// Connect to server on localhost
var mySession = mysqlx.getSession( {
  host: 'localhost', port: 33060,
  user: 'user', password: 'password' } );

var myDb = mySession.getSchema('test');
// Use the collection 'my_collection'
var myColl = myDb.getCollection('my_collection');

// Specify which document to find with Collection.find() and
// fetch it from the database with .execute()
var myDocs = myColl.find('name like :param').limit(1).
                    bind('param', 'S%').execute();

// Print document
print(myDocs.fetchOne());
mySession.close();

MySQL Shell Python Code

from mysqlsh import mysqlx

# Connect to server on localhost
mySession = mysqlx.get_session( {
  'host': 'localhost', 'port': 33060,
  'user': 'user', 'password': 'password' } )

myDb = mySession.get_schema('test')

# Use the collection 'my_collection'
myColl = myDb.get_collection('my_collection')

# Specify which document to find with Collection.find() and
# fetch it from the database with .execute()
myDocs = myColl.find('name like :param').limit(1).bind('param', 'S%').execute()

# Print document
document = myDocs.fetch_one()
print(document)
mySession.close()

Node.js JavaScript Code

var mysqlx = require('@mysql/xdevapi');

// Connect to server on localhost
mysqlx
.getSession({
  user: 'user',
  password: 'password',
  host: 'localhost',
  port: '33060'
})
.then(function (session) {
  var db = session.getSchema('test');
  // Use the collection 'my_collection'

  var myColl = db.getCollection('my_collection');
  // Specify wich document to find with Collection.find() and
  // fetch it from the database with .execute()
  return myColl
  .find('name like :param')
  .limit(1)
  .bind('param', 'S%')
  .execute(function (doc) {
    console.log(doc);
  });
})
.catch(function (err) {
  // Handle error
});

C# Code

// Connect to server on localhost
var mySession = MySQLX.GetSession("server=localhost;port=33060;user=user;password=password;");
var myDb = mySession.GetSchema("test");

// Use the collection "my_collection"
var myColl = myDb.GetCollection("my_collection");
// Specify which document to find with Collection.Find() and
// fetch it from the database with .Execute()
var myDocs = myColl.Find("name like :param").Limit(1)
                   .Bind("param", "S%").Execute();

// Print document
Console.WriteLine(myDocs.FetchOne());
mySession.Close();

Python Code

import mysqlx
# Connect to server on localhost
my_session = mysqlx.get_session({
  'host': 'localhost', 'port': 33060,
  'user': 'user', 'password': 'password'
})

my_schema = my_session.get_schema('test')
# Use the collection 'my_collection'
my_coll = my_schema.get_collection('my_collection')

# Specify which document to find with Collection.find() and
# fetch it from the database with .execute()
docs = my_coll.find('name like :param').limit(1).bind('param', 'S%').execute()

# Print document
doc = docs.fetch_one()
print(doc)
my_session.close()

Java Code

import com.mysql.cj.xdevapi.*;
// Connect to server on localhost
Session mySession = new SessionFactory().getSession("mysqlx://localhost:33060/test?user=user&password=password");

Schema myDb = mySession.getSchema("test");
// Use the collection 'my_collection'
Collection myColl = myDb.getCollection("my_collection");

// Specify which document to find with Collection.find() and
// fetch it from the database with .execute()
DocResult myDocs = myColl.find("name like :param").limit(1).bind("param", "S%").execute();

// Print document
System.out.println(myDocs.fetchOne());
mySession.close();

C++ Code

#include <mysqlx/xdevapi.h>

// Scope controls life-time of objects such as session or schema
{
  Session sess("localhost", 33060, "user", "password");
  Schema db= sess.getSchema("test");
  // or Schema db(sess, "test");

  Collection myColl = db.getCollection("my_collection");
  // or Collection myColl(db, "my_collection");
  DocResult myDocs = myColl.find("name like :param")
    .limit(1)
    .bind("param","S%").execute();
    cout << myDocs.fetchOne();
}

2.2. Соединение с сессией

Есть несколько способов использовать сессию, чтобы соединиться с MySQL в зависимости от определенной установки в использовании.

2.2.1. Соединение с единственным сервером MySQL

В этом примере связь с местным сервером MySQL, управляющим X Plugin на порту TCP/IP 33060 устанавливается, используя учетную запись пользователя MySQL user с его паролем. Поскольку никакие другие параметры не устанавливаются, значения по умолчанию используются.

MySQL Shell JavaScript Code

// Passing the parameters in the { param: value } format
var dictSession = mysqlx.getSession( {
  host: 'localhost', 'port': 33060,
  user: 'user', password: 'password' } )

var db1 = dictSession.getSchema('test')
// Passing the parameters in the URI format
var uriSession = mysqlx.getSession('user:password@localhost:33060')
var db2 = uriSession.getSchema('test')

MySQL Shell Python Code

# Passing the parameters in the { param: value } format
dictSession = mysqlx.get_session( {
  'host': 'localhost', 'port': 33060,
  'user': 'user', 'password': 'password' } )

db1 = dictSession.get_schema('test')
# Passing the parameters in the URI format
uriSession = mysqlx.get_session('user:password@localhost:33060')
db2 = uriSession.get_schema('test')

Следующий пример показывает, как соединиться с единственным сервером MySQL, обеспечив TCP/IP адрес localhost с той же самой учетной записи пользователя как прежде.

MySQL Shell JavaScript Code

// Passing the parameters in the { param: value } format
// Query the user for the account information
print("Please enter the database user information.");
var usr = shell.prompt("Username: ", {defaultValue: "user"});
var pwd = shell.prompt("Password: ", {type: "password"});

// Connect to MySQL Server on a network machine
mySession = mysqlx.getSession( {
  host: 'localhost', 'port': 33060,
  user: usr, password: pwd} );
myDb = mySession.getSchema('test');

MySQL Shell Python Code

# Passing the parameters in the { param: value } format
# Query the user for the account information
print("Please enter the database user information.")
usr = shell.prompt("Username: ", {'defaultValue': "user"})
pwd = shell.prompt("Password: ", {'type': "password"})

# Connect to MySQL Server on a network machine
mySession = mysqlx.get_session( {
  'host': 'localhost', 'port': 33060,
  'user': usr, 'password': pwd} )
myDb = mySession.get_schema('test')

C# Code

// Query the user for the user information
Console.WriteLine("Please enter the database user information.");
Console.Write("Username: ");
var usr = Console.ReadLine();
Console.Write("Password: ");
var pwd = Console.ReadLine();

// Connect to server on localhost using a connection URI
var mySession = MySQLX.GetSession(string.Format("mysqlx://localhost:33060/test?user={0}&password={1}", usr, pwd));
var myDb = mySession.GetSchema("test");

Python Code

# Passing the parameters in the { param: value } format
dict_session = mysqlx.get_session({
  'host': 'localhost', 'port': 33060,
  'user': 'user', 'password': 'password'
})

my_schema_1 = dict_session.get_schema('test')
# Passing the parameters in the URI format
uri_session = mysqlx.get_session('user:password@localhost:33060')
my_schema_2 = uri_session.get_schema('test')

Java Code

import com.mysql.cj.xdevapi.*;

// Connect to server on localhost using a connection URI
Session mySession = new SessionFactory().getSession("mysqlx://localhost:33060/test?user=user&password=password");
Schema myDb = mySession.getSchema("test");

C++ Code

// This code sample assumes that we have function prompt() defined somewhere.
string usr = prompt("Username:");
string pwd = prompt("Password:");

// Connect to MySQL Server on a network machine
Session mySession(SessionOption::HOST, "localhost",
  SessionOption::PORT, 33060,
  SessionOption::USER, usr,
  SessionOption::PWD, pwd);

// An alternative way of defining session settings.
SessionSettings settings(SessionOption::HOST,"localhost",
  SessionOption::PORT, 33060);

settings.set(SessionOption::USER, usr);
settings.set(SessionOption::PWD, pwd);
Session mySession(settings);
Schema myDb= mySession.getSchema("test");

2.2.2. Соединение с единственным сервером MySQL, используя объединение связи

X DevAPI поддерживает объединение связи, которое может уменьшить издержки для запросов, которые открывают много связей с сервером MySQL. Связи организованы как пул объектов клиента. Открывая новую сессию с клиентом, прежде чем новое сетевое соединение открыто, будет предпринята попытка, чтобы восстановить из пула существующую и в настоящее время неиспользованную связь, которая перезагружается и снова используется.

Пул связи формируется, используя единственную пару ключ/значение (см. Connecting Using Key-Value Pairs) с единственным именем ключа pooling. Значение ключа polling это набор пар ключ/значение, содержащих любую комбинацию ключей, описанных в следующей таблице:

Таблица 2.1. Опции для формирования пула связи

ОпцияСмысл По умолчанию
enabled Объединение связи позволено. Когда выбор установлен в false, возвращена регулярная, необъединенная связь, и другие упомянутые ниже опции проигнорированы. true
maxSize Максимальное количество связей в пуле. 25
maxIdleTime Максимальное количество миллисекунд, которое связь может не работать в очереди прежде чем ее закроют. Нулевое значение означает бесконечность. 0
queueTimeout Максимальное количество миллисекунд, которое запросу позволяют ждать связи. Нулевое значение означает бесконечность. 0

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

Закрытие объекта клиента закрывает все связи, с которыми он работает, все сессии, которые клиент создал и разрушает пул.

Объединение связи не поддерживается MySQL Shell.

Node.js JavaScript Code

var mysqlx = require('@mysql/xdevapi');
var client = mysqlx.getClient(
  { user: 'root', host: 'localhost', port: 33060 },
  { pooling: { enabled: true, maxIdleTime: 30000, maxSize: 25, queueTimeout: 10000 } }
);
client.getSession()
  .then(session => {
    console.log(session.inspect())
    return session.close() // the connection becomes idle in the client pool
})
  .then(() => {
    return client.getSession()
  })
  .then(session => {
    console.log(session.inspect())
  return client.close() // closes all connections and destroys the pool
})

C# Code

using (Client client = MySQLX.GetClient("server=localhost;user=root:port=33060;",
new { pooling = new { Enabled = true, MaxSize = 100, MaxIdleTime=30000, QueueTimeout = 10000 } }))
{
using (Session session = client.GetSession())
  {
    foreach (Collection coll in session.Schema.GetCollections())
    {
      Console.WriteLine(coll.Name);
    }
  } // session.Dispose() is called and the session becomes idle in the pool
} // client.Dispose() is called then all sessions are closed and pool is destroyed

Python Code

connection_string = {
  'host': 'localhost',
  'port': 37210,
  'user': 'user',
  'password': 'password'
}

client_options = {
  'pooling': {
    "max_size": 10,
    "max_idle_time": 30000
  }
}

client = mysqlx.get_client(connection_string, client_options)
session1 = client.get_session()
session2 = client.get_session()
# closing all the sessions
client.close()

Java Code

// Obtain new ClientFactory
ClientFactory cf = new ClientFactory();

// Obtain Client from ClientFactory
Client cli = cf.getClient(this.baseUrl, "{\"pooling\":{\"enabled\":true, \"maxSize\":8,
             \"maxIdleTime\":30000, \"queueTimeout\":10000} }");
Session sess = cli.getSession();

//Use Session as usual
//Close Client after use
cli.close();

C++ Code

using namespace mysqlx;

Client cli("user:password@host_name/db_name", ClientOption::POOL_MAX_SIZE, 7);
Session sess = cli.getSession();
// use Session sess as usual
cli.close();  // close all Sessions

Connector/C++ Code using X DevAPI for C

char error_buf[255];
interror_code;

mysqlx_client_t *cli = mysqlx_get_client_from_url(
  "user:password@host_name/db_name", "{ \"maxSize\": 7 }", error_buf, &error_code
);
mysqlx_session_t *sess = mysqlx_get_session_from_client(cli);
// use sess as before
mysqlx_close_client(cli);  // close session sess

2.2.3. Обзор опций связи

Используя сессию, следующие опции доступны, чтобы формировать связь.

Опция

Имя

Обязательность

По умолчанию

Примечания

TCP/IP Host

host

-

localhost, имя хоста IPv4, не IP-диапазон

TCP/IP Port

port

Yes

33060

Стандартный порт X Plugin 33060

MySQL user

dbUser

-

Пользователь БД MySQL

MySQL password

dbPassword

-

Пароль для MySQL

Поддержанные методы аутентификации:

  • PLAIN

  • MYSQL 4.1

Элементы URI и формат.

Рис. 2.1. URI соединения

Content is described in the surrounding text.

ConnectURI1::= 'dbUser' ':' 'dbPassword' '@' 'host' ':' 'port'

2.3. Работа с объектом сессии

Все предыдущие примеры, использовали getSchema() или getDefaultSchema() методы объекта Session, которые возвращают объект схемы. Вы используете эту схему, чтобы получить доступ к коллекциям и таблицам. Большинство примеров использует способность X DevAPI связать все конструкции объекта в цепь, позволяя вам добраться до объекта схемы в одной строке:

schema = mysqlx.getSession(...).getSchema();

Эта цепь объекта эквивалентна следующей, с тем различием, что промежуточный шаг опущен:

session = mysqlx.getSession();
schema = session.getSchema().

Нет никакого постоянного требования к цепи, пока вы не получаете объект схемы. Если вы хотите работать с объектом сессии, например, вызвать метод объекта сессии getSchemas(), нет никакой потребности доходить до схемы:

session = mysqlx.getSession(); session.getSchemas().

MySQL Shell JavaScript Code

// Connecting to MySQL and working with a Session
var mysqlx = require('mysqlx');
// Connect to a dedicated MySQL server using a connection URI
var mySession = mysqlx.getSession('user:password@localhost');

// Get a list of all available schemas
var schemaList = mySession.getSchemas();
print('Available schemas in this session:\n');

// Loop over all available schemas and print their name
for (index in schemaList) {
  print(schemaList[index].name + '\n');
}
mySession.close();

MySQL Shell Python Code

# Connecting to MySQL and working with a Session
from mysqlsh import mysqlx
# Connect to a dedicated MySQL server using a connection URI
mySession = mysqlx.get_session('user:password@localhost')

# Get a list of all available schemas
schemaList = mySession.get_schemas()
print('Available schemas in this session:\n')
# Loop over all available schemas and print their name
for schema in schemaList:
  print('%s\n' % schema.name)
mySession.close()

Node.js JavaScript Code

// Connecting to MySQL and working with a Session
var mysqlx = require('@mysql/xdevapi');

// Connect to a dedicated MySQL server using a connection URI
mysqlx
  .getSession('user:password@localhost')
  .then(function (mySession) {
    // Get a list of all available schemas
    return mySession.getSchemas();
  })
  .then(function (schemaList) {
    console.log('Available schemas in this session:\n');
    // Loop over all available schemas and print their name
    schemaList.forEach(function (schema) {
      console.log(schema.getName() + '\n');
    });
  });

C# Code

// Connect to a dedicated MySQL server node using a connection URI
var mySession = MySQLX.GetSession("mysqlx://user:password@localhost:33060");

// Get a list of all available schemas
var schemaList = mySession.GetSchemas();
Console.WriteLine("Available schemas in this session:");

// Loop over all available schemas and print their name
foreach (var schema in schemaList)
{
  Console.WriteLine(schema.Name);
}
mySession.Close();

Python Code

# Connector/Python
# Connecting to MySQL and working with a Session
from mysqlsh import mysqlx

# Connect to a dedicated MySQL server using a connection URI
mySession = mysqlx.get_session('user:password@localhost')
# Get a list of all available schemas
schemaList = mySession.get_schemas()
print('Available schemas in this session:\n')

# Loop over all available schemas and print their name
for schema in schemaList:
print('%s\n' % schema.name)
mySession.close()

Java Code

import java.util.List;
import com.mysql.cj.api.xdevapi.*;
import com.mysql.cj.xdevapi.*;

// Connecting to MySQL and working with a Session
// Connect to a dedicated MySQL server using a connection URI
Session mySession = new SessionFactory().getSession("mysqlx://localhost:33060/test?user=user&password=password");

// Get a list of all available schemas
List<Schema> schemaList = mySession.getSchemas();
System.out.println("Available schemas in this session:");

// Loop over all available schemas and print their name
for (Schema schema : schemaList) {
  System.out.println(schema.getName());
}
mySession.close();

C++ Code

#include <mysqlx/xdevapi.h>
// Connecting to MySQL and working with a Session

// Connect to a dedicated MySQL server using a connection URI
string url = "mysqlx://localhost:33060/test?user=user&password=password";
{
  Session mySession(url);
  // Get a list of all available schemas
  std::list<Schema> schemaList = mySession.getSchemas();
  cout << "Available schemas in this session:" << endl;
  // Loop over all available schemas and print their name
  for (Schema schema : schemaList) {
    cout << schema.getName() << endl;
  }
}

В этом примере функция mysqlx.getSession() используется, чтобы открыть сессию. Тогда функция Session.getSchemas() используется, чтобы получить список всех доступных схем и напечатать их на консоль.

2.4. Использование SQL с сессией

В дополнение к упрощенному синтаксису X DevAPI объекта сессии у объекта сессии есть функция sql(), которая берет любой SQL-оператор в качестве последовательности.

Следующий пример использует сессию, чтобы назвать хранимую процедуру SQL на определенном узле.

MySQL Shell JavaScript Code

var mysqlx = require('mysqlx');
// Connect to server using a Session
var mySession = mysqlx.getSession('user:password@localhost');

// Switch to use schema 'test'
mySession.sql("USE test").execute();
// In a Session context the full SQL language can be used
mySession.sql("CREATE PROCEDURE my_add_one_procedure " +
              " (INOUT incr_param INT) " +
              "BEGIN " + "SET incr_param = incr_param + 1;" +
              "END;").execute();
mySession.sql("SET @my_var = ?;").bind(10).execute();
mySession.sql("CALL my_add_one_procedure(@my_var);").execute();
mySession.sql("DROP PROCEDURE my_add_one_procedure;").execute();

// Use an SQL query to get the result
var myResult = mySession.sql("SELECT @my_var").execute();
// Gets the row and prints the first column
var row = myResult.fetchOne();
print(row[0]);
mySession.close();

MySQL Shell Python Code

from mysqlsh import mysqlx

# Connect to server using a Session
mySession = mysqlx.get_session('user:password@localhost')
# Switch to use schema 'test'
mySession.sql("USE test").execute()

# In a Session context the full SQL language can be used
sql = """CREATE PROCEDURE my_add_one_procedure
      (INOUT incr_param INT)
      BEGIN
      SET incr_param = incr_param + 1;
      END
      """
mySession.sql(sql).execute()
mySession.sql("SET @my_var = ?").bind(10).execute()
mySession.sql("CALL my_add_one_procedure(@my_var)").execute()
mySession.sql("DROP PROCEDURE my_add_one_procedure").execute()

# Use an SQL query to get the result
myResult = mySession.sql("SELECT @my_var").execute()
# Gets the row and prints the first column
row = myResult.fetch_one()
print(row[0])
mySession.close()

Node.js JavaScript Code

var mysqlx = require('@mysql/xdevapi');
var session;

// Connect to server using a Low-Level Session
mysqlx
  .getSession('root:password@localhost')
  .then(function (s) {
    session = s;
    return session.getSchema('test');
  })
  .then(function () {
    return Promise.all([
    // Switch to use schema 'test'
    session.sql('USE test').execute(),
    // In a Session context the full SQL language can be used
    session.sql('CREATE PROCEDURE my_add_one_procedure' +
                ' (INOUT incr_param INT) ' +
                'BEGIN ' +
                'SET incr_param = incr_param + 1;' +
                'END;').execute(),
    session.executeSql('SET @my_var = ?;', 10).execute(),
    session.sql('CALL my_add_one_procedure(@my_var);').execute(),
    session.sql('DROP PROCEDURE my_add_one_procedure;').execute()
  ])
})
.then(function() {
  // Use an SQL query to get the result
  return session.sql('SELECT @my_var').execute(function (row) {
    // Print result
    console.log(row);
  });
});

C# Code

// Connect to server using a Session
var mySession = MySQLX.GetSession("server=localhost;port=33060;user=user;password=password;");

// Switch to use schema "test"
mySession.SQL("USE test").Execute();
// In a Session context the full SQL language can be used
mySession.SQL("CREATE PROCEDURE my_add_one_procedure " +
              " (INOUT incr_param INT) " +
              "BEGIN " +
              "SET incr_param = incr_param + 1;" +
              "END;").Execute();
              mySession.SQL("SET @my_var = 10;").Execute();
              mySession.SQL("CALL my_add_one_procedure(@my_var);").Execute();
              mySession.SQL("DROP PROCEDURE my_add_one_procedure;").Execute();

// Use an SQL query to get the result
var myResult = mySession.SQL("SELECT @my_var").Execute();
// Gets the row and prints the first column
var row = myResult.FetchOne();
Console.WriteLine(row[0]);
mySession.Close();

Python Code

# Connector/Python
from mysqlsh import mysqlx

# Connect to server using a Session
mySession = mysqlx.get_session('user:password@localhost')
# Switch to use schema 'test'
mySession.sql("USE test").execute()

# In a Session context the full SQL language can be used
sql = """CREATE PROCEDURE my_add_one_procedure
      (INOUT incr_param INT)
      BEGIN
      SET incr_param = incr_param + 1;
      END
      """
mySession.sql(sql).execute()
mySession.sql("SET @my_var = ?").bind(10).execute()
mySession.sql("CALL my_add_one_procedure(@my_var)").execute()
mySession.sql("DROP PROCEDURE my_add_one_procedure").execute()

# Use an SQL query to get the result
myResult = mySession.sql("SELECT @my_var").execute()
# Gets the row and prints the first column
row = myResult.fetch_one()
print(row[0])
mySession.close()

Java Code

import com.mysql.cj.xdevapi.*;

// Connect to server on localhost
Session mySession = new SessionFactory().getSession("mysqlx://localhost:33060/test?user=user&password=password");
// Switch to use schema 'test'
mySession.sql("USE test").execute();

// In a Session context the full SQL language can be used
mySession.sql("CREATE PROCEDURE my_add_one_procedure " +
              " (INOUT incr_param INT) " + "BEGIN " +
              "SET incr_param = incr_param + 1;" + "END")
.execute();
mySession.sql("SET @my_var = ?").bind(10).execute();
mySession.sql("CALL my_add_one_procedure(@my_var)").execute();
mySession.sql("DROP PROCEDURE my_add_one_procedure").execute();

// Use an SQL query to get the result
SqlResult myResult = mySession.sql("SELECT @my_var").execute();
// Gets the row and prints the first column
Row row = myResult.fetchOne();
System.out.println(row.getInt(0));
mySession.close();

C++ Code

#include <mysqlx/xdevapi.h>

// Connect to server on localhost
string url = "mysqlx://localhost:33060/test?user=user&password=password";
Session mySession(url);

// Switch to use schema 'test'
mySession.sql("USE test").execute();
// In a Session context the full SQL language can be used
mySession.sql("CREATE PROCEDURE my_add_one_procedure "
              " (INOUT incr_param INT) "
              "BEGIN "
              "SET incr_param = incr_param + 1;"
              "END;")
  .execute();
mySession.sql("SET @my_var = ?;").bind(10).execute();
mySession.sql("CALL my_add_one_procedure(@my_var);").execute();
mySession.sql("DROP PROCEDURE my_add_one_procedure;").execute();

// Use an SQL query to get the result
auto myResult = mySession.sql("SELECT @my_var").execute();
// Gets the row and prints the first column
Row row = myResult.fetchOne();
cout << row[0] << endl;

Используя буквальный/дословный SQL, общие образцы API это главным образом то же самое, как с использованием DML и операций CRUD на таблицах и коллекциях. Существуют два различия: указание текущей схемы и возможность экранировать имена.

2.5. Установка текущей схемы

Схема по умолчанию для сессии может быть определена, используя атрибут schema в URI-строке подключения или парах ключ/значение, открывая сессию связи. Метод getDefaultSchema() возвращает схему по умолчанию для Session.

Если никакая схема по умолчанию не была выбрана, функция setCurrentSchema() может использоваться, чтобы установить текущую схему.

MySQL Shell JavaScript Code

var mysqlx = require('mysqlx');
// Direct connect with no client-side default schema specified
var mySession = mysqlx.getSession('user:password@localhost');
mySession.setCurrentSchema("test");

MySQL Shell Python Code

from mysqlsh import mysqlx

# Direct connect with no client-side default schema specified
mySession = mysqlx.get_session('user:password@localhost')
mySession.set_current_schema("test")

Node.js JavaScript Code

/*
Connector/Node.js does not support the setCurrentSchema() method.
One can specify the default schema in the connection string.
*/

C# Code

// Direct connect with no client-side default schema specified
var mySession = MySQLX.GetSession("server=localhost;port=33060;user=user;password=password;");
mySession.SetCurrentSchema("test");

Python Code

# Connector/Python
from mysqlsh import mysqlx

# Direct connect with no client-side default schema specified
mySession = mysqlx.get_session('user:password@localhost')
mySession.set_current_schema("test")

Java Code

/*
Connector/J does not support the setCurrentSchema() method.
One can specify the default schema in the connection string.
*/

C++ Code

/*
Connector/C++ does not support the setCurrentSchema() method.
One can specify the default schema in the connection string.
*/

Заметьте, что setCurrentSchema() не изменяет схему сессии по умолчанию, которая остается неизменной в течение сессии или остается null, если не задана при связи. Схема, установленная setCurrentSchema(), может быть возвращена getCurrentSchema().

Альтернативный способ установить текущую схему состоит в том, чтобы использовать метод sql() и оператор USE db_name.

2.6. Динамический SQL

Функция цитирования существует, чтобы избежать имен SQL и идентификаторов. Session.quoteName() экранирует идентификатор, данный в соответствии с параметрами настройки текущей связи.

Функция цитирования не должна использоваться, чтобы экранировать значения. Используйте привязку значений Session.sql(), см. раздел 2.4 для подробностей.

MySQL Shell JavaScript Code

function createTestTable(session, name) {
  // use escape function to quote names/identifier
  quoted_name = session.quoteName(name);
  session.sql("DROP TABLE IF EXISTS " + quoted_name).execute();

  var create = "CREATE TABLE ";
  create += quoted_name;
  create += " (id INT NOT NULL PRIMARY KEY AUTO_INCREMENT)";
  session.sql(create).execute();
  return session.getCurrentSchema().getTable(name);
}

var mysqlx = require('mysqlx');
var session = mysqlx.getSession('user:password@localhost:33060/test');
var default_schema = session.getDefaultSchema().name;
session.setCurrentSchema(default_schema);

// Creates some tables
var table1 = createTestTable(session, 'test1');
var table2 = createTestTable(session, 'test2');

MySQL Shell Python Code

def createTestTable(session, name):

# use escape function to quote names/identifier
quoted_name = session.quote_name(name)
session.sql("DROP TABLE IF EXISTS " + quoted_name).execute()

create = "CREATE TABLE "
create += quoted_name
create += " (id INT NOT NULL PRIMARY KEY AUTO_INCREMENT)"
session.sql(create).execute()
return session.get_current_schema().get_table(name)
from mysqlsh import mysqlx
session = mysqlx.get_session('user:password@localhost:33060/test')
default_schema = session.get_default_schema().name
session.set_current_schema(default_schema)

# Creates some tables
table1 = createTestTable(session, 'test1')
table2 = createTestTable(session, 'test2')

Node.js JavaScript Code

var mysqlx = require('mysqlx');

function createTestTable(session, name) {
var create = 'CREATE TABLE ';
create += name;
create += ' (id INT NOT NULL PRIMARY KEY AUTO_INCREMENT)';

return session
  .sql('DROP TABLE IF EXISTS ' + name)
  .execute()
  .then(function () {
    return session.sql(create).execute();
  });
}

var session;
mysqlx
.getSession({
  user: 'user',
  password: 'password'
})
.then(function (s) {
  session = s;
  return session
  .sql('use myschema')
  .execute()
})
.then(function () {
  // Creates some tables
  return Promise.map([
    createTestTable(session, 'test1'),
    createTestTable(session, 'test2')
  ])
})
.then(function () {
  session.close();
})
});

C# Code

var session = MySQLX.GetSession("server=localhost;port=33060;user=user;password=password;");
session.SQL("use test;").Execute();
session.GetSchema("test");

// Creates some tables
var table1 = CreateTestTable(session, "test1");
var table2 = CreateTestTable(session, "test2");
private Table CreateTestTable(Session session, string name)
{
  // use escape function to quote names/identifier
  string quoted_name = "`" + name + "`";
  session.SQL("DROP TABLE IF EXISTS " + quoted_name).Execute();
  var create = "CREATE TABLE ";
  create += quoted_name;
  create += " (id INT NOT NULL PRIMARY KEY AUTO_INCREMENT)";
  session.SQL(create).Execute();
  return session.Schema.GetTable(name);
}

Python Code

# Connector/Python
def createTestTable(session, name):

# use escape function to quote names/identifier
quoted_name = session.quote_name(name)
session.sql("DROP TABLE IF EXISTS " + quoted_name).execute()

create = "CREATE TABLE "
create += quoted_name
create += " (id INT NOT NULL PRIMARY KEY AUTO_INCREMENT)"
session.sql(create).execute()
return session.get_current_schema().get_table(name)
from mysqlsh import mysqlx
session = mysqlx.get_session('user:password@localhost:33060/test')
default_schema = session.get_default_schema().name
session.set_current_schema(default_schema)

# Creates some tables
table1 = createTestTable(session, 'test1')
table2 = createTestTable(session, 'test2')

Java Code

Java does not currently support the quoteName() method.

C++ Code

#include <mysqlx/xdevapi.h>

// Note: The following features are not yet implemented by
// Connector/C++:
// - DataSoure configuration files,
// - quoteName() method.

Table createTestTable(Session &session, const string &name)
{
  string quoted_name = string("`") + session.getDefaultSchemaName() +
                       L"`.`" + name + L"`";
  session.sql(string("DROP TABLE IF EXISTS") + quoted_name).execute();
  string create = "CREATE TABLE ";
  create += quoted_name;
  create += L"(id INT NOT NULL PRIMARY KEY AUTO_INCREMENT)";
  session.sql(create).execute();
  return session.getDefaultSchema().getTable(name);
}
Session session(33060, "user", "password");
Table table1 = createTestTable(session, "test1");
Table table2 = createTestTable(session, "test2");

Код, который использует X DevAPI, не должен экранировать идентификаторы. Это верно для работы с коллекциями и таблицами.

Поиск

 

Найди своих коллег!

Вы можете направить письмо администратору этой странички, Алексею Паутову. mailto:alexey.v.pautov@mail.ru