Этот раздел объясняет понятие связей и сессий, как используются в 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, не должен экранировать идентификаторы. Это верно для работы с коллекциями и таблицами.