Содержание

Базы данных и их использование в приложениях на Python

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

Пожалуй, начнем с определения. База данных – это абстракция над файловой системой операционной системы, которая значительно упрощает создание приложений, создающих, читающих, обновляющих и удаляющих различные данные.

Зачем нужны базы данных?

На высоком уровне веб-приложения хранят данные и представляют их пользователям в удобном виде. Например, Google хранит данные о дорогах и предоставляет маршруты для проезда из одного места в другое при каждом использовании вами Google Maps. Строить такие маршруты движения возможно благодаря тому, что данные хранятся в структурированном формате.

Базы данных делают структурированное хранилище надежным и быстрым. Они также дают представление о том, как данные должны сохраняться и извлекаться. В результате, создавая каждое новое приложение, вы не обдумываете заново, что делать с данными.

Для управления созданием и использованием баз данных создано много реализаций СУБД — систем управления базами данных. Примеры СУБД — PostgreSQL, MySQL, SQLite. Также существуют нереляционные базы данных — NoSQL.

Английский для программистов

Наш телеграм канал с тестами по английскому языку для программистов. Английский это часть карьеры программиста. Поэтому полезно заняться им уже сейчас

Подробнее

×

Реляционные базы данных

В веб-разработке на Python чаще всего используются реляционные базы данных.

В этих базах данные хранятся в виде серии таблиц. Взаимосвязи между таблицами создаются при помощи внешних ключей. (Само определение «реляционные» происходит от англ. relations — «связи, отношения», — прим. перев.)

Внешний ключ – это уникальная ссылка из одной строки в реляционной таблице на другую строку, которая чаще всего находится в другой таблице, хотя может быть и в той же самой.

Реализации хранилищ баз данных различаются по сложности. SQLite — СУБД, встроенная в Python — создает один файл для всех данных каждой базы данных.

Другие СУБД, такие как PostgreSQL, MySQL, Oracle и Microsoft SQL Server, имеют более сложные схемы хранения. Кроме того, они предлагают дополнительные расширенные функции, полезные для хранения данных веб-приложений. Например:

  1. Репликация данных между главной базой данных и одним или несколькими подчиненными экземплярами, доступными только для чтения.
  2. Расширенные типы столбцов, которые могут эффективно хранить полуструктурированные данные, такие как JSON (JavaScript Object Notation).
  3. Сегментирование, которое позволяет горизонтально масштабировать несколько баз данных, каждая из которых служит экземпляром для чтения и записи, за счет задержки в согласованности данных.
  4. Мониторинг, статистика и другая полезная информация о выполнении для схем и таблиц базы данных.

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

Наиболее распространенные базы данных для веб-приложений на Python

PostgreSQL и MySQL – две наиболее распространенные базы данных с открытым исходным кодом для хранения данных веб-приложений на Python.

SQLite – это база данных, которая хранится в одном файле на диске. SQLite встроена в Python, но предназначена только для доступа по одному соединению за раз. Поэтому настоятельно рекомендуется не запускать производственное веб-приложение с SQLite. Эта база данных хороша для учебных проектов, когда вы только осваиваете, как всё работает.

Для продакшена же лучше использовать PostgreSQL или MySQL, или другую базу данных, в том числе нереляционную – всё зависит от специфики вашего приложения.

База данных PostgreSQL

PostgreSQL – это рекомендуемая реляционная СУБД для работы с веб-приложениями на Python. Функционал PostgreSQL, его активное развитие и улучшение, а также стабильность послужили причиной использования этой СУБД в бэкенде миллионов приложений, существующих сегодня в сети.

База данных MySQL

MySQL – еще одна практичная реализация СУБД для приложений, написанных на Python. Имеет открытый исходный код.

MySQL проще в освоении, чем PostgreSQL, но не так богата функциями.

Подключение к базе данных с помощью Python

Для работы с реляционной базой данных с использованием Python нужны библиотеки. Наиболее распространенные библиотеки для реляционных баз данных:

  • psycopg2 (исходный код) для PostgreSQL.
  • MySQLdb (исходный код) для MySQL. Обратите внимание, что разработка этого драйвера в основном заморожена. Поэтому будет целесообразно обратить внимание на альтернативные варианты, если в бэкенде вашего приложения используется MySQL.
  • cx_Oracle (исходный код) для Oracle Database.

Поддержка SQLite встроена во все версии Python 2. 7+, поэтому отдельная библиотека для подключения не требуется. Просто импортируйте sqlite3 (import sqlite3), и можно начинать работатьтоirметоyey.

Объектно-реляционное отображение

Объектно-реляционное отображение (англ. object-relational mapping, ORM) позволяет разработчикам получать доступ к данным из бэкенда при помощи Python-кода, а не SQL-запросов. Все структуры веб-приложений по-разному обрабатывают интеграцию ORM. По объектно-реляционному отображению есть множество ресурсов, так что вы без проблем разберетесь в этой теме.

Размещение баз данных на стороннем сервере

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

  • Amazon Relational Database Service (RDS) предоставляет предварительно настроенные экземпляры MySQL и PostgreSQL. Экземпляры можно масштабировать до больших или меньших конфигураций в зависимости от требований к хранилищу и производительности.
  • Google Cloud SQL – это сервис для работы с серверами MySQL, PostgreSQL и SQL. Позволяет управлять базами данных, делать бэкапы, репликации и вносить автоматические исправления. Cloud SQL интегрируется с Google App Engine, но также может использоваться и независимо.
  • BitCan предоставляет размещение баз данных MySQL и MongoDB с обширными услугами резервного копирования.
  • ElephantSQL – это SaaS-компания, которая размещает базы данных PostgreSQL и управляет конфигурацией сервера, резервным копированием и подключением к данным поверх экземпляров Amazon Web Services.

Полезные источники для изучения баз данных

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

Книги для изучения баз данных:

  1. «Изучаем SQL», автор — Алан Бьюли. Эта книга отлично подойдет для новичков, только начинающих знакомиться с обширным миром баз данных.
  2. «SQL», автор — Крис Фиайли. В этой книге подробно и на примерах разбирается использование языка запросов SQL для решения разных задач.
  3. «SQL. Сборник рецептов», автор — Энтони Молинаро. Данное пособие подойдет тем, кто уже имеет определенные знания об SQL и хочет развивать свои навыки.
  4. «SQL. Библия пользователя», авторы — Алекс Кригель и др., 2-е издание. Уникальность книги в том, что в ней приведены примеры реализации различных запросов на трех основных диалектах ведущих СУБД.
  5. «Семь баз данных за семь недель. Введение в современные базы данных и идеологию NoSQL», авторы — Эрик Редмонд, Джим Р. Уилсон. В данной книге рассказывается в основном о нереляционных базах данных. Вы узнаете об особенностях таких СУБД, как Redis, Neo4J, CouchDB, MongoDB, HBase, PostgreSQL и Riak.
  6. «Работа с PostgreSQL: настройка и масштабирование», автор — А. Ю. Васильев. Это справочник по настройке и масштабированию  PostgreSQL и тонкостям его использования.

Видеокурсы:

Если же вы больше предпочитаете видеоуроки и курсы, то существует множество источников для любого уровня подготовки. Ниже приведены примеры таких источников. Они в основном рассчитаны для новичков:

  • Основы баз данных
  • Изучение SQL для начинающих
  • Видеокурс по базам данных от Технопарка
  • Python and MySQL: Database Manipulation with Python

Контрольный чеклист для изучения баз данных

  1. Установите PostgreSQL на свой сервер или персональный компьютер. Если вы используете Ubuntu, запустите sudo apt-get install postgresql.
  2. Убедитесь, что в зависимостях вашего приложения есть библиотека psycopg2.
  3. Настройте свое веб-приложение для подключения к экземпляру PostgreSQL.
  4. Создавайте модели в ORM с помощью встроенного ORM Django или SQLAlchemy с Flask.
  5. Создайте таблицы своей базы данных или синхронизируйте модели ORM с экземпляром PostgreSQL, если вы используете ORM.
  6. Начните создавать, читать, обновлять и удалять данные в базе данных из вашего веб-приложения.

Заключение

В этой статье мы кратко рассказали про базы данных в Python. Обсудили, какие они бывают и в чем особенности использования той или иной СУБД. Также мы дали вам подборки книг и видеоматериалов для дальнейшего изучения баз данных. Надеемся, что вам все это пригодится. Успехов в освоении баз данных и написании кода!

На основе статьи «Databases».

Использование Python для создания запросов к базе данных — Azure SQL Database & SQL Managed Instance

Twitter LinkedIn Facebook Адрес электронной почты

  • Статья
  • Чтение занимает 2 мин

Область применения: База данных SQL Azure Управляемый экземпляр SQL Azure Azure Synapse Analytics

