Python+ODBC+Firebird (original) (raw)

К сожалению kinterbasdb (python расширение для работы с Firebird\Interbase) поддерживает на данный момент только 2.х версию python. Если надо обратится к Firebird из python 3, то нам на помощь придет ODBC. Проблема только в том что и для работы с ODBC в python тоже надо расширение (по моему это странно учитывая. распространенность ODBC). И так что нам понадобится скачать…

После установки всего этого богатства можете проверить драйвер и приступим
(Кстати в WinXP: Пуск-Панель управления-Администрирование- Источники данных (ODBC))

Создадим конфигурационный файл. С примерно следующим содержанием:

[base] base=127.0.0.1:D:\TEMP\SEMPLE.FDB user=SYSDBA password=masterkey

Сохраняем его под именем connect.ini
Скрипт из этого файла будет брать: путь до базы, пользователя базы и его пароль.
Теперь сам код.

-- coding: cp1251 --

import configparser import os import sys import odbc

--- читаем настройки ---

ini_file = os.path.dirname(sys.argv[0]); if ini_file[-1] != os.sep: ini_file = ini_file + os.sep ini_file = ini_file + 'connect.ini'

print('Файл кофигурации: ' + ini_file) if not os.path.exists(ini_file): print('!!! Файл конфигурации не найден.') sys.exit(0)

try: config = configparser.ConfigParser() config.read(ini_file)

if not config.has_section('base'):
    print('В ini файле не обнаружена секция "Base"')
    sys.exit(0)

pBase = {}
list_key = config.options('base')
for key in list_key:
    pBase[key] =config.get('base',key)

except Exception as info: print('!!! Ошибка чтения настроек: ' + str(info)) sys.exit(0)

--- работаем с базой ---

str_connect = "Driver=Firebird/InterBase(r) driver;UID=%s;PWD=%s;DBNAME=%s;" % (pBase['user'],pBase['password'],pBase['base']); print(str_connect) db = odbc.odbc(str_connect)

cursor = db.cursor() cursor.execute("select * from TABLE1") result = cursor.fetchall()

for rows in result: print(str(rows)) db.close();

Как сами видите — большая часть примера — это работа с ini фалом 🙂
Про строку подключения читаем в документации прилагаемой к ODBC. Для другого типа базы она разумеется будет отличатся.