Python глазами DBA::Журнал СА 7.2003
www.samag.ru
     
Поиск   
              
 www.samag.ru    Web  0 товаров , сумма 0 руб.
E-mail
Пароль  
 Запомнить меня
Регистрация | Забыли пароль?
Журнал "Системный администратор"
Журнал «БИТ»
Подписка
Архив номеров
Где купить
Наука и технологии
Авторам
Рекламодателям
Контакты
   

  Опросы
  Статьи

Событие  

В банке рассола ждет сисадмина с полей фрактал-кукумбер

Читайте впечатления о слете ДСА 2024, рассказанные волонтером и участником слета

 Читать далее...

Организация бесперебойной работы  

Бесперебойная работа ИТ-инфраструктуры в режиме 24/7 Как обеспечить ее в нынешних условиях?

Год назад ИТ-компания «Крок» провела исследование «Ключевые тренды сервисного рынка 2023». Результаты

 Читать далее...

Книжная полка  

Читайте и познавайте мир технологий!

Издательство «БХВ» продолжает радовать выпуском интересных и полезных, к тому же прекрасно

 Читать далее...

СУБД PostgreSQL  

СУБД Postgres Pro

Сертификация по новым требованиям ФСТЭК и роль администратора без доступа к данным

 Читать далее...

Критическая инфраструктура  

КИИ для оператора связи. Готовы ли компании к повышению уровня кибербезопасности?

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

 Читать далее...

Архитектура ПО  

Архитектурные метрики. Качество архитектуры и способность системы к эволюционированию

Обычно соответствие программного продукта требованиям мы проверяем через скоуп вполне себе понятных

 Читать далее...

Как хорошо вы это знаете  

Что вам известно о разработках компании ARinteg?

Компания ARinteg (ООО «АРинтег») – системный интегратор на российском рынке ИБ –

 Читать далее...

Графические редакторы  

Рисование абстрактных гор в стиле Paper Cut

Векторный графический редактор Inkscape – яркий представитель той прослойки open source, с

 Читать далее...

День сисадмина  

Учите матчасть! Или как стать системным администратором

Лето – время не только отпусков, но и хорошая возможность определиться с профессией

 Читать далее...

День сисадмина  

Живой айтишник – это всегда движение. Остановка смерти подобна

Наши авторы рассказывают о своем опыте и дают советы начинающим системным администраторам.

 Читать далее...

Виртуализация  

Рынок решений для виртуализации

По данным «Обзора российского рынка инфраструктурного ПО и перспектив его развития», сделанного

 Читать далее...

Книжная полка  

Как стать креативным и востребованным

Издательский дом «Питер» предлагает новинки компьютерной литературы, а также книги по бизнесу

 Читать далее...

Книжная полка  

От создания сайтов до разработки и реализации API

В издательстве «БХВ» недавно вышли книги, которые будут интересны системным администраторам, создателям

 Читать далее...

Разбор полетов  

Ошибок опыт трудный

Как часто мы легко повторяем, что не надо бояться совершать ошибки, мол,

 Читать далее...

1001 и 1 книга  
19.03.2018г.
Просмотров: 6144
Комментарии: 0
Машинное обучение с использованием библиотеки Н2О

 Читать далее...

12.03.2018г.
Просмотров: 6857
Комментарии: 0
Особенности киберпреступлений в России: инструменты нападения и защита информации

 Читать далее...

12.03.2018г.
Просмотров: 4140
Комментарии: 0
Глубокое обучение с точки зрения практика

 Читать далее...

12.03.2018г.
Просмотров: 2978
Комментарии: 0
Изучаем pandas

 Читать далее...

12.03.2018г.
Просмотров: 3781
Комментарии: 0
Программирование на языке Rust (Цветное издание)

 Читать далее...

19.12.2017г.
Просмотров: 3789
Комментарии: 0
Глубокое обучение

 Читать далее...

19.12.2017г.
Просмотров: 6283
Комментарии: 0
Анализ социальных медиа на Python

 Читать далее...

19.12.2017г.
Просмотров: 3134
Комментарии: 0
Основы блокчейна

 Читать далее...

19.12.2017г.
Просмотров: 3434
Комментарии: 0
Java 9. Полный обзор нововведений

 Читать далее...

16.02.2017г.
Просмотров: 7246
Комментарии: 0
Опоздавших не бывает, или книга о стеке

 Читать далее...

17.05.2016г.
Просмотров: 10616
Комментарии: 0
Теория вычислений для программистов

 Читать далее...

30.03.2015г.
Просмотров: 12336
Комментарии: 0
От математики к обобщенному программированию

 Читать далее...

18.02.2014г.
Просмотров: 13969
Комментарии: 0
Рецензия на книгу «Читаем Тьюринга»

 Читать далее...

