...

среда, 27 ноября 2013 г.

[Из песочницы] Выполнение SQL запросов в DB Oracle в Sublime Text 2

Надеюсь всем хорошо знаком популярный редактор Sublime Text 2. Хочу поделиться опытом, как я смог облегчить себе жизнь, написав плагин для быстрого вызова запросов в BD Oracle прямо из редактора, просто выделив запрос и нажав комбинацию.



Любимый нами за быстроту, легкость и кросс-платформенность Sublime Text богат огромным количеством расширений, т. н. пакетов и плагинов на любой вкус и цвет. Но плагина для вызова SQL запросов я не нашел (если я не прав, то буду рад если поделитесь). Ну чтож, нету — не беда, напишем свой.

Почитав документацию и посмотрев пару примеров приступим.


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


Первым делом создаем новый плагин Tools -> New plugin



import sublime, sublime_plugin

class ExampleCommand(sublime_plugin.TextCommand):
def run(self, edit):
self.view.insert(edit, 0, "Hello, World!")




Сразу сохраняем его под именем под именем Oquery.py, но Sublime предлжит нам его сохранить в папке User, но мы сохраним его на уровень выше в папку Packages в собственной для него папке Oquery.

Для общения с базой нам нужен класс cx_Oracle. Скачиваем и возвращаемся в нашу папку OQuery и создаем в ней папку lib, в которой мы будем хранить необходимые библиотеки. В ней мы сохраним скачаный архив в папке cx_Oracle.


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


Для хранения настроек базы нам необходим конфигурационный файл Oquery.sublime-settigs. Создаем его и сохраняем в корневой папке нашего плагина с содержанием (пример):



{
"host" : "localhost",
"port" : 1521,
"dbname" : "demoDB",
"username" : "user1",
"password" : "pass"
}




Теперь у нас все есть приступаем к написанию самого плагина.

В верху файла объявляем кодировку и импортируем нужные нам модули, в том числе и сам коннектор к базе и библиотеку вывода табличек



# coding=utf-8

import sys
import os
sys.path.append(os.path.dirname(sys.executable))
sys.path.append(os.path.join(os.path.dirname(__file__), "lib","cx_Oracle"))
sys.path.append(os.path.join(os.path.dirname(__file__), "lib","prettytable"))
import sublime
import sublime_plugin
import cx_Oracle
import unicodedata
import prettytable


Строки



sys.path.append(os.path.join(os.path.dirname(__file__), "lib","cx_Oracle"))
sys.path.append(os.path.join(os.path.dirname(__file__), "lib","prettytable"))




Говорит сублайму где искать наши библиотеки. При подключении prettytable Sublime у меня ругался на отсутствие модуля unicodedata, и простое импортирование его от ошибки не избавляло, так как в Sublime есть баг, благодаря которому сублайм не знает где расположен тот самый модуль unicodedata. Не много погуглив я нашел решение добавив строчку

sys.path.append(os.path.dirname(sys.executable))




И проблема решается.

Приступаем к самой команде



class OqueryCommand(sublime_plugin.TextCommand):
def run(self, edit):
# получаем объект view
view = self.view
# получаем массив координат выделенной области
region = view.sel()[0]
if not region.empty():
# если не пустой, вырезаем сам текст запроса
selection = view.substr(region)
try:
# В этом классе находятся все наши настройки из файла Oquery.sublime-settings
settings = sublime.load_settings('Oquery.sublime-settings')
# подключаемся к базе
db = cx_Oracle.connect(str(settings.get('username')), str(settings.get('password')), settings.get('host')+':'+str(settings.get('port'))+'/'+settings.get('dbname'))
except cx_Oracle.DatabaseError, e:
sublime.message_dialog(str(e))
else:
# создаем курсор
cursor = db.cursor()
try:
# и выполняем запрос
cursor.execute(selection)
except cx_Oracle.DatabaseError, e:
sublime.message_dialog(str(e))
else:
# обявляем класс нашей таблицы и кормим ей наш курсор
pt = prettytable.from_db_cursor(cursor)
# переводим все в строку
tableStr = pt.get_string()
# создаем новое окно
output = view.window().new_file();
# и отдаем ему весь результат
output.insert(edit, 0, tableStr)
else:
sublime.message_dialog('Select a proper SQL query')




Вот и все. но еще нам нужно объявить комбинацию для вызова нашей команды. Делается это очень просто Preferences -> Key Bindings User. И добавляем в него одну строчку

[
{ "keys": ["ctrl+o", "ctrl+r"], "command": "oquery" }
]




Наш плагин будет работать по комбинации (ctrl+o)+r. Вы можете выбрать и другую.

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


При желании вы можете переделать все на любую другую базу данных.


Кому лень, прилагаю архив


This entry passed through the Full-Text RSS service — if this is your content and you're reading it on someone else's site, please read the FAQ at fivefilters.org/content-only/faq.php#publishers.


Комментариев нет:

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