Выполнение 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. Вы можете выбрать и другую.

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

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

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

ссылка на оригинал статьи http://habrahabr.ru/post/203742/


Комментарии

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

Ваш адрес email не будет опубликован. Обязательные поля помечены *