Выполнение SQL запросов в DB Oracle в Sublime Text 2

в 2:41, , рубрики: python, метки: ,

Надеюсь всем хорошо знаком популярный редактор 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. Вы можете выбрать и другую.

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

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

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

Автор: m0rjjj

Источник


* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js