При работе с этим кратким руководством вы будете использовать Python для подключения к Базе данных SQL Azure, Управляемому экземпляру SQL Azure или базе данных Synapse SQL, а затем выполните запрос данных с помощью инструкций T-SQL.

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

Для работы с этим кратким руководством вам понадобится:

  • Учетная запись Azure с активной подпиской. Создайте учетную запись бесплатно.

  • База данных, в которой будет выполняться запрос.

    Для создания и настройки базы данных можно использовать одно из этих кратких руководств.

    ДействиеБаза данных SQLУправляемый экземпляр SQLSQL Server на виртуальной машине AzureAzure Synapse Analytics
    СозданиеПорталПорталПорталПортал
    CLICLI
    PowerShellPowerShellPowerShellPowerShell
    Шаблон развертыванияШаблон развертывания
    ConfigureПравило брандмауэра для IP-адресов на уровне сервераПодключение из виртуальной машины
    Подключение из локальной сетиПодключение к экземпляру SQL Server
    Получение сведений о подключенииAzure SQL;Azure SQL;Виртуальная машина SQLSynapse SQL
  • Python 3 и связанное с ним программное обеспечение

    ДействиеmacOSUbuntuWindows
    Установите драйвер ODBC, SQLCMD и драйвер Python для SQL Server.Выполните шаги 1.2, 1.3 и 2.1 в руководстве Создание приложений Python с использованием SQL Server в macOS. Также будут установлены Homebrew и Python.

    Хотя в статье указывается SQL Server, эти действия также применимы к Базе данных SQL Azure, Управляемому экземпляру SQL Azure и аналитике Azure Synapse.

    Настройте среду для разработки с помощью Python pyodbc.Настройте среду для разработки с помощью Python pyodbc.
    Установите Python и другие требуемые пакеты.Используйте команду sudo apt-get install python python-pip gcc g++ build-essential.
    Дополнительные сведенияMicrosoft ODBC driver в macOSMicrosoft ODBC driver в LinuxMicrosoft ODBC driver в Linux

Для дальнейшего изучения Python и базы данных в службе «Базы данных SQL Azure» см. Библиотеки Базы данных SQL Azure для Python, репозитория репозиторий pyodbc и выборку pyodbc.

Создание кода для запроса базы данных

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

  2. Добавьте следующий код. Получите сведения о подключении из раздела о предварительных требованиях и замените параметры <server>, <database>, <username> и <password> собственными значениями.

    import pyodbc
    server = '<server>.database.windows.net'
    database = '<database>'
    username = '<username>'
    password = '{<password>}'   
    driver= '{ODBC Driver 17 for SQL Server}'
    with pyodbc.connect('DRIVER='+driver+';SERVER=tcp:'+server+';PORT=1433;DATABASE='+database+';UID='+username+';PWD='+ password) as conn:
        with conn.cursor() as cursor:
            cursor.execute("SELECT TOP 3 name, collation_name FROM sys.databases")
            row = cursor.fetchone()
            while row:
                print (str(row[0]) + " " + str(row[1]))
                row = cursor.fetchone()
    

Выполнение кода

  1. В командной строке выполните следующую команду:

    python sqltest. py
    
  2. Убедитесь, что возвращены базы данных и их параметры сортировки, и закройте командное окно.

Дальнейшие действия

  • Руководство по разработке первой базы данных в службе «База данных SQL Azure»
  • Сведения о драйверах Microsoft Python для SQL Server
  • Центр по разработке на Python

Настройка клиента Python для обработки и анализа данных — SQL Server Machine Learning Services

  • Статья
  • Чтение занимает 10 мин

Область применения: SQL Server 2016 (13.x), SQL Server 2017 (14. x) и SQL Server 2019 (15.x), SQL Server 2019 (15.x) — Linux

Интеграция Python доступна в SQL Server 2017 и более поздних версиях, если включить параметр для Python во время установки служб машинного обучения (в базе данных).

Примечание

В настоящее время эта статья относится только к SQL Server 2016 (13.x), SQL Server 2017 (14.x), SQL Server 2019 (15.x) и SQL Server 2019 (15.x) и только для Linux.

Чтобы разрабатывать и развертывать решения Python для SQL Server, установите библиотеку Майкрософт revoscalepy и другие библиотеки Python для рабочей станции разработки. Библиотека revoscalepy, которая также находится на удаленном экземпляре SQL Server, координирует вычислительные запросы между обеими системами.

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

Чтобы проверить установку, можно использовать встроенное приложение Jupyter Notebook, как описано в этой статье, или связать библиотеки с PyCharm или любой другой интегрированной средой разработки, которой вы обычно пользуетесь.

Совет

Видеодемонстрацию этих упражнений см. в статье Удаленный запуск R и Python в SQL Server с помощью Jupyter Notebook.

Часто используемые инструменты

Независимо от того, являетесь ли вы разработчиком Python, который мало знаком с SQL, или разработчиком SQL, который мало знаком с Python и анализом данных в базе данных, для использования всех возможностей анализа баз данных вам потребуется как средство разработки Python, так и редактор запросов T-SQL, например SQL Server Management Studio (SSMS).

Для разработки на Python можно использовать приложение Jupyter Notebook, которое входит в дистрибутив Anaconda, устанавливаемый SQL Server. В этой статье объясняется, как запустить Jupyter Notebook, чтобы можно было выполнять код Python локально и удаленно на SQL Server.

Набор средств SSMS необходимо скачать отдельно. Он подходит для создания и выполнения хранимых процедур в SQL Server, в том числе процедур, содержащих код Python. Практически любой код Python, написанный в Jupyter Notebook, можно внедрять в хранимые процедуры. Вы можете ознакомиться с другими пошаговыми руководствами, чтобы получить дополнительные сведения об SSMS и внедрении кода Python.

1. Установка пакетов Python

На локальных рабочих станциях должны быть установлены те же версии пакетов Python, что и в SQL Server, включая базовый дистрибутив Anaconda 4.2.0 с Python 3.5.2, а также пакеты Майкрософт.

Сценарий установки добавляет в клиент Python три библиотеки Майкрософт в клиент Python. Скрипт устанавливает:

  • revoscalepy, используемую для определения объектов источника данных и контекста вычислений.
  • microsoftml, предоставляющую алгоритмы машинного обучения.
  • azureml, который применяется к задачам внедрения, связанным с контекстом отдельного сервера, и использование этого пакета для анализа баз данных может быть ограничено.
  1. Скачайте сценарий установки.

    • https://aka.ms/mls-py устанавливает версию 9.2.1 пакетов Python Майкрософт. Эта версия соответствует экземпляру SQL Server по умолчанию.

    • https://aka.ms/mls93-py устанавливает версию 9.3 пакетов Python Майкрософт.

  2. Откройте окно PowerShell с повышенными правами администратора (щелкните правой кнопкой мыши Запуск от имени администратора).

  3. Перейдите в папку, в которую был скачан установщик, и запустите сценарий. Добавьте аргумент командной строки -InstallFolder, чтобы указать расположение папки для библиотек. Пример.

    cd {{download-directory}}
    .\Install-PyForMLS.ps1 -InstallFolder "C:\path-to-python-for-mls"
    

Если вы не указали папку установки, по умолчанию используется %ProgramFiles%\Microsoft\PyForMLS.

Для выполнения установки требуется некоторое время. Ход выполнения можно отслеживать в окне PowerShell. После завершения установки вы получите полный набор пакетов.

Совет

Общие сведения о запуске программ Python в Windows см. в разделе Часто задаваемые вопросы по Python для Windows.

2. Обнаружение исполняемых файлов

Оставаясь в окне PowerShell, выведите список файлов в папке установки, чтобы убедиться, что файл Python.exe, сценарии и другие пакеты установлены.

  1. Введите cd \, чтобы перейти к корневому каталогу диска, а затем введите путь, указанный для -InstallFolder на предыдущем шаге. Если этот параметр не был указан во время установки, по умолчанию используется cd %ProgramFiles%\Microsoft\PyForMLS.

  2. Введите dir *.exe, чтобы получить список исполняемых файлов. Вы должны увидеть исполняемые файлы python.exe, pythonw.exe и uninstall-anaconda. exe.

В системах с несколькими версиями Python не забывайте использовать этот конкретный файл Python.exe, если необходимо загрузить revoscalepy и другие пакеты Майкрософт.

Примечание

Сценарий установки не изменяет переменную среды PATH на компьютере. Это означает, что новые интерпретаторы Python и модули, которые вы только что установили, не будут автоматически доступны для других инструментов. Справку по связыванию интерпретатора Python и библиотек с инструментами см. в разделе Установка интегрированной среды разработки.

3. Открытие Jupyter Notebook