13.02.2014г.
Просмотров: 9100
Комментарии: 0
Читайте, размышляйте, действуйте

 Читать далее...

12.02.2014г.
Просмотров: 7053
Комментарии: 0
Рисуем наши мысли

 Читать далее...

10.02.2014г.
Просмотров: 5362
Комментарии: 3
Страна в цифрах

 Читать далее...

18.12.2013г.
Просмотров: 4594
Комментарии: 0
Большие данные меняют нашу жизнь

 Читать далее...

18.12.2013г.
Просмотров: 3402
Комментарии: 0
Компьютерные технологии – корень зла для точки роста

 Читать далее...

04.12.2013г.
Просмотров: 3129
Комментарии: 0
Паутина в облаках

 Читать далее...

03.12.2013г.
Просмотров: 3379
Комментарии: 0
Рецензия на книгу «MongoDB в действии»

 Читать далее...

02.12.2013г.
Просмотров: 3000
Комментарии: 0
Не думай о минутах свысока

 Читать далее...

Друзья сайта  

 Python глазами DBA

Архив номеров / 2003 / Выпуск №7 (8) / Python глазами DBA

Рубрика: Программирование /  Анализ данных

ОЛЕГ ПОПОВ

Python глазами DBA

Почему, собственно, Python

Администраторы БД очень часто нуждаются в инструментах для автоматизации разной рутинной работы, например: загрузка, преобразования данных в разного рода форматы или сбор и анализ различной статистики. Для меня в свое время такой палочкой-выручалочкой стал Perl.

Через некоторое время я набрел на Python. Что я могу сказать после года знакомства: практичный и полезный инструмент.

Достоинства языка Python:

  • Многоплатформенность и масштабируемость: работает на большинстве известных программно-аппаратных платформ от PDA до CRAY и IBM 390.
  • Гармоничная архитектура языка:
    • Простой и удобный для понимания логики программ синтаксис.
    • Встроенные структуры данных: списки, кортежи, словари.
    • Огромное количество библиотек:
      • XML-парсеры;GUI (Win32, GTK/GNOME, KDE/QT, TK, FOX, WXWindows);
      • Сетевые протоколы;
      • Разработка веб-приложений.
    • Переносимость кода между различными платформами.
    • Мощные интерфейсы к конкретным ОС (особенно к Linux/UNIX и win32).
    • Поддержка разных стилей программирования: процедурного, объектного, функционального.
    • Встроенная поддержка Unicode и множества национальных кодировок (включая 5 русских).
    • Возможность писать самодокументированные программы и автоматическая генерация документации на модули.

С чем в действительности сталкивается программист при использовании Python – это простой и ясный синтаксис. Я ловлю себя часто на мысли, что просмотр чужого кода зачастую не требует значительного напряжения. И здесь помогает то, что отступы являются частью синтаксиса и определяют вложенность операторов.

Библиотеки зачастую имеют очень лаконичную документацию, но этого достаточно, так как API очень выразительны и внятны.

Сам процесс кодирования и тестирования достаточно комфортен. Здесь помогает качественная диагностика ошибок. Оттестированные модули очень легко расширять и складывать из них приложения.

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

  • ODBC (Win32, Linux)
  • DCOM (Win32)
  • PERL_DBI (Win32, Linux, Solaris, HP-UX, AIX)
  • NATIVE API (Win32, Linux, Solaris, HP-UX, AIX)

Более подробную информацию вы можете найти на www.python.org.

Выполняем простой запрос

Я предпочитаю использовать модуль cx_Oracle, который был проверен мною в ОС NT и Linux (автор Anthony Tuininga утверждает, что он работает в Solaris и, похоже, на всех UNIX-подобных ОС должен также работать). В основном этот модуль следует спецификации Python Database API 2.0 и поддерживает работу с RDBMS Oracle версий 8.1-9.xx.

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

try:

    import cx_Oracle

except ImportError,info:

    print "Import Error:",info

    sys.exit()

if cx_Oracle.version<"3.0":

    print "Very old version of cx_Oracle :",cx_Oracle.version

    sys.exit()

В этом фрагменте демонстрируется безопасная загрузка модуля cx_Oracle и проверка версии. (Надеюсь, элегантность синтаксиса все-таки заметили).

Далее создадим экземпляр класса connect – именно этот объект и обеспечивает взаимодействие с сервером Oracle.

try:

my_connection=cx_Oracle.connect("system/manager@test_db")

except cx_Oracle.DatabaseError,info:

    print "Logon  Error:",info

    exit(0)

Теперь создаем курсор и выполняем запрос:

my_cursor=my_connection.cursor()

try:

