Creativity | Reliability | Innovations

pysql-console: Emulator konsoli użytkownika

Jakiś czas temu zacząłem pracować nad aplikacją konsolową opartą na języku Python. Głównym założeniem programu jest zapewnienie komunikacji użytkownika z serwerem MS SQL oraz wykonywanie przez niego operacji CRUD. W dalszej części wpisu omówię podstawowe funkcje programu, plany rozwoju aplikacji, a także sam proces powstawania tego mini-projektu.

Link do repozytorium: https://github.com/jsarnowski96/pysql-console

                        _____   __ __   __  _      ___ __  __  _   __   __  _   ___  
                       | _,\ `v' /' _/ /__\| | __ / _//__\|  \| |/' _/ /__\| | | __| 
                       | v_/`. .'`._`.| \/ | ||__| \_| \/ | | ' |`._`.| \/ | |_| _|  
                       |_|   !_! |___/ \_V_\___|  \__/\__/|_|\__||___/ \__/|___|___|
                                                                            v.0.3.0

O ile w większości przypadków skrypty w pythonie wykonuje się za pośrednictwem dedykowanego polecenia python lub py, wykorzystującego sys.args do obsługi opcjonalnych parametrów, zależało mi na tym, aby po wywołaniu głównego skryptu, pseudo-powłoka użytkownika została podtrzymana aż do momentu zakończenia działania aplikacji. W ten sposób po uruchomieniu pysql-console użytkownik zostaje odseparowany od powłoki systemowej i ma do swojej dyspozycji zestaw dedykowanych poleceń i operatorów, niezależnych od systemu operacyjnego, co przekłada się na możliwość prowadzenia interakcji z bazą danych zarówno na systemach z rodziny Windows jak i Linux.

Obecnie pysql-console wspiera następujące operacje:

  • autoryzacja użytkownika za pośrednictwem mechanizmu SQL Server Authentication
  • nawiązywanie i zamykanie połączenia z bazą danych
  • odczyt danych z wybranej tabeli
  • listing tabeli w bazie
  • usuwanie elementów z tabeli
  • wykonanie operacji SELECT wprowadzonej bezpośrednio do konsoli przez użytkownika
  • wyświetlanie elementów globalnej tablicy ustawień sesji użytkownika (uid, pwd, identyfikatory połączeń z bazą, etc.)
  • eksport wybranej tabeli do pliku CSV i XML z zachowaniem struktury tagów
  • import danych z pliku CSV do bazy
  • usuwanie tabel
  • listing dostępnych poleceń wsadowych
  • rozbudowana obsługa błędów – system przekierowań do akcji nadrzędnych, metody fallback zapobiegające zakończeniu działania aplikacji w przypadku wystąpienia nieznanego błędu, interaktywny tryb poleceń

Planowane funkcjonalności:

  • pełna integracja z CRUD
  • import danych z CSV
  • implementacja polecenia drop
  • konwerter SQL-XML
  • obsługa poleceń systemowych
  • integracja z innymi silnikami bazodanowymi, takimi jak MariaDB, MySQL, PostreSQL etc.

Przykład działania trybu interaktywnego polecenia export (przy braku połączenia z bazą):

js $ export users
There is no connection established. Redirecting to connect action...

Server name: localhost
Database: test_db
Successfully connected to the localhost->test_db

js $ export
users.csv export task finished successfully.

js $

Struktura plików i opis metod zależnych:

  • pysqlconsole.py – główny skrypt emulujący linię poleceń oraz wysyłający żądania do wskazanych przez użytkownika akcji zdefiniowanych w commands.py
    • drawInitBoard() – renderuje logo aplikacji
    • UserAuthentication() – metoda przeprowadzająca proces autoryzacji użytkownika z bazą danych. Wyświetla także monit o podanie nazwy użytkownika i hasła
    • InputHandler() – metoda obsługująca dane wprowadzane przez użytkownika i wysyłająca żądania do commands.py
    • MainActivity() – metoda przyjmująca dane od użytkownika. Wywołuje metodę InputHandler()
    • Startup() – główna metoda wywołująca wszystkie metody zależne w ściśle określonej sekwencji. Trzon emulatora pysql-console
  • commands.py – zawiera definicje wszystkich poleceń oraz metod z nimi związanych. Wykonuje operacje bezpośrednio związane z przetwarzaniem danych, obsługą połączeń SQL etc.
    • Exit()
    • Connect()
    • Close()
    • Logout()
    • Show()
    • Add()
    • Edit()
    • Drop()
    • List()
    • Import()
    • Delete()
    • Databases()
    • DataAnalysis()
    • Metrics()
    • Query()
    • Export()
    • Clear()
    • Status()
    • Switch()
    • Help()
  • settings.py – zawiera definicję obiektu global_config_array, do którego wstrzykiwane są informacje o bieżącej sesji użytkownika, aktywnych połączeniach z bazą, etc. Korzysta z niego zarówno pysql-console.py, jak i commands.py