Приложение Jupyter Notebook входит в состав дистрибутива Anaconda. В качестве следующего шага создайте записную книжку и выполните какой-нибудь код Python, в котором используются только что установленные библиотеки.

  1. В командной строке PowerShell, по-прежнему находясь в каталоге %ProgramFiles%\Microsoft\PyForMLS, откройте приложение Jupyter Notebook из папки Scripts:

    . \Scripts\jupyter-notebook
    

    Должна открыться записная книжка в браузере по умолчанию по адресу https://localhost:8889/tree.

    Другой способ запуска — дважды щелкнуть файл jupyter-notebook.exe.

  2. Выберите Создать, а затем выберите Python 3.

  3. Введите и выполните команду import revoscalepy, чтобы загрузить одну из библиотек Майкрософт.

  4. Введите и выполните команду print(revoscalepy.__version__), чтобы получить сведения о версии. Вы должны увидеть версию 9.2.1 или 9.3.0. Вы можете использовать любую из этих версий с библиотекой revoscalepy на сервере.

  5. Введите более сложную последовательность инструкций. В этом примере формируется сводная статистика для локального набора данных с помощью метода rx_summary. Другие функции получают расположение демонстрационных данных и создают объект источника данных для локального XDF-файла.

    import os
    from revoscalepy import rx_summary
    from revoscalepy import RxXdfData
    from revoscalepy import RxOptions
    sample_data_path = RxOptions.get_option("sampleDataDir")
    print(sample_data_path)
    ds = RxXdfData(os.path.join(sample_data_path, "AirlineDemoSmall.xdf"))
    summary = rx_summary("ArrDelay+DayOfWeek", ds)
    print(summary)
    

На следующем снимке экрана показаны входные и выходные данные (выходные данные обрезаны для краткости).

4. Получение разрешений SQL

Чтобы подключиться к экземпляру SQL Server для выполнения сценариев и передачи данных, необходимо иметь допустимое имя входа на сервере базы данных. Можно использовать либо имя входа SQL, либо встроенную проверку подлинности Windows. Обычно рекомендуется использовать встроенную проверку подлинности Windows, но в некоторых случаях проще использовать имя входа SQL, особенно если сценарий содержит строки подключения к внешним данным.

У учетной записи, используемой для выполнения кода, должно быть разрешение на чтение для баз данных, с которыми вы работаете, а также специальное разрешение EXECUTE ANY EXTERNAL SCRIPT. Большинству разработчиков также требуются разрешения на создание хранимых процедур и на запись данных в таблицы, содержащие данные обучения или данные оценки.

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

  • EXECUTE ANY EXTERNAL SCRIPT для запуска Python на сервере.
  • Привилегии db_datareader для выполнения запросов, используемых для обучения модели.
  • db_datawriter для записи данных обучения и данных оценки.
  • db_owner для создания таких объектов, как хранимые процедуры, таблицы и функции. Разрешение db_owner также потребуется для создания примеров баз данных и тестовых баз данных.

Если для кода требуются пакеты, которые по умолчанию не установлены в SQL Server, обратитесь к администратору базы данных, чтобы установить необходимые пакеты. SQL Server представляет собой защищенную среду, и существуют ограничения на места установки пакетов. Нерегламентированная установка пакетов в составе вашего кода не рекомендуется, даже если у вас есть необходимые разрешения. Также тщательно оцените влияние на безопасность сервера перед установкой новых пакетов в библиотеку сервера.

5. Создание тестовых данных

Если у вас есть разрешения на создание базы данных на удаленном сервере, можно выполнить следующий код, чтобы создать демонстрационную базу данных «Ирисы Фишера», которая будет использоваться для выполнения оставшихся действий в этой статье.

5-1. Удаленное создание базы данных irissql

import pyodbc
# creating a new db to load Iris sample in
new_db_name = "irissql"
connection_string = "Driver=SQL Server;Server=localhost;Database={0};Trusted_Connection=Yes;" 
                        # you can also swap Trusted_Connection for UID={your username};PWD={your password}
cnxn = pyodbc.connect(connection_string.format("master"), autocommit=True)
cnxn.cursor().execute("IF EXISTS(SELECT * FROM sys.databases WHERE [name] = '{0}') DROP DATABASE {0}". format(new_db_name))
cnxn.cursor().execute("CREATE DATABASE " + new_db_name)
cnxn.close()
print("Database created")

5-2. Импорт примера «Ирисы Фишера» из SkLearn

from sklearn import datasets
import pandas as pd
# SkLearn has the Iris sample dataset built in to the package
iris = datasets.load_iris()
df = pd.DataFrame(iris.data, columns=iris.feature_names)

5-3. Использование API-интерфейсов Revoscalepy для создания таблицы и загрузки данных «Ирисы Фишера»

from revoscalepy import RxSqlServerData, rx_data_step
# Example of using RX APIs to load data into SQL table. You can also do this with pyodbc
table_ref = RxSqlServerData(connection_string=connection_string.format(new_db_name), table="iris_data")
rx_data_step(input_data = df, output_file = table_ref, overwrite = True)
print("New Table Created: Iris")
print("Sklearn Iris sample loaded into Iris table")

6. Проверка удаленного подключения

Перед выполнением следующего шага убедитесь, что у вас есть разрешения на экземпляр SQL Server и строка подключения к демонстрационной базе данных «Ирисы Фишера». Если база данных не существует и у вас есть необходимые разрешения, можно создать базу данных, используя следующие встроенные инструкции.

Замените значения параметров в строке подключения на соответствующие значения параметров для вашей среды. В примере кода используется строка подключения "Driver=SQL Server;Server=localhost;Database=irissql;Trusted_Connection=Yes;", но в вашем коде необходимо указать удаленный сервер, возможно, с именем экземпляра и параметр учетных данных, который сопоставляется с именем входа базы данных.

6-1. Определение функции

В следующем коде определяется функция, которая будет отправлена на сервер SQL Server на более позднем шаге. При выполнении этого кода он использует данные и библиотеки (revoscalepy, pandas, matplotlib) на удаленном сервере для создания точечных диаграмм для набора данных «Ирисы Фишера». Этот код возвращает байтовый поток из файла PNG обратно в Jupyter Notebook для отображения в браузере.

def send_this_func_to_sql():
    from revoscalepy import RxSqlServerData, rx_import
    from pandas. tools.plotting import scatter_matrix
    import matplotlib.pyplot as plt
    import io
    
    # remember the scope of the variables in this func are within our SQL Server Python Runtime
    connection_string = "Driver=SQL Server;Server=localhost;Database=irissql;Trusted_Connection=Yes;"
    
    # specify a query and load into pandas dataframe df
    sql_query = RxSqlServerData(connection_string=connection_string, sql_query = "select * from iris_data")
    df = rx_import(sql_query)
    
    scatter_matrix(df)
    
    # return bytestream of image created by scatter_matrix
    buf = io.BytesIO()
    plt.savefig(buf, format="png")
    buf.seek(0)
    
    return buf.getvalue()

6-2. Отправка функции в SQL Server

В этом примере создается удаленный контекст вычислений, и выполнение функции отправляется на сервер SQL Server с помощью rx_exec. Функция rx_exec удобна, так как она принимает контекст вычислений в качестве аргумента. Любая функция, которую требуется выполнить удаленно, должна принимать контекст вычислений в качестве аргумента. Некоторые функции, например rx_lin_mod, поддерживают этот аргумент напрямую. Для операций, которые не принимают этот аргумент, можно использовать rx_exec для доставки кода в удаленный контекст вычислений.

В этом примере необработанные данные из SQL Server в Jupyter Notebook не передаются. Все вычисления выполняются в базе данных «Ирисы Фишера», и клиенту возвращается только файл изображения.

from IPython import display
import matplotlib.pyplot as plt 
from revoscalepy import RxInSqlServer, rx_exec
# create a remote compute context with connection to SQL Server
sql_compute_context = RxInSqlServer(connection_string=connection_string.format(new_db_name))
# use rx_exec to send the function execution to SQL Server
image = rx_exec(send_this_func_to_sql, compute_context=sql_compute_context)[0]
# only an image was returned to my jupyter client. All data remained secure and was manipulated in my db.
display.Image(data=image)

На следующем снимке экрана показаны входные данные и выходные данные в виде точечной диаграммы.

7. Запуск Python

Поскольку разработчики часто работают с несколькими версиями Python, программа установки не добавляет путь к Python в переменную PATH. Чтобы использовать исполняемый файл и библиотеки Python, установленные программой установки, свяжите интегрированную среду разработки с файлом Python.exe по пути, по которому также находятся библиотеки revoscalepy и microsoftml.

Командная строка