my_cursor.execute("""

SELECT OWNER,SEGMENT_TYPE,TABLESPACE_NAME,SUM(BLOCKS)SIZE_BLOCKS, COUNT(*) SIZE_EXTENTS FROM DBA_EXTENTS

GROUP BY OWNER,SEGMENT_TYPE,TABLESPACE_NAME

    """)

except cx_Oracle.DatabaseError,info:

    print "SQL Error:",info

    exit(0)

: (name, type_code, display_size, internal_size, precision, scale, null_ok).

Далее следует форматированный вывод на stdout (почти как printf в языке C).

print

print "Database:",my_connection.tnsentry

print

print "Used space by owner, object type, tablespace "

print "-------------------------------------------------"

title_mask=("%-16s","%-16s","%-16s","%-8s","%-8s")

i=0

    i=1+i

print ""

print "-------------------------------------------------"

row_mask="%-16s %-16s %-16s %8.0f %8.0f "

for recordset in my_cursor.fetchall():

print row_mask%recordset

В результате мы увидим что-то вроде:

Database: testdb

Used space by owner, object type, tablespace

-------------------------------------------------------------

OWNER   SEGMENT_TYPE TABLESPACE_NAME SIZE_BLOCKS SIZE_EXTENTS

-------------------------------------------------------------

ADU2     INDEX        USERS                 784       25

ADU2     TABLE        USERS                 512       24

ADUGKS   INDEX        DEVELOP_DATA          984      123

ADUGKS   TABLE        DEVELOP_DATA          664       83

ADUGPA   INDEX        USERS                 784       25

ADUGPA   TABLE        USERS                 496       23

AGNKS_SG INDEX        USERS                 352       22

AGNKS_SG TABLE        USERS                 240       15

ATU      INDEX        USERS                3968      244

ATU      TABLE        DEVELOP_DATA            8        1

ATU      TABLE        USERS                2688      160

ATU1     INDEX        DEVELOP_DATA         1600      200

ATU1     INDEX        USERS                 608       38

ATU1     TABLE        DEVELOP_DATA         1032      129

ATU1     TABLE        USERS                 544       34

BUX      INDEX        DEVELOP_DATA           64        8

BUX      TABLE        DEVELOP_DATA         1736      217

DISP     INDEX        USERS                 400       25

DISP     TABLE        USERS                 528       33

EPE      INDEX        USERS                  80        5

EPE      TABLE        USERS                  48        3

EXZ      INDEX        USERS                1088       61

EXZ      TABLE        DEVELOP_DATA            8        1

EXZ      TABLE        USERS                 832       41

Запросы с параметрами

Согласно спецификации Python Database API 2.0 для выполнения запросов с параметрами каждый модуль должен реализовывать переменную paramstyle, которая определяет, каким образом будут передаваться параметры запросов. Текущая версия cx_Oracle(3.0) поддерживает режим "named", то есть в модуле установлена переменная cx_Oracle.paramstyle="named" и можно создавать конструкции в запросах в виде:

select *  from all_users where USERNAME LIKE :S

При этом связывание параметров запроса со значениями можно выполнить двумя способами.

Именованый параметeр метода exec:

cursor2.execute("select *  from all_users where USERNAME LIKE :S ",S="S%")

Словарь {":переменная":значение,...}:

cursor2.execute("select *  from all_users where USERNAME LIKE :S ",{":S":"S%"})

Анонимные блоки PL/SQL

В некоторых случаях очень удобно использовать нестандартные средства сервера: для Oracle таким нестандартным, но очень удобным механизмом является возможность исполнения анонимных блоков PL/SQL. Модуль сx_Oracle реализует этот механизм, который, естественно, не описан в спецификации Python Database API 2.0.

Чтобы связать переменные блока PL/SQL c переменными языка Python, в модуле сx_Oracle реализован класс var. Экземпляр можно создать следующим образом:

var=my_cursor.var(cx_Oracle.DATETIME)

Конструктор my_cursor.var(...) в качестве параметра требует указать тип создаваемой переменной. Варианты:

  • BINARY
  • DATETIME
  • FIXEDCHAR
  • LONGBINARY
  • LONGSTRING
  • NUMBER
  • ROWID
  • STRING

var=my_cursor.var(cx_Oracle.DATETIME)

try:

    my_cursor.execute("""begin

    SELECT SYSDATE INTO :p_Value from dual;

    end;""",p_Value = var)  

except cx_Oracle.DatabaseError,info:

    print "SQL Error:",info

    exit(0)

Очевидно, что теперь var содержит текущее время сервера. Доступ к значениям переменной выполняется с помощью метода var.getvalue():

CDATE=var.getvalue()

print "Date: %02u/%02u/%4u"%(CDATE.day,CDATE.month,CDATE.year)

print "Time: %02u:%02u:%02u"%(CDATE.hour,CDATE.minute,CDATE.second)

Этот пример демонстрирует также и форматирование даты и времени для экземпляра var. В результате напечатается нечто вроде:

Date: 12/05/2003

Time: 16:42:54

В связи с тем, что работа с типами времени и даты внутри сервера Oracle реализована особенным образом (независимо от ОС), модуль сx_Oracle реализует следующие функции для для преобразования значений дат и времени:

  • Date( year, month, day)
  • DateFromTicks( ticks)
  • Time( hour, minute, second)
  • TimeFromTicks( ticks)
  • Timestamp( year, month, day, hour, minute, second)
  • TimestampFromTicks( ticks)

var=my_cursor.var(cx_Oracle.DATETIME)

var.setvalue(0,cx_Oracle.Date( 2002, 02,12))

CDATE=var.getvalue()

print"Date:%02u/%02u/%4u"%(CDATE.day,CDATE.month,CDATE.year)

print"Time:%02u:%02u:%02u"%(CDATE.hour,CDATE.minute,CDATE.second)

Результат будет следующий:

Date: 12/02/2002

Time: 00:00:00

Ссылки:

  1. http://computronix.com/utilities.shtml
  2. http://www.python.org/topics/database/DatabaseAPI-2.0.html

Листинг 1

Выполняем простой запрос:

""

cx_Oracle demo

simple query

"""

__AUTHOR__='POPOV O.'

__COPYRIGHT__='POPOV O. 2002 Samara, Russia'

from sys import exit

try:

    import cx_Oracle

except ImportError,info:

    print "Import Error:",info

    sys.exit()

if cx_Oracle.version<'3.0':

    print "Very old version of cx_Oracle :",cx_Oracle.version

    sys.exit()

try:

    my_connection=cx_Oracle.connect('system/gasdba@sqlmt')

except cx_Oracle.DatabaseError,info:

    print "Logon  Error:",info

    exit(0)

my_cursor=my_connection.cursor()

try:

 my_cursor.execute("""

 SELECT OWNER,SEGMENT_TYPE,TABLESPACE_NAME,SUM(BLOCKS)SIZE_BLOCKS,COUNT(*) SIZE_EXTENTS FROM DBA_EXTENTS

 GROUP BY OWNER,SEGMENT_TYPE,TABLESPACE_NAME

    """)

except cx_Oracle.DatabaseError,info:

    print "SQL Error:",info

    exit(0)

print

print 'Database:',my_connection.tnsentry

print

print "Used space by owner, object type, tablespace "

print "--------------------------------------------------"

title_mask=('%-16s','%-16s','%-16s','%-8s','%-8s')

i=0

for column_description in my_cursor.description:

    print title_mask[i]%column_description[0],

    i=1+i

print ''

print "--------------------------------------------------"

row_mask='%-16s %-16s %-16s %8.0f %8.0f '

for recordset in my_cursor.fetchall():

print row_mask%recordset

for column_description in my_cursor.description:

    print column_description

Листинг 2

Запрос с параметрами:

""

cx_Oracle demo

query with parameters

"""

__AUTHOR__='POPOV O.'

__COPYRIGHT__='POPOV O. 2002 Samara, Russia'

from sys import exit

try:

    import cx_Oracle

except ImportError,info:

    print "Import Error:",info

    sys.exit()

if cx_Oracle.version<'3.0':

    print "Very old version of cx_Oracle :",cx_Oracle.version

    sys.exit()

try:

    my_connection=cx_Oracle.connect('system/manager@test_db')

except cx_Oracle.DatabaseError,info:

    print "Logon  Error:",info

    exit(0)

my_cursor=my_connection.cursor()

try:

    my_cursor.execute("""

    SELECT OWNER,SEGMENT_TYPE,TABLESPACE_NAME, SUM(BLOCKS)SIZE_BLOCKS,COUNT(*) SIZE_EXTENTS FROM DBA_EXTENTS

        WHERE OWNER LIKE :S

    GROUP BY OWNER,SEGMENT_TYPE,TABLESPACE_NAME

    """,S='SYS%')

except cx_Oracle.DatabaseError,info:

    print "SQL Error:",info

    exit(0)

print

print 'Database:',my_connection.tnsentry

print

print "Used space by owner, object type, tablespace "

print "---------------------------------------------------"

title_mask=('%-16s','%-16s','%-16s','%-8s','%-8s')

i=0

for column_description in my_cursor.description:

    print title_mask[i]%column_description[0],

    i=1+i

print ''

print "----------------------------------------------------"

row_mask='%-16s %-16s %-16s %8.0f %8.0f '

for recordset in my_cursor.fetchall():

print row_mask%recordset


Комментарии отсутствуют

Добавить комментарий

Комментарии могут оставлять только зарегистрированные пользователи

               Copyright © Системный администратор

Яндекс.Метрика
Tel.: (499) 277-12-45
E-mail: sa@samag.ru