Надеюсь всем хорошо знаком популярный редактор Sublime Text 2. Хочу поделиться опытом, как я смог облегчить себе жизнь, написав плагин для быстрого вызова запросов в BD Oracle прямо из редактора, просто выделив запрос и нажав комбинацию.
Любимый нами за быстроту, легкость и кросс-платформенность Sublime Text богат огромным количеством расширений, т. н. пакетов и плагинов на любой вкус и цвет. Но плагина для вызова SQL запросов я не нашел (если я не прав, то буду рад если поделитесь). Ну чтож, нету — не беда, напишем свой.
Почитав документацию и посмотрев пару примеров приступим.
Плагин будет работать очень просто: выделил запрос, нажал комбинацию и в новом окне появится результат.
Первым делом создаем новый плагин Tools -> New plugin
Сразу сохраняем его под именем под именем Oquery.py, но Sublime предлжит нам его сохранить в папке User, но мы сохраним его на уровень выше в папку Packages в собственной для него папке Oquery.
Для общения с базой нам нужен класс cx_Oracle. Скачиваем и возвращаемся в нашу папку OQuery и создаем в ней папку lib, в которой мы будем хранить необходимые библиотеки. В ней мы сохраним скачаный архив в папке cx_Oracle.
Я хочу чтобы ответ запроса был предоставлен в виде симпатичных таблиц, и для этого уже есть подходящий для нас плагин. Проделываем все то же самое: скачиваем, распаковываем и переименовываем папку в prettytable.
Для хранения настроек базы нам необходим конфигурационный файл Oquery.sublime-settigs. Создаем его и сохраняем в корневой папке нашего плагина с содержанием (пример):
Теперь у нас все есть приступаем к написанию самого плагина.
В верху файла объявляем кодировку и импортируем нужные нам модули, в том числе и сам коннектор к базе и библиотеку вывода табличек
Строки
Говорит сублайму где искать наши библиотеки. При подключении prettytable Sublime у меня ругался на отсутствие модуля unicodedata, и простое импортирование его от ошибки не избавляло, так как в Sublime есть баг, благодаря которому сублайм не знает где расположен тот самый модуль unicodedata. Не много погуглив я нашел решение добавив строчку
И проблема решается.
Приступаем к самой команде
Вот и все. но еще нам нужно объявить комбинацию для вызова нашей команды. Делается это очень просто Preferences -> Key Bindings User. И добавляем в него одну строчку
Наш плагин будет работать по комбинации (ctrl+o)+r. Вы можете выбрать и другую.
Вот и все теперь мы выделяем любой запрос и легким нажатием клавиш, мы получаем ответ в новом окне. Не правда ли замечательно?
При желании вы можете переделать все на любую другую базу данных.
Кому лень, прилагаю архив
Любимый нами за быстроту, легкость и кросс-платформенность 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. Вы можете выбрать и другую.
Вот и все теперь мы выделяем любой запрос и легким нажатием клавиш, мы получаем ответ в новом окне. Не правда ли замечательно?
При желании вы можете переделать все на любую другую базу данных.
Кому лень, прилагаю архив