Поделиться через


Краткое руководство. Подключение и запрос данных в Базе данных Azure для PostgreSQL с помощью Python

В этом кратком руководстве вы подключаетесь к гибкому экземпляру сервера базы данных Azure для PostgreSQL с помощью Python. Затем вы используете инструкции SQL для запроса, вставки, обновления и удаления данных в базе данных из macOS, Ubuntu Linux и платформ Windows.

Действия, описанные в этой статье, включают два метода проверки подлинности: проверку подлинности Microsoft Entra и проверку подлинности PostgreSQL. На вкладке "Без пароля" показана проверка подлинности Microsoft Entra, а на вкладке "Пароль " отображается проверка подлинности PostgreSQL.

Проверка подлинности Microsoft Entra — это механизм подключения к База данных Azure для PostgreSQL с помощью удостоверений, определенных в идентификаторе Microsoft Entra. С помощью проверки подлинности Microsoft Entra можно управлять удостоверениями пользователей базы данных и другими службами Microsoft в центральном расположении, что упрощает управление разрешениями. Чтобы узнать больше, смотрите аутентификацию Microsoft Entra с помощью базы данных Azure для PostgreSQL.

Проверка подлинности PostgreSQL использует учетные записи, хранящиеся в PostgreSQL. Если вы решили использовать пароли в качестве учетных данных для учетных записей, эти учетные данные хранятся в user таблице. Так как эти пароли хранятся в PostgreSQL, вам нужно самостоятельно управлять сменой паролей.

В этой статье предполагается, что вы знакомы с разработкой с помощью Python, но вы не знакомы с Базой данных Azure для PostgreSQL.

Предварительные условия

Добавление правил брандмауэра для рабочей станции клиента

  • Если вы создали гибкий экземпляр сервера Базы данных Azure для PostgreSQL с частным доступом (интеграция виртуальной сети), необходимо подключиться к серверу из ресурса в той же виртуальной сети, что и сервер. Вы можете создать виртуальную машину и добавить ее в виртуальную сеть, созданную с помощью гибкого экземпляра сервера Базы данных Azure для PostgreSQL. Обратитесь к сетевому взаимодействию.
  • Если вы создали гибкий экземпляр сервера База данных Azure для PostgreSQL с общедоступным доступом (разрешенными IP-адресами), вы можете добавить локальный IP-адрес в список правил брандмауэра на сервере. Обратитесь к сетевому взаимодействию.

Настройка интеграции Microsoft Entra на сервере (только без пароля)

Если вы выполняете действия по проверке подлинности без пароля, проверка подлинности Microsoft Entra должна быть настроена для экземпляра сервера, и вы должны быть назначены администратором Microsoft Entra на экземпляре сервера. Выполните действия, описанные в разделе "Настройка интеграции Microsoft Entra", чтобы убедиться, что проверка подлинности Microsoft Entra настроена и что вы назначены администратором Microsoft Entra на экземпляре сервера.

Подготовка среды разработки

Перейдите в папку, в которой необходимо запустить код и создать и активировать виртуальную среду. Виртуальная среда — это автономный каталог для определенной версии Python и других пакетов, необходимых для этого приложения.

Выполните следующие команды, чтобы создать и активировать виртуальную среду:

py -3 -m venv .venv
.venv\Scripts\activate

Установка библиотек Python

Установите библиотеки Python, необходимые для выполнения примеров кода.

Установите библиотеку azure-identity, которая обеспечивает поддержку аутентификации токенов Microsoft Entra в пакете SDK Azure.

# Use the interpreter-bound pip to ensure installs go into the active venv/interpreter
python -m pip install --upgrade pip
python -m pip install azure-identity azure-keyvault-secrets

Добавление кода проверки подлинности

В этом разделе вы добавите код проверки подлинности в рабочий каталог и выполните все дополнительные действия, необходимые для проверки подлинности и авторизации с экземпляром сервера.

Перед добавлением кода проверки подлинности убедитесь, что необходимые пакеты для каждого примера установлены.

Обязательные пакеты (примеры в этой статье):

  • Пример без пароля: azure-identityazure-keyvault-secrets (при использовании Key Vault)
  • Пример пароля: (рекомендуется: psycopgpython -m pip install "psycopg[binary]")