При запуске файла Python.exe из папки %ProgramFiles%\Microsoft\PyForMLS (или из любого другого расположения, указанного при установке клиентской библиотеки Python) у вас есть доступ ко всему дистрибутиву Anaconda и к модулям Python Майкрософт revoscalepy и microsoftml.

  1. Перейдите в %ProgramFiles%\Microsoft\PyForMLS и выполните Python.exe.
  2. Откройте интерактивную справку: help().
  3. Введите имя модуля в командной строке справки: help> revoscalepy. Справка возвращает имя, содержимое пакета, версию и расположение файла.
  4. Получите сведения о версии и пакете в командной строке help>: revoscalepy. Нажмите клавишу ВВОД несколько раз, чтобы выйти из справки.
  5. Импортируйте модуль: import revoscalepy.

Jupyter Notebook

В этой статье для демонстрации вызовов функций revoscalepy используется встроенное приложение Jupyter Notebook. Если вы не знакомы с этим средством, на следующем снимке экрана показаны его компоненты и механизм их работы.

Родительская папка %ProgramFiles%\Microsoft\PyForMLS содержит дистрибутив Anaconda и пакеты Майкрософт. Приложение Jupyter Notebook включено в состав дистрибутива Anaconda (оно находится в папке Scripts), и исполняемые файлы Python регистрируются с помощью Jupyter Notebook. Пакеты в каталоге site-packages можно импортировать в записную книжку. К этим пакетам относятся три пакета Майкрософт, которые используются для обработки и анализа данных и машинного обучения.

При использовании другой интегрированной среды разработки необходимо связать исполняемые файлы и библиотеки функций Python с вашим инструментом. В следующих разделах приводятся инструкции по часто используемым инструментам.

Visual Studio

Если вы используете Python в Visual Studio, воспользуйтесь следующими параметрами конфигурации, чтобы создать среду Python, включающую пакеты Python Майкрософт.

Параметр конфигурацииЗначение
Prefix path (Префикс пути)%ProgramFiles%\Microsoft\PyForMLS
Interpreter path (Путь к интерпретатору)%ProgramFiles%\Microsoft\PyForMLS\python.exe
Windowed interpreter (Оконный интерпретатор)%ProgramFiles%\Microsoft\PyForMLS\pythonw.exe

Сведения о настройке среды Python см. в разделе Управление средами Python в Visual Studio.

PyCharm

В PyCharm задайте в качестве интерпретатора установленный исполняемый файл Python.

  1. В новом проекте в окне «Параметры» выберите Добавить локальный путь.

  2. Введите %ProgramFiles%\Microsoft\PyForMLS\.

Теперь можно импортировать модули revoscalepy, microsoftml или azureml. Также можно открыть интерактивное окно, выбрав Инструменты>Консоль Python.

Дальнейшие действия

Теперь, когда у вас есть инструменты и рабочее подключение к SQL Server, вы можете расширить свои навыки, выполнив краткие пошаговые руководства Python в SQL Server Management Studio (SSMS).

Краткое руководство. Создание и выполнение простых сценариев Python с помощью служб машинного обучения SQL Server

Базы данных | Документация Django 4.0

Django официально поддерживает следующие базы данных:

  • PostgreSQL
  • MariaDB
  • MySQL
  • Oracle
  • SQLite

Существует также ряд database backends provided by third parties.

Django пытается поддерживать как можно больше функций на всех бэкендах баз данных. Однако, не все базы данных одинаковы, и нам пришлось принимать проектные решения о том, какие функции поддерживать и какие предположения мы можем сделать безопасными.

Этот файл описывает некоторые возможности, которые могут иметь отношение к использованию Django. Он не предназначен для замены документации по конкретному серверу или справочных руководств.

Общие примечания

Постоянные соединения

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

По умолчанию установлено значение 0, сохраняющее историческое поведение закрытия соединения с базой данных в конце каждого запроса. Чтобы включить постоянные соединения, установите значение CONN_MAX_AGE в целое положительное число секунд. Для неограниченного количества постоянных соединений установите значение None.

Управление соединениями

Django открывает соединение с базой данных при первом запросе к базе данных. Он держит это соединение открытым и повторно использует его в последующих запросах. Django закрывает соединение, когда оно превышает максимальный возраст, определенный параметром CONN_MAX_AGE или когда оно больше не может использоваться.

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

В начале каждого запроса Django закрывает соединение, если оно достигло своего максимального возраста. Если ваша база данных завершает простаивающие соединения через некоторое время, вам следует установить CONN_MAX_AGE на меньшее значение, чтобы Django не пытался использовать соединение, которое было завершено сервером базы данных. (Эта проблема может затрагивать только сайты с очень низким трафиком).

В конце каждого запроса Django закрывает соединение, если оно достигло своего максимального возраста или находится в состоянии неустранимой ошибки. Если во время обработки запросов возникли ошибки базы данных, Django проверяет, работает ли еще соединение, и закрывает его, если нет. Таким образом, ошибки базы данных затрагивают не более одного запроса; если соединение становится непригодным для использования, следующий запрос получает свежее соединение.

Оговорки

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

Иногда к базе данных не будет обращаться большинство ваших представлений, например, потому что это база данных внешней системы или благодаря кэшированию. В таких случаях следует установить CONN_MAX_AGE на низкое значение или даже 0, потому что нет смысла поддерживать соединение, которое вряд ли будет использоваться повторно. Это поможет сохранить небольшое количество одновременных соединений с этой базой данных.

Сервер разработки создает новый поток для каждого обрабатываемого запроса, сводя на нет эффект постоянных соединений. Не включайте их во время разработки.

Когда Django устанавливает соединение с базой данных, он настраивает соответствующие параметры, в зависимости от используемого бэкенда. Если вы включите постоянные соединения, эта настройка больше не будет повторяться при каждом запросе. Если вы изменяете такие параметры, как уровень изоляции соединения или часовой пояс, вам следует либо восстановить значения по умолчанию Django в конце каждого запроса, либо принудительно установить соответствующее значение в начале каждого запроса, либо отключить постоянные соединения.

Кодирование

Django предполагает, что все базы данных используют кодировку UTF-8. Использование других кодировок может привести к неожиданному поведению, например, к ошибкам «значение слишком длинное» от вашей базы данных для данных, которые действительны в Django. Информацию о том, как правильно настроить вашу базу данных, смотрите ниже в примечаниях к конкретным базам данных.

Заметки о PostgreSQL

Django поддерживает PostgreSQL 10 и выше. Требуется версия psycopg2 2.5.4 или выше, хотя рекомендуется последняя версия.

Настройки подключения к PostgreSQL

Подробнее см. в разделе HOST.

Чтобы подключиться, используя имя службы из connection service file и пароль из password file, вы должны указать их в OPTIONS части конфигурации вашей базы данных в DATABASES:

settings.py

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.postgresql',
        'OPTIONS': {
            'service': 'my_service',
            'passfile': '.my_pgpass',
        },
    }
}

.pg_service.conf

[my_service]
host=localhost
user=USER
dbname=NAME
port=5432

.my_pgpass

localhost:5432:NAME:USER:PASSWORD

Changed in Django 4. 0:

Добавлена поддержка подключения по имени службы и указания файла пароля.

Оптимизация конфигурации PostgreSQL

Для подключения к базе данных Django нужны следующие параметры:

  • client_encoding: 'UTF8',
  • default_transaction_isolation: 'read committed' по умолчанию, или значение, установленное в опциях соединения (см. ниже),
  • timezone:
    • когда USE_TZ равно True, 'UTC' по умолчанию, или значение TIME_ZONE, установленное для соединения,
    • когда USE_TZ равно False, значение глобальной настройки TIME_ZONE.

Если эти параметры уже имеют правильные значения, Django не будет устанавливать их для каждого нового соединения, что немного повышает производительность. Вы можете настроить их непосредственно в postgresql. conf или более удобно для каждого пользователя базы данных с помощью ALTER ROLE.

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

Уровень изоляции

Как и сам PostgreSQL, Django по умолчанию использует READ COMMITTED isolation level. Если вам нужен более высокий уровень изоляции, такой как REPEATABLE READ или SERIALIZABLE, установите его в OPTIONS части конфигурации вашей базы данных в DATABASES:

import psycopg2.extensions

DATABASES = {
    # ...
    'OPTIONS': {
        'isolation_level': psycopg2.extensions.ISOLATION_LEVEL_SERIALIZABLE,
    },
}

Примечание

При более высоких уровнях изоляции ваше приложение должно быть готово к обработке исключений, возникающих при сбоях сериализации. Эта опция предназначена для расширенного использования.

Индексы для столбцов

varchar и text

