Spec-Zone.ru › MySQL Connectors 1.0
Глава 2 Руководство для разработчиков Python

Глава 2 Руководство для разработчиков Python

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

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

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

  • Любое приложение, принимающее ввод, должно быть готово к обработке некорректных данных.

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

    Некорректные данные также могут быть преднамеренными, представляя собой атаку типа «впрыск SQL». Например, значения ввода могут содержать кавычки, точки с запятой, % и _ символы подстановки и другие символы, имеющие значение в SQL-запросах. Валидируйте значения ввода, чтобы убедиться, что они содержат только ожидаемые символы. Экранируйте любые специальные символы, которые могут изменить предполагаемое поведение при подстановке в SQL-запрос. Никогда не конкатенируйте значение пользовательского ввода в SQL-запрос без предварительной валидации и экранирования. Даже при приеме ввода, сгенерированного другой программой, предполагайте, что эта программа также может быть скомпрометирована и отправлять вам неверные или вредоносные данные.

  • Поскольку наборы результатов из SQL-запросов могут быть очень большими, используйте соответствующий метод для извлечения элементов из набора результатов по мере прохождения цикла по ним. fetchone() извлекает один элемент, когда вы знаете, что набор результатов содержит одну строку. fetchall() извлекает все элементы, когда вы знаете, что набор результатов содержит ограниченное количество строк, которые могут удобно поместиться в памяти. fetchmany() — это метод общего назначения, когда вы не можете предсказать размер набора результатов: вы продолжаете вызывать его и проходить цикл по возвращаемым элементам, пока не останется больше результатов для обработки.

  • Поскольку в Python уже есть удобные модули, такие как pickle и cPickle для чтения и записи структур данных на диске, данные, которые вы выбираете для хранения в MySQL, вероятно, будут обладать особыми характеристиками:

    • Слишком объёмные для одновременного хранения в памяти. Вы используете операции, чтобы запросить только необходимые вам элементы, и для выполнения вычислений по многим элементам. Вы настраиваете параметр внутри сервера MySQL, чтобы выделить определенный объем ОЗУ для кэширования данных таблиц и индексов.

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

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

  • Использование лучших практик MySQL для производительности может помочь вашему приложению масштабироваться без необходимости крупных переписываний и архитектурных изменений. См. для получения рекомендаций по производительности MySQL. Он предоставляет рекомендации и советы по настройке SQL, проектированию баз данных и конфигурации сервера.

  • Вы можете избежать изобретения велосипеда, изучив SQL-операции MySQL для распространенных операций: операторы для использования в запросах, методы массовой загрузки данных и так далее. Некоторые операторы и предложения являются расширениями основных, определённых стандартом SQL. См. , , и для основных типов операторов.

  • Выдача SQL-запросов из Python обычно включает объявление очень длинных, возможно, многострочных строковых литералов. Поскольку строковые литералы внутри SQL-запросов могут быть заключены в одинарные или двойные кавычки или содержать один из этих символов, для простоты вы можете использовать механизм тройных кавычек Python для заключения всего оператора. Например:

    '''It doesn't matter if this string contains 'single'
    or "double" quotes, as long as there aren't 3 in a
    row.'''
    

    Вы можете использовать любой из ' или " символов для тройных кавычек многострочных строковых литералов.

  • Многие секреты быстрого и масштабируемого приложения MySQL связаны с использованием правильного синтаксиса в самом начале процесса настройки, в операторах . Например, Oracle рекомендует предложение ENGINE=INNODB для большинства таблиц и делает InnoDB стандартным движком хранения в MySQL 5.5 и выше. Использование InnoDB таблиц позволяет вести транзакции, что способствует масштабируемости рабочих нагрузок чтения-записи, и предлагает автоматическую . Ещё одно рекомендация – объявить числовой для каждой таблицы, что предлагает наиболее быстрый способ поиска значений и может служить указателем на связанные значения в других таблицах ( ). Также внутри оператора , использование самых компактных типов данных столбцов, соответствующих потребностям вашего приложения, способствует производительности и масштабируемости, поскольку это позволяет серверу базы данных перемещать меньше данных между памятью и диском.

© 2025 Oracle
Licensed under the GPLv2 License.
https://docs.oracle.com/cd/E17952_01/connector-python-en/connector-python-coding.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API