Необязательно. Создайте requirements.txt эти записи и установите их для python -m pip install -r requirements.txt воспроизводимых установок.

  1. Скопируйте следующий код в редактор и сохраните его в файле с именем get_conn.py.

    import urllib.parse
    import os
    
    from azure.identity import DefaultAzureCredential
    
    # IMPORTANT! This code is for demonstration purposes only. It's not suitable for use in production.
    # For example, tokens issued by Microsoft Entra ID have a limited lifetime (24 hours by default).
    # In production code, you need to implement a token refresh policy.
    
    def get_connection_uri():
    
        # Read URI parameters from the environment
        dbhost = os.environ['DBHOST']
        dbname = os.environ['DBNAME']
        dbuser = urllib.parse.quote(os.environ['DBUSER'])
        sslmode = os.environ['SSLMODE']
    
        # Use passwordless authentication via DefaultAzureCredential.
        # IMPORTANT! This code is for demonstration purposes only. DefaultAzureCredential() is invoked on every call.
        # In practice, it's better to persist the credential across calls and reuse it so you can take advantage of token
        # caching and minimize round trips to the identity provider. To learn more, see:
        # https://github.com/Azure/azure-sdk-for-python/blob/main/sdk/identity/azure-identity/TOKEN_CACHING.md
        credential = DefaultAzureCredential()
    
        # Call get_token() to get a token from Microsft Entra ID and add it as the password in the URI.
        # Note the requested scope parameter in the call to get_token, "https://ossrdbms-aad.database.windows.net/.default".
        password = credential.get_token("https://ossrdbms-aad.database.windows.net/.default").token
    
        db_uri = f"postgresql://{dbuser}:{password}@{dbhost}/{dbname}?sslmode={sslmode}"
        return db_uri
    
  2. Получение сведений о подключении к базе данных.

    1. На портале Azure найдите и выберите имя гибкого экземпляра сервера Базы данных Azure для PostgreSQL.
    2. На странице Обзор на сервере скопируйте полное Имя сервера. Полное имя сервера всегда имеет формат <имя-сервера>.postgres.database.azure.com.
    3. В меню слева в разделе "Безопасность" выберите " Проверка подлинности". Убедитесь, что ваша учетная запись указана в разделе "Администраторы Microsoft Entra". Если это не так, выполните действия, описанные в разделе "Настройка интеграции Microsoft Entra" на сервере (только без пароля).
  3. Задайте переменные среды для элементов URI подключения:

    set DBHOST=<server-name>
    set DBNAME=<database-name>
    set DBUSER=<username>
    set SSLMODE=require
    
  4. Войдите в Azure на рабочей станции. Вы можете войти с помощью Azure CLI, Azure PowerShell или Azure Developer CLI.

    Код аутентификации используется DefaultAzureCredential для аутентификации с Microsoft Entra ID и получения токена, который дает право выполнять операции на вашем экземпляре сервера. DefaultAzureCredential поддерживает цепочку типов учетных данных проверки подлинности. Среди поддерживаемых учетных данных - те, с которыми вы вошли в средства разработчика, такие как Azure CLI, Azure PowerShell или Azure Developer CLI.


Выполнение примеров кода Python

Для каждого примера кода в этой статье сделайте следующее:

  1. Создайте файл в текстовом редакторе.

  2. Добавьте пример кода в файл.

  3. Сохраните файл в папке проекта с расширением PY, например postgres-insert.py. При сохранении файла в ОС Windows обязательно выберите кодировку UTF-8.

  4. В вашей папке проекта введите python, затем имя файла, например python postgres-insert.py.

Создание таблицы и вставка данных

В следующем примере кода подключается к гибкой базе данных сервера Базы данных Azure для PostgreSQL с помощью функции и загружает данные с помощью psycopg.connect инструкции SQL INSERT . Функция cursor.execute выполняет SQL-запрос к базе данных.

import psycopg
from get_conn import get_connection_uri

conn_string = get_connection_uri()

conn = psycopg.connect(conn_string)
print("Connection established")
cursor = conn.cursor()

# Drop previous table of same name if one exists
cursor.execute("DROP TABLE IF EXISTS inventory;")
print("Finished dropping table (if existed)")

# Create a table
cursor.execute("CREATE TABLE inventory (id serial PRIMARY KEY, name VARCHAR(50), quantity INTEGER);")
print("Finished creating table")

# Insert some data into the table
cursor.execute("INSERT INTO inventory (name, quantity) VALUES (%s, %s);", ("banana", 150))
cursor.execute("INSERT INTO inventory (name, quantity) VALUES (%s, %s);", ("orange", 154))
cursor.execute("INSERT INTO inventory (name, quantity) VALUES (%s, %s);", ("apple", 100))
print("Inserted 3 rows of data")

# Clean up
conn.commit()
cursor.close()
conn.close()

При успешном выполнении кода возвращаются следующие данные:

Connection established
Finished dropping table (if existed)
Finished creating table
Inserted 3 rows of data

Чтение данных

Следующий пример кода подключается к гибкой базе данных Базы данных Azure для PostgreSQL и использует cursor.execute с инструкцией SQL SELECT для чтения данных. Эта функция принимает запрос и возвращает набор результатов, который можно перебрать с помощью cursor.fetchall().

import psycopg
from get_conn import get_connection_uri

conn_string = get_connection_uri()

conn = psycopg.connect(conn_string)
print("Connection established")
cursor = conn.cursor()

# Fetch all rows from table
cursor.execute("SELECT * FROM inventory;")
rows = cursor.fetchall()

# Print all rows
for row in rows:
    print("Data row = (%s, %s, %s)" %(str(row[0]), str(row[1]), str(row[2])))

# Cleanup
conn.commit()
cursor.close()
conn.close()

При успешном выполнении кода возвращаются следующие данные:

Connection established
Data row = (1, banana, 150)
Data row = (2, orange, 154)
Data row = (3, apple, 100)

Обновление данных

Следующий пример кода подключается к гибкой базе данных Базы данных Azure для PostgreSQL и использует cursor.execute с инструкцией SQL UPDATE для обновления данных.

import psycopg
from get_conn import get_connection_uri

conn_string = get_connection_uri()

conn = psycopg.connect(conn_string)
print("Connection established")
cursor = conn.cursor()

# Update a data row in the table
cursor.execute("UPDATE inventory SET quantity = %s WHERE name = %s;", (200, "banana"))
print("Updated 1 row of data")

# Cleanup
conn.commit()
cursor.close()
conn.close()

Удаление данных

В следующем примере кода подключается к гибкой базе данных сервера Базы данных Azure для PostgreSQL и используется cursor.execute с инструкцией SQL DELETE для удаления элемента инвентаризации, который вы ранее вставили.

import psycopg
from get_conn import get_connection_uri

conn_string = get_connection_uri()

conn = psycopg.connect(conn_string)
print("Connection established")
cursor = conn.cursor()

# Delete data row from table
cursor.execute("DELETE FROM inventory WHERE name = %s;", ("orange",))
print("Deleted 1 row of data")

# Cleanup
conn.commit()
cursor.close()
conn.close()