При указании db_index=True для полей вашей модели, Django обычно выводит единственный оператор CREATE INDEX. Однако, если тип базы данных для поля является varchar или text (например, используется CharField, FileField и TextField), то Django создаст дополнительный индекс, который использует соответствующий PostgreSQL operator class для столбца. Дополнительный индекс необходим для корректного выполнения поиска, использующего оператор LIKE в SQL, как это делается с типами поиска contains и startswith.

Операция миграции для добавления расширений

Если вам нужно добавить расширение PostgreSQL (например, hstore, postgis и т.д.) с помощью миграции, используйте операцию CreateExtension.

Курсоры на стороне сервера

При использовании QuerySet. iterator(), Django открывает server-side cursor. По умолчанию PostgreSQL предполагает, что будут получены только первые 10% результатов запросов курсора. Планировщик запросов тратит меньше времени на планирование запроса и начинает возвращать результаты быстрее, но это может снизить производительность, если извлекается более 10% результатов. Предположения PostgreSQL о количестве строк, извлекаемых при курсорном запросе, контролируются с помощью опции cursor_tuple_fraction.

Объединение транзакций и курсоры на стороне сервера

Использование пулера соединений в режиме пула транзакций (например, PgBouncer) требует отключения серверных курсоров для этого соединения.

Серверные курсоры являются локальными для соединения и остаются открытыми в конце транзакции, когда AUTOCOMMIT становится True. Последующая транзакция может попытаться получить больше результатов из курсора на стороне сервера. В режиме объединения транзакций нет гарантии, что последующие транзакции будут использовать одно и то же соединение. Если используется другое соединение, то при обращении транзакции к серверному курсору возникает ошибка, поскольку серверные курсоры доступны только в том соединении, в котором они были созданы.

Одним из решений является отключение серверных курсоров для соединения в DATABASES, установив DISABLE_SERVER_SIDE_CURSORS в True.

Чтобы получить преимущества от использования серверных курсоров в режиме объединения транзакций, вы можете установить соединение another connection to the database для выполнения запросов, использующих серверные курсоры. Это соединение должно быть либо напрямую с базой данных, либо с пулом соединений в режиме объединения сессий.

Другой вариант — обернуть каждый QuerySet, использующий серверный курсор, в блок atomic(), поскольку это отключает autocommit на время транзакции. Таким образом, курсор на стороне сервера будет жить только в течение транзакции.

Ручное указание значений автоинкрементных первичных ключей

Django использует SERIAL data type PostgreSQL для хранения автоинкрементных первичных ключей. Столбец SERIAL заполняется значениями из sequence, который отслеживает следующее доступное значение. Ручное присвоение значения автоинкрементному полю не обновляет последовательность поля, что впоследствии может привести к конфликту. Например:

>>> from django.contrib.auth.models import User
>>> User.objects.create(username='alice', pk=1)
<User: alice>
>>> # The sequence hasn't been updated; its next value is 1.
>>> User.objects.create(username='bob')
...
IntegrityError: duplicate key value violates unique constraint
"auth_user_pkey" DETAIL:  Key (id)=(1) already exists.

Если вам нужно указать такие значения, сбросьте последовательность после этого, чтобы избежать повторного использования значения, которое уже есть в таблице. Команда управления sqlsequencereset генерирует SQL-запросы для этого.

Шаблоны тестовых баз данных

Вы можете использовать параметр TEST['TEMPLATE'], чтобы указать template (например, 'template0'), на основе которого будет создана тестовая база данных.

Ускорение выполнения тестов с помощью недолговечных настроек

Вы можете ускорить время выполнения теста с помощью configuring PostgreSQL to be non-durable.

Предупреждение

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

Заметки о MariaDB

Django поддерживает MariaDB 10.2 и выше.

Чтобы использовать MariaDB, используйте бэкенд MySQL, который является общим для этих двух систем. Более подробную информацию смотрите в MySQL notes.

Заметки по MySQL

Поддержка версий

Django поддерживает MySQL 5.7 и выше.

Функция Django inspectdb использует базу данных information_schema, которая содержит подробные данные обо всех схемах баз данных.

Django ожидает, что база данных будет поддерживать Unicode (кодировка UTF-8) и делегирует ей задачу обеспечения транзакций и ссылочной целостности. Важно знать, что два последних факта не соблюдаются MySQL при использовании механизма хранения MyISAM, см. следующий раздел.

Двигатели для хранения

MySQL имеет несколько storage engines. Вы можете изменить движок хранения по умолчанию в конфигурации сервера.

По умолчанию в MySQL используется механизм хранения данных InnoDB. Этот механизм является полностью транзакционным и поддерживает ссылки на внешние ключи. Это рекомендуемый выбор. Однако счетчик автоинкремента InnoDB теряется при перезагрузке MySQL, поскольку он не запоминает значение AUTO_INCREMENT, а воссоздает его как «max(id)+1». Это может привести к непреднамеренному повторному использованию значений AutoField.

Основными недостатками MyISAM являются то, что он не поддерживает транзакции и не обеспечивает соблюдение ограничений на иностранные ключи.

Драйверы MySQL DB API

У MySQL есть несколько драйверов, которые реализуют Python Database API, описанный в PEP 249:

  • mysqlclient — это родной драйвер. Это рекомендуемый выбор.
  • MySQL Connector/Python — это чистый Python драйвер от Oracle, который не требует клиентской библиотеки MySQL или каких-либо модулей Python за пределами стандартной библиотеки.

Эти драйверы потокобезопасны и обеспечивают объединение соединений.

В дополнение к драйверу DB API, Django нужен адаптер для доступа к драйверам баз данных из его ORM. Django предоставляет адаптер для mysqlclient, в то время как MySQL Connector/Python включает its own.

mysqlclient

Для Django требуется mysqlclient 1.4.0 или более поздняя версия.

MySQL Connector/Python

MySQL Connector/Python доступен по ссылке download page. Адаптер Django доступен в версиях 1.1.X и более поздних. Он может не поддерживать самые последние выпуски Django.

Определения часовых поясов

Если вы планируете использовать timezone support от Django, используйте mysql_tzinfo_to_sql для загрузки таблиц часовых поясов в базу данных MySQL. Это нужно сделать только один раз для вашего сервера MySQL, а не для каждой базы данных.

Создание вашей базы данных

Вы можете create your database использовать инструменты командной строки и этот SQL:

CREATE DATABASE <dbname> CHARACTER SET utf8;

Это гарантирует, что все таблицы и столбцы будут использовать UTF-8 по умолчанию.

Настройки колляции

Настройка collation для столбца управляет порядком сортировки данных, а также тем, какие строки сравниваются как равные. Вы можете указать параметр db_collation, чтобы задать имя collation столбца для CharField и TextField.

Колляцию также можно установить на уровне всей базы данных и для каждой таблицы. Об этом говорится в документации MySQL documented thoroughly. В таких случаях вы должны установить collation, непосредственно манипулируя настройками базы данных или таблицами. Django не предоставляет API для их изменения.

По умолчанию, при использовании базы данных UTF-8, MySQL будет использовать коллизию utf8_general_ci. Это приводит к тому, что все сравнения равенства строк выполняются без учета регистра. То есть, "Fred" и "freD" считаются равными на уровне базы данных. Если у вас есть уникальное ограничение на поле, будет незаконно пытаться вставить "aa" и "AA" в один и тот же столбец, так как они сравниваются как равные (и, следовательно, неуникальные) с использованием стандартной раскладки. Если вам нужны сравнения с учетом регистра в конкретном столбце или таблице, измените столбец или таблицу, чтобы в них использовалась раскладка utf8_bin.

Обратите внимание, что согласно MySQL Unicode Character Sets, сравнения для коллизии utf8_general_ci быстрее, но немного менее корректны, чем сравнения для utf8_unicode_ci. Если это приемлемо для вашего приложения, вам следует использовать utf8_general_ci, так как это быстрее. Если это неприемлемо (например, если вам требуется немецкий порядок словарей), используйте utf8_unicode_ci, так как он более точен.

Предупреждение

Модельные наборы форм проверяют уникальные поля с учетом регистра. Таким образом, при использовании нечувствительной к регистру раскладки набор форм с уникальными значениями полей, отличающимися только регистром, пройдет проверку, но при вызове save() возникнет ошибка IntegrityError.

Changed in Django 3.2:

Добавлена поддержка установки collation базы данных для поля.

Подключение к базе данных

Обратитесь к settings documentation.

Настройки подключения используются в таком порядке:

  1. OPTIONS.
  2. NAME, USER, PASSWORD, HOST, PORT
  3. Файлы параметров MySQL.

Другими словами, если вы зададите имя базы данных в OPTIONS, оно будет иметь приоритет над NAME, которое отменит все, что находится в MySQL option file.

Вот пример конфигурации, в которой используется файл опций MySQL:

# settings. py
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'OPTIONS': {
            'read_default_file': '/path/to/my.cnf',
        },
    }
}


