воскресенье, 21 ноября 2010 г.

Взаимодействие python с базами данных Firebird с использованием модуля kinterbasdb или "Python и поводок для "огненной птицы"

KInterbasDB - модуль расширения Python, который обеспечивает работу с реляционными базами данных Firebird и некоторыми версиями Borland® Interbase®.
Для тех кто хочет основательно изучить все возможности, предоставляемые данным модулем, есть подробная документация по модулю (на английском языке), здесь же я буду приводить лишь некоторые моменты, достаточные для краткого знакомства с модулем.

Во-первых, скачиваем сам модуль kinterbasdb, и не забываем каждый раз в программе делать импорт:

import kinterbasdb

Получение набора записей путем выполнения sql-запроса

#подключаем модуль
import kinterbasdb

#Подключаемся к базе
myconnection = kinterbasdb.connect(ibhostname,ibdatabasename, ibusername, ibpassword)
 

 #Cоздаем курсор
mycursor = myconnection.cursor()

# выполяем sql-запрос
mycursor.execute('select  tt.field1, tt.field2, tt.filed3 from mytable tt')
 

# парсим полученный результат в список кортежей
result = mycursor.fetchall()
 

# бежим по записям и выполняем любые действия
for  (myfield1, myfield2, myfield3) in result:
        #выводим на экран значения полей
        print field1+'|'+ field2 + '|' + field3

# после выполнения всех нужных нам действий закрываем соединение с базой
myconnection.close


Вызов хранимых процедур

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

#посредством выполнения sql-запроса вызываем процедуру, имеющуюся в базе
cur.execute("select outvalue1, outvalue2 from mystoredproc(?, ?)", (inputparam1, inputparam2))

# бежим по полученным записям:
for row in cur:
... # обрабатываем запись

con.commit() # Если процедура требует подтверждения транзакции, подтверждаем


2.Выполнение хранимой процедуры для последующего использования возвращаемых ею параметров (output parameters):

#напрямую вызываем процедуру, имеющуюся в базе
cur.callproc("the_proc", (input1, input2))

# Если процедура возвращает какие-либо параметры, получаем
# их как если это была бы первая запись набора данных
outputParams = cur.fetchone()


На всякий случай напомню, что после выполнения fetchone() переменная outputParams у нас содержит не что иное, как список значений, полученных в результате выполнения процедуры. Таким образом мы можем воспользоваться любым из этих значений, обратившись к нему по его индексу. Например, процедура вернула значения outvalue1 и outvalue2, соответственно получили outputParams = (outvalue1, outvalue2). Если нам нужно только значение outvalue1 вызываем его из списка:
print outputParams[0]

con.commit() # Если процедура требует подтверждения транзакции, подтверждаем

Примечание:
В официальной документации к модулю kinterbasdb написано передавать входные параметры в виде кортежа (param1, param2),
вот так:
cur.execute("select outvalue1, outvalue2 from mystoredproc(?, ?)", (inputparam1, inputparam2)),
однако если таким образом укажете единственный параметр, то получите ошибку:
TypeError: object of type 'int' has no len()
Потому, как при вызове процедур с единственным входным параметром этот параметр следует указывать в виде [param1], вот так:
cur.execute("select outvalue1, outvalue2 from mystoredproc(?, ?)", [inputparam1])
В случае, когда входных параметров несколько, вызов процедур прекрасно работал как в случае указания параметров в виде списка, так и в виде кортежа:
cur.execute("select outvalue1, outvalue2 from mystoredproc(?, ?)", [inputparam1, inputparam2])
cur.execute("select outvalue1, outvalue2 from mystoredproc(?, ?)", (inputparam1, inputparam2))




.. ПРОДОЛЖЕНИЕ СЛЕДУЕТ

1 комментарий:

Unknown комментирует...

продолжения так и не последовало

Отправить комментарий