Nawiązywanie połączenia z elastycznym serwerem usługi Azure Database for MySQL i wykonywanie zapytań o nie z poziomu aplikacji
Usługa Azure Database for MySQL — serwer elastyczny zapewnia elastyczność tworzenia aplikacji przy użyciu ulubionych narzędzi, języków i struktur. Możesz nadal używać zaawansowanych narzędzi programistycznych, takich jak Visual Studio Code i GitHub, i opracowywać je przy użyciu dowolnego języka programowania, takiego jak PHP, Java, Python, Node.js, C#, Ruby, Rust, Go itp. Można również zintegrować serwer elastyczny z popularnymi systemami zarządzania zawartością (CMS), takimi jak WordPress lub Drupal, Learning Management Systems (LMS), takimi jak Moodle, platformy handlu elektronicznego, takie jak Autoryzacja itd.
Zacznijmy od przyjrzenia się różnym zadaniom, które są związane z nawiązywaniem połączenia z serwerem elastycznym usługi Azure Database for MySQL i wykonywaniem zapytań o nie z poziomu aplikacji, przy użyciu wybranego języka.
1 — Uzyskiwanie informacji o połączeniu
Pierwszym zadaniem jest uzyskanie informacji o połączeniu (nazwa serwera, nazwa bazy danych i poświadczenia logowania), które należy połączyć z elastycznym serwerem usługi Azure Database for MySQL.
W witrynie Azure Portal przejdź do zasobu serwera elastycznego MySQL, a następnie zanotuj nazwę serwera i nazwę logowania administratora serwera.
2 — Uzyskiwanie certyfikatu SSL
Zaleca się zabezpieczenie danych przesyłanych przez zapewnienie, że aplikacja łączy się z elastycznym serwerem usługi Azure Database for MySQL przy użyciu protokołu SSL (Secure Sockets Layer). Publiczny certyfikat SSL można pobrać z bloku Sieć w witrynie Azure Portal, jak pokazano na poniższym zrzucie ekranu.
Zapisz plik certyfikatu w preferowanej lokalizacji.
Rozszerzenia MySQL dla języka PHP
Aby nawiązać połączenie z bazą danych MySQL z poziomu aplikacji PHP, możesz użyć jednego z następujących rozszerzeń:
- Rozszerzenie MySQLi (MySQL Ulepszone). Rozszerzenie MySQLi jest dołączone do języka PHP w wersji 5 i nowszej oraz udostępnia interfejsy obiektowe i proceduralne, aby uprościć łączenie się z bazami danych MySQL i pracę z nimi.
- PDO_MYSQL. Rozszerzenie PDO lub PHP Data Objects definiuje interfejs umożliwiający uzyskiwanie dostępu do baz danych w języku PHP. PDO_MYSQL to sterownik specyficzny dla bazy danych MySQL, który implementuje interfejs PDO w celu umożliwienia dostępu z języka PHP do baz danych MySQL.
Aby użyć rozszerzenia, należy włączyć je w php.ini
pliku konfiguracji, usuwając komentarz skojarzony wiersz. Jeśli na przykład chcesz użyć pliku MySQLi, usuń komentarz z extension=mysqli
wiersza w pliku.
3 — Nawiązywanie połączenia z serwerem elastycznym MySQL i wykonywanie zapytań o nie przy użyciu języka PHP
Chociaż istnieją opcje nawiązywania połączenia, w tej lekcji przedstawiono użycie rozszerzenia MySQLi do nawiązywania połączenia z elastycznym serwerem usługi Azure Database for MySQL z poziomu aplikacji PHP.
Należy również użyć rozszerzenia OpenSSL, aby ustanowić zaszyfrowane połączenie za pośrednictwem protokołu SSL. Tak jak w przypadku pliku MySQLi, włącz rozszerzenie OpenSSL, usuwając komentarz extension=openssl
z wiersza w php.ini
pliku.
Ustanawianie połączenia
Aby nawiązać połączenie z serwerem elastycznym MySQL przy użyciu biblioteki MySQLi, możesz użyć następującego fragmentu kodu w aplikacji PHP. Pamiętaj o zastąpieniu host
parametrów , , username
password
i db_name
wartościami, a następnie podaj ścieżkę do pobranej ścieżki certyfikatu SSL w metodzie mysqli_ssl_set()
.
$host = '<your_server_name>.mysql.database.azure.com';
$username = '<your_admin_username';
$password = '<your_password>';
$db_name = '<your_database_name>';
$conn = mysqli_init();
mysqli_ssl_set($conn,NULL,NULL, "<your_path_to_SSL_cert>", NULL, NULL);
mysqli_real_connect($conn, $host, $username, $password, $db_name, 3306, MYSQLI_CLIENT_SSL);
if (mysqli_connect_errno($conn)) {
die('Failed to connect to MySQL: '.mysqli_connect_error());
}
printf("Connection Established.\n");
- Metoda
mysqli_init()
inicjuje mySQLi i zwraca obiekt do użycia zmysqli_real_connect()
- Służy do nawiązywania
mysqli_ssl_set()
bezpiecznych połączeń przy użyciu protokołu SSL. Ta metoda przyjmuje ścieżkę do pobranego certyfikatu SSL. Ta funkcja nie wykonuje żadnych czynności, chyba że rozszerzenie OpenSSL jest włączone. - Metoda
mysqli_real_connect()
otwiera połączenie z aparatem bazy danych MySQL. Przekaż informacje o połączeniu serwera elastycznego MySQL jako argumenty, aby nawiązać z nim połączenie.
Wykonywanie operacji bazy danych
Po nawiązaniu połączenia z elastyczną bazą danych serwera użyj metod, takich jak mysqli_query()
wykonywanie zapytania. Na przykład:
mysqli_query($conn, '
CREATE TABLE Products (
`Id` INT NOT NULL AUTO_INCREMENT ,
`ProductName` VARCHAR(200) NOT NULL ,
`Price` DOUBLE NOT NULL ,
PRIMARY KEY (`Id`)
);
')
Jeśli zapytanie zawiera jakiekolwiek dane wejściowe zmiennej, należy zamiast tego użyć sparametryzowanych przygotowanych instrukcji. Chroni to przed atakami polegającymi na wstrzyknięciu kodu SQL, które są jedną z najpopularniejszych technik stosowanych przez hakerów internetowych.
Fragment kodu, który wstawia dane do tabeli przy użyciu przygotowanych instrukcji z poniższymi instrukcjami MySQLi.
$product_name = 'BrandNewProduct';
$product_price = 15;
//Create a prepared statement
if ($stmt = mysqli_prepare($conn, "INSERT INTO Products (ProductName, Price) VALUES (?, ?)")) {
//Binds the parameters for each column value
mysqli_stmt_bind_param($stmt, 'ssd', $product_name, $product_price);
//Run the prepared statement
mysqli_stmt_execute($stmt);
printf("Insert: Affected %d rows\n", mysqli_stmt_affected_rows($stmt));
//Close the prepared statement
mysqli_stmt_close($stmt);
}
Zamykanie połączenia
Po zakończeniu operacji bazy danych dobrym rozwiązaniem jest zamknięcie połączenia z bazą danych przy użyciu mysqli_close()
metody .
mysqli_close($conn);
Łączniki mySQL dla języka Python
Aby nawiązać połączenie z bazą danych MySQL z poziomu aplikacji języka Python, możesz użyć łącznika MySQL/języka Python, samodzielnego sterownika języka Python do komunikowania się z serwerami MySQL lub usługą PyMySQL.
Te łączniki można łatwo zainstalować za pomocą instalatora pip
pakietu języka Python. Na przykład pip install mysql-connector-python
3 — Nawiązywanie połączenia z usługą Azure Database for MySQL i wykonywanie zapytań względem ich — serwer elastyczny przy użyciu języka Python
Chociaż masz opcje nawiązywania połączenia, w tej lekcji pokazano, jak używać łącznika MySQL/języka Python do nawiązywania połączenia z usługą Azure Database for MySQL — serwer elastyczny z poziomu aplikacji w języku Python.
Ustanawianie połączenia
Fragment kodu, którego można użyć w aplikacji języka Python, aby nawiązać połączenie z serwerem elastycznym MySQL, następuje poniżej. Pamiętaj o zastąpieniu host
parametrów , , user
password
i database
wartościami i podaj ścieżkę do pobranego certyfikatu SSL w ssl_ca
ramach opcji .
import mysql.connector
from mysql.connector import errorcode
# Flexible server connection information
config = {
'host':'<your_server_name>.mysql.database.azure.com',
'user':'<your_admin_username>',
'password':'<your_password>',
'database':'<your_database_name>',
'client_flags': [mysql.connector.ClientFlag.SSL],
'ssl_ca': '<your_path_to_SSL_cert>'
}
# Establish connection and obtain cursor object
try:
conn = mysql.connector.connect(**config)
print("Connection established")
except mysql.connector.Error as err:
if err.errno == errorcode.ER_ACCESS_DENIED_ERROR:
print("Something is wrong with the user name or password")
elif err.errno == errorcode.ER_BAD_DB_ERROR:
print("Database does not exist")
else:
print(err)
else:
cursor = conn.cursor()
- Metoda
mysql.connector.connect()
konfiguruje połączenie z serwerem MySQL i zwraca obiekt połączenia. Przekaż obiekt informacji o połączeniu serwera elastycznego MySQL jako argument, aby nawiązać z nim połączenie. - Metoda
cursor()
obiektu połączenia tworzy kursor, który może służyć do interakcji z serwerem MySQL.
Wykonywanie operacji bazy danych
Po nawiązaniu połączenia z elastyczną bazą danych serwera MySQL użyj obiektu kursora i wywołaj cursor.execute()
metodę, aby wykonać dowolne operacje bazy danych. Na przykład:
# Create table
cursor.execute("CREATE TABLE inventory (id serial PRIMARY KEY, name VARCHAR(50), quantity INTEGER);")
# Insert some data into table
cursor.execute("INSERT INTO inventory (name, quantity) VALUES (%s, %s);", ("banana", 150))
Zamykanie połączenia
Łącznik MySQL/Python nie zatwierdza transakcji automatycznie, dlatego ważne jest, aby wywołać commit()
metodę obiektu połączenia, na przykład conn.commit()
, po każdej transakcji, która modyfikuje dane.
Po wykonaniu wszystkich operacji dobrym rozwiązaniem jest zamknięcie kursora i obiektu połączenia.
cursor.close()
conn.close()
Łączniki MySQL dla języka Java
Aby nawiązać połączenie z bazą danych MySQL z poziomu aplikacji Java, możesz użyć łącznika MySQL/J, interfejsu API zgodnego z protokołem JDBC, który natywnie implementuje protokół MySQL w języku Java, zamiast korzystać z bibliotek klienckich. Łącznik/J programu MySQL można zainstalować z poziomu dystrybucji binarnej lub menedżera zależności apache Maven.
Alternatywnie możesz również użyć struktur, takich jak Spring Data JPA , aby nawiązać połączenie z bazą danych MySQL z poziomu języka Java.
3 — Nawiązywanie połączenia z usługą Azure Database for MySQL i wykonywanie zapytań względem ich — serwer elastyczny przy użyciu języka Java
Chociaż masz opcje nawiązywania połączenia, w tej lekcji pokazano, jak używać łącznika MySQL/J do nawiązywania połączenia z usługą Azure Database for MySQL — serwer elastyczny z poziomu aplikacji Java.
Przechowywanie informacji o połączeniu
Dobrym rozwiązaniem jest utworzenie application.properties
pliku w sekcji zasobów kodu źródłowego w celu przechowywania informacji o połączeniu serwera elastycznego MySQL.
url=jdbc:mysql://<your_server_name>.mysql.database.azure.com:3306/<your_database_name>?serverTimezone=UTC
user=<your_admin_username>
password=<your_password>
Ustanawianie połączenia
Jeśli używasz JDBC poza serwerem aplikacji, klasa DriverManager w pakiecie java.sql zarządza ustanowieniem połączeń. Aby nawiązać połączenie z serwerem elastycznym MySQL, najpierw załaduj właściwości połączenia z application.properties
pliku i wywołaj metodę DriverManager getConnection()
, przekazując te właściwości połączenia do niego.
import java.sql.*;
public class DemoApplication {
public static void main(String[] args) throws Exception {
//Load application properties
Properties properties = new Properties();
properties.load(DemoApplication.class.getClassLoader().getResourceAsStream("application.properties"));
//Establish Connection to database
Connection connection = DriverManager.getConnection(properties.getProperty("url"), properties);
.
.
}
}
Wykonywanie operacji bazy danych
Po nawiązaniu połączenia i uzyskaniu Connection
obiektu można wywołać createStatement()
metodę Statement
w obiekcie, aby utworzyć obiekt.
Po utworzeniu Statement
wystąpienia możesz wykonać zapytanie, wywołując executeQuery(String)
metodę SELECT
za pomocą programu SQL, którego chcesz użyć. Aby zaktualizować dane w bazie danych, użyj executeUpdate(String SQL)
metody .
Na przykład:
Statement statement = connection.createStatement();
statement.execute("CREATE TABLE inventory (id serial PRIMARY KEY, name VARCHAR(50), quantity INTEGER)");
statement.executeUpdate("INSERT INTO inventory (name, quantity) VALUES (\"banana\", 150)");
ResultSet resultSet = statement.executeQuery("SELECT * FROM inventory");
Jeśli zapytanie zawiera jakiekolwiek dane wejściowe zmiennej, należy zamiast tego użyć sparametryzowanych przygotowanych instrukcji. Chroni to przed atakami polegającymi na wstrzyknięciu kodu SQL, które są jedną z najpopularniejszych technik stosowanych przez hakerów internetowych. Aby użyć przygotowanych instrukcji, można wywołać prepareStatement()
metodę PreparedStatement
w Connection
obiekcie, aby utworzyć obiekt, powiązać parametry, a następnie uruchomić przygotowaną instrukcję przy użyciu executeUpdate()
metody .
Zamykanie połączenia
Po zakończeniu operacji bazy danych dobrym rozwiązaniem jest zamknięcie połączenia z bazą danych przy użyciu close()
metody obiektu połączenia. Na przykład connection.close();