# my.cnf
[client]
database = NAME
user = USER
password = PASSWORD
default-character-set = utf8

Могут быть полезны несколько других MySQLdb connection options, например ssl, init_command и sql_mode.

Установка
sql_mode

Начиная с MySQL 5.7, значение опции sql_mode по умолчанию содержит STRICT_TRANS_TABLES. Эта опция перерастает предупреждения в ошибки, когда данные усекаются при вставке, поэтому Django настоятельно рекомендует активировать strict mode для MySQL, чтобы предотвратить потерю данных (либо STRICT_TRANS_TABLES, либо STRICT_ALL_TABLES).

Если вам нужно настроить режим SQL, вы можете установить переменную sql_mode как и другие опции MySQL: либо в конфигурационном файле, либо с помощью записи 'init_command': "SET sql_mode='STRICT_TRANS_TABLES'" в OPTIONS части конфигурации вашей базы данных в DATABASES.

Уровень изоляции

При одновременной загрузке транзакции базы данных из разных сессий (скажем, отдельные потоки, обрабатывающие разные запросы) могут взаимодействовать друг с другом. На это взаимодействие влияет уровень изоляции каждого сеанса transaction isolation level. Вы можете установить уровень изоляции соединения с помощью записи 'isolation_level' в OPTIONS части конфигурации вашей базы данных в DATABASES. Допустимыми значениями для этой записи являются четыре стандартных уровня изоляции:

  • 'read uncommitted'
  • 'read committed'
  • 'repeatable read'
  • 'serializable'

или None для использования настроенного уровня изоляции сервера. Однако Django лучше всего работает с read committed и по умолчанию использует read committed, а не повторяющееся чтение, как MySQL по умолчанию. При использовании повторяющегося чтения возможна потеря данных. В частности, вы можете встретить случаи, когда get_or_create() вызовет IntegrityError, но объект не появится в последующем вызове get().

Создание таблиц

Когда Django генерирует схему, он не указывает механизм хранения, поэтому таблицы будут созданы с использованием того механизма хранения по умолчанию, на который настроен ваш сервер баз данных. Самое простое решение — это установить для сервера баз данных движок хранения по умолчанию на нужный движок.

Если вы пользуетесь услугами хостинга и не можете изменить стандартный механизм хранения данных вашего сервера, у вас есть несколько вариантов.

  • После создания таблиц выполните оператор ALTER TABLE для преобразования таблицы в новый механизм хранения (например, InnoDB):

    ALTER TABLE <tablename> ENGINE=INNODB;
    

    Это может быть утомительно, если у вас много таблиц.

  • Другой вариант — использовать опцию init_command для MySQLdb перед созданием таблиц:

    'OPTIONS': {
       'init_command': 'SET default_storage_engine=INNODB',
    }
    

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

Названия таблиц

Даже в последних версиях MySQL есть known issues, которые могут привести к изменению регистра имени таблицы при выполнении определенных операторов SQL в определенных условиях. Рекомендуется использовать имена таблиц в нижнем регистре, если это возможно, чтобы избежать любых проблем, которые могут возникнуть из-за такого поведения. Django использует имена таблиц в нижнем регистре при автоматической генерации имен таблиц из моделей, так что это в основном касается тех случаев, когда вы переопределяете имя таблицы через параметр db_table.

Точки сохранения

Как Django ORM, так и MySQL (при использовании InnoDB storage engine) поддерживают базу данных savepoints.

Если вы используете механизм хранения MyISAM, пожалуйста, имейте в виду, что при попытке использовать savepoint-related methods of the transactions API вы будете получать ошибки, генерируемые базой данных. Причина этого в том, что определение движка хранения базы данных/таблицы MySQL является дорогостоящей операцией, поэтому было решено, что не стоит динамически преобразовывать эти методы в no-op’ы, основываясь на результатах такого определения.

Примечания к конкретным полям

Поля символов

Любые поля, которые хранятся с типами столбцов VARCHAR, могут иметь max_length, ограниченные 255 символами, если вы используете unique=True для поля. Это влияет на CharField, SlugField. Более подробную информацию см. в разделе the MySQL documentation.

TextField ограничения

MySQL может индексировать только первые N символов столбца BLOB или TEXT. Поскольку TextField не имеет определенной длины, вы не можете пометить его как unique=True. MySQL сообщит: «BLOB/TEXT столбец „<db_column>“ использован в спецификации ключа без длины ключа».

Поддержка дробных секунд для полей Time и DateTime

MySQL может хранить дробные секунды, при условии, что определение столбца включает указание на дробь (например, DATETIME(6)).

Django не будет обновлять существующие колонки, чтобы включить в них дробные секунды, если сервер базы данных поддерживает это. Если вы хотите включить их в существующую базу данных, вам придется либо вручную обновить столбец в целевой базе данных, выполнив команду типа:

ALTER TABLE `your_table` MODIFY `your_datetime_column` DATETIME(6)

или использование операции RunSQL в операции data migration.

TIMESTAMP столбцы

Если вы используете устаревшую базу данных, содержащую TIMESTAMP столбцов, вы должны установить USE_TZ = False, чтобы избежать повреждения данных. inspectdb отображает эти столбцы в DateTimeField, и если вы включите поддержку временных зон, то и MySQL, и Django попытаются преобразовать значения из UTC в местное время.

Блокировка строк с помощью

QuerySet.select_for_update()

MySQL и MariaDB не поддерживают некоторые опции оператора SELECT . .. FOR UPDATE. Если select_for_update() используется с неподдерживаемой опцией, то возникает ошибка NotSupportedError.

Вариант MariaDB MySQL
SKIP LOCKED X (≥10.6) X (≥8.0.1)
NOWAIT X (≥10.3) X (≥8.0.1)
OF   X (≥8.0.1)
NO KEY    

При использовании select_for_update() в MySQL убедитесь, что вы фильтруете набор запросов как минимум по набору полей, содержащихся в уникальных ограничениях, или только по полям, покрытым индексами. В противном случае на всю таблицу будет наложена эксклюзивная блокировка записи на время транзакции.

Автоматическая типизация может привести к неожиданным результатам

При выполнении запроса к строковому типу, но с целым значением, MySQL приведет типы всех значений в таблице к целому числу перед выполнением сравнения. Если ваша таблица содержит значения 'abc', 'def' и вы запрашиваете WHERE mycolumn=0, обе строки будут соответствовать. Аналогично, WHERE mycolumn=1 будет соответствовать значению 'abc1'. Поэтому поля строкового типа, включенные в Django, всегда будут приводить значение к строке, прежде чем использовать его в запросе.

Если вы реализуете пользовательские поля модели, которые наследуются от Field напрямую, переопределяют get_prep_value(), или используют RawSQL, extra(), или raw(), вам следует убедиться, что вы выполнили соответствующее приведение типов.

Заметки по SQLite

Django поддерживает SQLite 3.9.0 и более поздние версии.

SQLite является отличной альтернативой для разработки приложений, которые в основном предназначены только для чтения или требуют меньшей площади для установки. Однако, как и для всех серверов баз данных, для SQLite существуют некоторые отличия, о которых следует знать.

Сопоставление подстрок и чувствительность к регистру

Для всех версий SQLite существует несколько неинтуитивное поведение при попытке сопоставления некоторых типов строк. Это происходит при использовании фильтров iexact или contains в Querysets. Поведение разделяется на два случая:

1. For substring matching, all matches are done case-insensitively. That is a filter such as filter(name__contains="aa") will match a name of "Aabb".

2. For strings containing characters outside the ASCII range, all exact string matches are performed case-sensitively, even when the case-insensitive options are passed into the query. So the iexact filter will behave exactly the same as the exact filter in these cases.

Некоторые возможные обходные пути для этого — documented at sqlite.org, но они не используются бэкендом SQLite по умолчанию в Django, так как их было бы довольно сложно реализовать надежно. Таким образом, Django использует поведение SQLite по умолчанию, и вам следует помнить об этом при выполнении фильтрации без учета регистра или подстроки.

Работа с десятичными дробями

SQLite не имеет реального десятичного внутреннего типа. Десятичные значения внутренне преобразуются в тип данных REAL (8-байтовое число IEEE с плавающей точкой), как объясняется в SQLite datatypes documentation, поэтому они не поддерживают правильно округленную десятичную арифметику с плавающей точкой.

Ошибки «База данных заблокирована»

SQLite предназначен для легковесной базы данных и поэтому не может поддерживать высокий уровень параллелизма. Ошибки OperationalError: database is locked указывают на то, что ваше приложение испытывает больше параллелизма, чем sqlite может обработать в конфигурации по умолчанию. Эта ошибка означает, что один поток или процесс имеет эксклюзивную блокировку на соединение с базой данных, а другой поток затянул время, ожидая освобождения блокировки.

