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г.
Просмотров: 6229
Комментарии: 0
Машинное обучение с использованием библиотеки Н2О

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

02.12.2013г.
Просмотров: 3027
Комментарии: 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