Lista dostępnych poleceń:

  • add <table> – interaktywna komenda pozwalająca na wprowadzanie danych do wybranej tabeli
  • clear – czyści okno konsoli
  • close – zamyka aktywne połączenie z bazą danych
  • connect <server> <database> – otwiera połączenie ze wskazanym serwerem. Jako parametry opcjonalne przyjmuje nazwę/adres serwera oraz nazwę samej bazy. W przypadku gdy użytkownik nie poda żadnej z tych informacji lub wskaże tylko jedną z nich, metoda Connect() zażąda przekazania brakujących zestawów danych.
  • da <file_name> <param1> <param2> – polecenie odpowiedzialne za przeprowadzanie operacji związanych z Analizą Danych
  • databases – przeprowadza listing baz danych na danej instancji serwera MS SQL
  • delete – usuwa wybrany element z tabeli na podstawie podanego numeru ID
  • drop <table> – usuwa wskazaną tabelę z bazy
  • edit <table> <rowId> – pozwala na edycję istniejącego rekordu we wskazanej tabeli
  • exit – kończy działanie programu oraz zwalnia zasoby z global_config_array
  • export <table> – eksportuje wskazaną tabelę do pliku CSV. Jeżeli wartość global_config_array["table"] została wcześniej zmieniona, to w przypadku niepodania nazwy tabeli, zostanie ona automatycznie odczytana z ww. pola. Jeżeli natomiast zostanie przekazany parametr, to eksport nastąpi w oparciu o zmienną lokalną table.
  • help – wyświetla listę dostępnych poleceń
  • import <table> <filename> – importuje dane ze wskazanego pliku (z pominięciem rozserzenie .csv) do tabeli docelowej.
  • list – zwraca listę tabeli w wybranej bazie danych (z pominięciem tabeli systemowych)
  • logout – zamyka połączenie z bazą danych i przełącza widok na panel logowania
  • metrics – wyświetla podstawowe informacje o obciążeniu procesora i zużyciu pamięci RAM przez instancję serwera MS SQL
  • query – pozwala na wykonanie dowolnej kwerendy SELECT, pozwalającej na personalizację widoku wybranej tabeli
  • show <table> – wyświetla zawartość aktywnej tabeli. Jeżeli global_config_array["table"] posiada wartość None, to polecenie zażąda od użytkownika podania nazwy tabeli. W przeciwnym przypadku pobierze nazwę tabeli bezpośrednio z ww. pola. Jeżeli użytkownik podał nazwę tabeli jako parametr opcjonalny, to priorytet ma wówczas zmienna table wstrzykiwana do metody Show()
  • status – zwraca informacje o bieżącej sesji użytkownika oraz informacje o aktywnych połączeniach z bazą oraz zmiennych globalnych.
  • switch <table> – przełącza użytkownika pomiędzy tabelami. W przypadku podania nazwy tabeli podczas wywołania polecenia switch, wartość pola global_config_array["table"] zostanie przez nią nadpisana. W przeciwnym wypadku zostanie zastąpiona wartością None

Wymagania:

  • Python 3.x
  • biblioteki:
    • pyodbc
    • tabulate
    • getpass
    • pandas
    • inspect
  • skonfigurowane konto użytkownika na docelowej bazie danych oraz włączenie opcji SQL Server and Windows Authentication mode.
  • przed uruchomieniem aplikacji należy skonfigurować metodę UserAuthentication(), w której zdefiniowane jest połączenie autoryzujące z bazą danych. Można w niej zdefiniować zarówno nazwę instancji serwera jak i port docelowy, na którym będziemy się chcieli połączyć z bazą. Poniżej znajduje się wzór konfiguracji połączenia:
dbConnection = pyodbc.connect('Driver={ODBC Driver 17 for SQL Server};'
                              'Server=;'
                              'Database=;'
                              'uid='+username+';'
                              'pwd='+password+';'
                              'Trusted_Connection=no;')  
0 0 votes
Article Rating
Subscribe
Powiadom o

Witryna wykorzystuje Akismet, aby ograniczyć spam. Dowiedz się więcej jak przetwarzane są dane komentarzy.

0 komentarzy
Inline Feedbacks
View all comments
0
Would love your thoughts, please comment.x