Обертка SQLite в Python имеет значение тайм-аута по умолчанию, которое определяет, как долго второму потоку разрешено ждать блокировки, прежде чем он прервется и выдаст ошибку OperationalError: database is locked.

Если вы получаете эту ошибку, вы можете решить ее следующим образом:

  • Переход на другой бэкенд базы данных. В определенный момент SQLite становится слишком «легким» для реальных приложений, и подобные ошибки параллелизма указывают на то, что вы достигли этой точки.

  • Переписывание кода для уменьшения параллелизма и обеспечения кратковременности транзакций с базой данных.

  • Увеличьте значение тайм-аута по умолчанию, установив параметр базы данных timeout:

    'OPTIONS': {
        # ...
        'timeout': 20,
        # . ..
    }
    

    Это заставит SQLite подождать немного дольше, прежде чем выдать ошибку «база данных заблокирована»; на самом деле это ничего не сделает для ее решения.

QuerySet.select_for_update() не поддерживается

SQLite не поддерживает синтаксис SELECT ... FOR UPDATE. Его вызов не даст никакого эффекта.

Стиль параметра «pyformat» в необработанных запросах не поддерживается

Для большинства бэкендов необработанные запросы (Manager.raw() или cursor.execute()) могут использовать стиль параметров «pyformat», при котором заполнители в запросе задаются как '%(name)s', а параметры передаются в виде словаря, а не списка. SQLite этого не поддерживает.

Изоляция при использовании

QuerySet.iterator()

Существуют особые соображения, описанные в Isolation In SQLite при модификации таблицы во время итерации по ней с помощью QuerySet.iterator(). Если строка добавляется, изменяется или удаляется внутри цикла, то эта строка может появиться или не появиться, или появиться дважды в последующих результатах, получаемых из итератора. Ваш код должен справиться с этим.

Включение расширения JSON1 в SQLite

Чтобы использовать JSONField на SQLite, необходимо включить JSON1 extension на Python библиотеку sqlite3. Если расширение не включено на вашей установке, будет выдана системная ошибка (fields.E180).

Чтобы включить расширение JSON1, вы можете следовать инструкции на the wiki page.

Заметки Oracle

Django поддерживает Oracle Database Server версии 19c и выше. Требуется версия 7.0 или выше драйвера cx_Oracle Python.

Для того чтобы команда python manage.py migrate работала, пользователь базы данных Oracle должен иметь привилегии для выполнения следующих команд:

  • СОЗДАТЬ ТАБЛИЦУ
  • СОЗДАТЬ ПОСЛЕДОВАТЕЛЬНОСТЬ
  • СОЗДАТЬ ПРОЦЕДУРУ
  • СОЗДАТЬ ТРИГГЕР

Чтобы запустить тестовый пакет проекта, пользователю обычно нужны эти дополнительные привилегии:

  • СОЗДАТЬ ПОЛЬЗОВАТЕЛЯ
  • ПЕРЕМЕННЫЙ ПОЛЬЗОВАТЕЛЬ
  • УВОЛИТЬ ПОЛЬЗОВАТЕЛЯ
  • СОЗДАТЬ ТАБЛИЧНОЕ ПРОСТРАНСТВО
  • СБРОСИТЬ ТАБЛИЧНОЕ ПРОСТРАНСТВО
  • СОЗДАТЬ СЕАНС С ВОЗМОЖНОСТЬЮ АДМИНИСТРИРОВАНИЯ
  • СОЗДАНИЕ ТАБЛИЦЫ С ВОЗМОЖНОСТЬЮ АДМИНИСТРИРОВАНИЯ
  • СОЗДАНИЕ ПОСЛЕДОВАТЕЛЬНОСТИ С ПОМОЩЬЮ ОПЦИИ АДМИНИСТРАТОРА
  • СОЗДАНИЕ ПРОЦЕДУРЫ С ВОЗМОЖНОСТЬЮ АДМИНИСТРИРОВАНИЯ
  • СОЗДАНИЕ ТРИГГЕРА С ВОЗМОЖНОСТЬЮ АДМИНИСТРИРОВАНИЯ

Хотя роль RESOURCE имеет необходимые привилегии CREATE TABLE, CREATE SEQUENCE, CREATE PROCEDURE и CREATE TRIGGER, а пользователь с ролью RESOURCE WITH ADMIN OPTION может предоставить RESOURCE, такой пользователь не может предоставить отдельные привилегии (например, CREATE TABLE), и поэтому RESOURCE WITH ADMIN OPTION обычно недостаточно для выполнения тестов.

Некоторые тестовые наборы также создают представления или материализованные представления; для их запуска пользователю также необходимы привилегии CREATE VIEW WITH ADMIN OPTION и CREATE MATERIALIZED VIEW WITH ADMIN OPTION. В частности, это необходимо для собственного тестового пакета Django.

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

Бэкенд базы данных Oracle использует пакеты SYS.DBMS_LOB и SYS.DBMS_RANDOM, поэтому вашему пользователю потребуются права на выполнение. Обычно по умолчанию он доступен всем пользователям, но если это не так, вам нужно будет предоставить права следующим образом:

GRANT EXECUTE ON SYS.DBMS_LOB TO user;
GRANT EXECUTE ON SYS.DBMS_RANDOM TO user;

Подключение к базе данных

Чтобы подключиться, используя имя службы вашей базы данных Oracle, ваш файл settings.py должен выглядеть примерно так:

DATABASES = {
    'default': {
        'ENGINE': 'django. db.backends.oracle',
        'NAME': 'xe',
        'USER': 'a_user',
        'PASSWORD': 'a_password',
        'HOST': '',
        'PORT': '',
    }
}

В этом случае следует оставить пустыми оба HOST и PORT. Однако, если вы не используете tnsnames.ora файл или аналогичный метод именования и хотите подключиться, используя SID («xe» в данном примере), то заполните оба HOST и PORT следующим образом:

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.oracle',
        'NAME': 'xe',
        'USER': 'a_user',
        'PASSWORD': 'a_password',
        'HOST': 'dbprod01ned.mycompany.com',
        'PORT': '1540',
    }
}

Вы должны либо указать оба значения HOST и PORT, либо оставить оба значения пустыми строками. Django будет использовать другой дескриптор подключения в зависимости от этого выбора.

Полная DSN и Easy Connect

Полная строка DSN или Easy Connect может использоваться в NAME, если оба HOST и PORT пусты. Этот формат необходим, например, при использовании RAC или подключаемых баз данных без tnsnames.ora.

Пример строки Easy Connect:

'NAME': 'localhost:1521/orclpdb1',

Пример полной строки DSN:

'NAME': (
    '(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=localhost)(PORT=1521))'
    '(CONNECT_DATA=(SERVICE_NAME=orclpdb1)))'
),

Вариант с резьбой

Если вы планируете запускать Django в многопоточной среде (например, Apache с использованием модуля MPM по умолчанию в любой современной операционной системе), то вы должны установить опцию threaded в конфигурации вашей базы данных Oracle на True:

'OPTIONS': {
    'threaded': True,
},

Невыполнение этого требования может привести к сбоям и другим странным действиям.

ВСТАВИТЬ … ВОЗВРАЩЕНИЕ В

По умолчанию бэкенд Oracle использует предложение RETURNING INTO для эффективного получения значения AutoField при вставке новых строк. Такое поведение может привести к появлению DatabaseError в некоторых необычных настройках, например, при вставке в удаленную таблицу или в представление с триггером INSTEAD OF. Пункт DatabaseError можно отключить, установив параметр INSTEAD OF конфигурации базы данных в значение RETURNING INTO:

'OPTIONS': {
    'use_returning_into': False,
},

В этом случае бэкенд Oracle будет использовать отдельный запрос SELECT для получения значений AutoField.

Вопросы наименования

Oracle устанавливает ограничение на длину имени в 30 символов. Для этого бэкенд усекает идентификаторы баз данных, заменяя последние четыре символа усеченного имени повторяющимся хэш-значением MD5. Кроме того, бэкэнд переводит идентификаторы баз данных в верхний регистр.

Чтобы предотвратить эти преобразования (обычно это требуется только при работе с устаревшими базами данных или при доступе к таблицам, принадлежащим другим пользователям), используйте имя в кавычках в качестве значения для db_table:

class LegacyModel(models.Model):
    class Meta:
        db_table = '"name_left_in_lowercase"'

class ForeignModel(models.Model):
    class Meta:
        db_table = '"OTHER_USER"."NAME_ONLY_SEEMS_OVER_30"'

Имена в кавычках можно использовать и с другими поддерживаемыми в Django бэкендами баз данных; однако, за исключением Oracle, кавычки не имеют никакого эффекта.

