Этот раздел объясняет понятие связей и сессий, как используются в 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.
Перед рассмотрением понятий более подробно, следующие примеры показывают, как соединиться с использованием сессии.
Код, который необходим, чтобы соединиться с 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();
}
Есть несколько способов использовать сессию, чтобы соединиться с 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");
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
Используя сессию, следующие опции доступны, чтобы формировать связь.
Опция |
Имя | Обязательность |
По умолчанию |
Примечания |
|---|---|---|---|---|
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 соединения
ConnectURI1::= 'dbUser' ':' 'dbPassword' '@' 'host' ':' 'port'
Все предыдущие примеры, использовали
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()
используется, чтобы получить список всех доступных схем и напечатать
их на консоль.
В дополнение к упрощенному синтаксису 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 на таблицах и коллекциях. Существуют два различия: указание текущей схемы и возможность экранировать имена.
Схема по умолчанию для сессии может быть определена, используя атрибут
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
Функция цитирования существует, чтобы избежать имен 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, не должен экранировать идентификаторы. Это верно для работы с коллекциями и таблицами.