При выполнении migrate может возникнуть ошибка ORA-06552, если некоторые ключевые слова Oracle используются в качестве имени поля модели или значения опции db_column. Django заключает в кавычки все идентификаторы, используемые в запросах, чтобы предотвратить большинство подобных проблем, но эта ошибка все же может возникнуть, если в качестве имени столбца используется тип данных Oracle. В частности, старайтесь избегать использования имен date, timestamp, number или float в качестве имени поля.

NULL и пустые строки

Django обычно предпочитает использовать пустую строку (''), а не NULL, но Oracle рассматривает оба варианта одинаково. Чтобы обойти это, бэкенд Oracle игнорирует явную опцию null для полей, которые имеют пустую строку в качестве возможного значения, и генерирует DDL, как если бы null=True. При выборке из базы данных предполагается, что значение NULL в одном из этих полей действительно означает пустую строку, и данные молча преобразуются, чтобы отразить это предположение.

TextField ограничения

Бэкенд Oracle хранит TextFields как NCLOB столбцы. Oracle накладывает некоторые ограничения на использование таких LOB-столбцов в целом:

  • Столбцы LOB не могут использоваться в качестве первичных ключей.
  • LOB-столбцы не могут использоваться в индексах.
  • LOB-столбцы не могут использоваться в списке SELECT DISTINCT. Это означает, что попытка использовать метод QuerySet.distinct в модели, которая включает TextField столбцов, приведет к ошибке ORA-00932 при запуске в Oracle. В качестве обходного пути используйте метод QuerySet.defer в сочетании с distinct(), чтобы предотвратить включение TextField столбцов в список SELECT DISTINCT.

Подклассы встроенных бэкендов баз данных

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

Рассмотрим, например, что вам нужно изменить одну функцию базы данных. Сначала нужно создать новый каталог с модулем base в нем. Например:

mysite/
    ...
    mydbengine/
        __init__. py
        base.py

Модуль base.py должен содержать класс с именем DatabaseWrapper, который подклассифицирует существующий движок из модуля django.db.backends. Вот пример подклассификации движка PostgreSQL для изменения функционального класса allows_group_by_selected_pks_on_model:

mysite/mydbengine/base.py

from django.db.backends.postgresql import base, features

class DatabaseFeatures(features.DatabaseFeatures):
    def allows_group_by_selected_pks_on_model(self, model):
        return True

class DatabaseWrapper(base.DatabaseWrapper):
    features_class = DatabaseFeatures

Наконец, вы должны указать DATABASE-ENGINE в вашем settings.py файле:

DATABASES = {
    'default': {
        'ENGINE': 'mydbengine',
        ...
    },
}

Вы можете посмотреть текущий список движков баз данных, заглянув в django/db/backends.

Использование бэкенда базы данных стороннего производителя

Помимо официально поддерживаемых баз данных, существуют бэкенды, предоставляемые сторонними разработчиками, которые позволяют использовать другие базы данных с Django:

  • CockroachDB
  • Firebird
  • Google Cloud Spanner
  • Microsoft SQL Server

Версии Django и возможности ORM, поддерживаемые этими неофициальными бэкендами, значительно различаются. Запросы относительно специфических возможностей этих неофициальных бэкендов, а также любые вопросы поддержки, должны быть направлены в каналы поддержки, предоставляемые каждым сторонним проектом.

Анализ данных с помощью pandas. Часть 8: работа с данными из базы данных SQL

До этого момента, мы получали данные только из csv файлов. Это довольно распространённый способ сохранения данных, но далеко не единственный! Pandas может работать с данными из HTML, JSON, SQL, Excel (!!!), HDF5, Stata, и некоторых других вещей. В этой части мы поговорим о работе с данными из баз данных SQL.

In [1]:

import pandas as pd
import sqlite3

Чтение из SQL баз данных

Загрузить данные из SQL базы можно с помощью функции pd.read_sql. read_sql автоматически преобразует столбцы SQL в столбцы DataFrame.

read_sql принимает 2 аргумента: запрос SELECT, и connection. Это здорово, так как это означает, что можно читать из любого вида базы данных — неважно, MySQL, SQLite, PostgreSQL, или другая.

В этом примере мы читаем из базы SQLite, но другие читаются точно также. Файл, с которым мы будем работать.

In [2]:

con = sqlite3.connect("data/weather_2012.sqlite")
df = pd.read_sql("SELECT * from weather_2012 LIMIT 3", con)
df

Out[2]:

iddate_timetemp
012012-01-01 00:00:00-1.8
122012-01-01 01:00:00-1. 8
232012-01-01 02:00:00-1.8

read_sql не устанавливает первичный ключ (id) в качестве индекса. Можно это сделать вручную, добавив аргумент index_col к read_sql.

Если вы много использовали read_csv, вы могли заметить, что у него также есть аргумент index_col. И ведёт он себя точно так же.

In [3]:

df = pd.read_sql("SELECT * from weather_2012 LIMIT 3", con, index_col='id')
df

Out[3]:

date_timetemp
id
12012-01-01 00:00:00-1.8
22012-01-01 01:00:00-1.8
32012-01-01 02:00:00-1.8

Если вы хотите, чтобы dataframe был индексирован несколькими столбцами, в index_col можно указать их список:

In [4]:

df = pd. read_sql("SELECT * from weather_2012 LIMIT 3", con, 
                 index_col=['id', 'date_time'])
df

Out[4]:

temp
iddate_time
12012-01-01 00:00:00-1.8
22012-01-01 01:00:00-1.8
32012-01-01 02:00:00-1.8

Запись в базу

Запись производится с помощью метода to_sql (по аналогии с CSV):

In [5]:

weather_df = pd.read_csv('data/weather_2012.csv')
con = sqlite3.connect("data/test_db.sqlite")
con.execute("DROP TABLE IF EXISTS weather_2012")
weather_df.to_sql("weather_2012", con)
/usr/local/lib/python3.5/dist-packages/pandas/core/generic.py:1345: UserWarning: The spaces in these column names will not be changed. In pandas versions < 0.14, spaces were converted to underscores.
  chunksize=chunksize, dtype=dtype)

Теперь мы можем загрузить записанные данные:

In [6]:

con = sqlite3. connect("data/test_db.sqlite")
df = pd.read_sql("SELECT * from weather_2012 LIMIT 3", con)
df

Out[6]:

indexDate/TimeTemp (C)Dew Point Temp (C)Rel Hum (%)Wind Spd (km/h)Visibility (km)Stn Press (kPa)Weather
002012-01-01 00:00:00-1.8-3.98648.0101.24Fog
112012-01-01 01:00:00-1.8-3.78748.0101.24Fog
222012-01-01 02:00:00-1.8-3.48974.0101.26Freezing Drizzle,Fog

Главное преимущество хранения данных в базе в том, что можно напрямую делать SQL запросы. Это особенно хорошо, если SQL для вас более родной язык. Например, можно отсортировать по колонке ‘Weather’ с помощью лишь SQL:

In [7]:

con = sqlite3. connect("data/test_db.sqlite")
df = pd.read_sql("SELECT * from weather_2012 ORDER BY Weather LIMIT 3", con)
df

Out[7]:

indexDate/TimeTemp (C)Dew Point Temp (C)Rel Hum (%)Wind Spd (km/h)Visibility (km)Stn Press (kPa)Weather
0672012-01-03 19:00:00-16.9-24.8502425.0101.74Clear
11142012-01-05 18:00:00-7.1-14.4561125.0100.71Clear
21152012-01-05 19:00:00-9.2-15.461725.0100.80Clear

Другие базы данных

Для подключения к MySQL:

Чтобы это работало, у вас на машине должна быть установлена соответствующая база данных

In [ ]:

import MySQLdb
con = MySQLdb. connect(host="localhost", db="test")

PostgreSQL:

In [ ]:

import psycopg2
con = psycopg2.connect(host="localhost")

Для вставки кода на Python в комментарий заключайте его в теги <pre><code>Ваш код</code></pre>

Свежее

  • Модуль csv — чтение и запись CSV файлов
  • Создаём сайт на Django, используя хорошие практики. Часть 1: создаём проект
  • Онлайн-обучение Python: сравнение популярных программ

Категории

  • Книги о Python
  • GUI (графический интерфейс пользователя)
  • Курсы Python
  • Модули
  • Новости мира Python
  • NumPy
  • Обработка данных
  • Основы программирования
  • Примеры программ
  • Типы данных в Python
  • Видео
  • Python для Web
  • Работа для Python-программистов

Полезные материалы

  • Сделай свой вклад в развитие сайта!
  • Самоучитель Python
  • Карта сайта
  • Отзывы на книги по Python
  • Реклама на сайте

Мы в соцсетях

Как работает модуль sqlite3 в Python 3