Programując dla mojego klienta, dosyć ciekawą, aplikację serwerową w Pythonie musiałem stworzyć małą klasę, która pobierała odpowiednie dane z pliku tekstowego. Co prawda interesowały mnie tylko dane z poszczególnych linii, ale my skupimy się na czytaniu pliku linia po linii.

Dla uproszczenia tutoriala ucieknę od tłumaczenia co to klasa, i tym samym prezentowany kod będzie od klasy stronił.

W celu załadowania pliku do pamięci(zmiennej) programu korzystamy z funkcji open. Jej pierwszy argument to ścieżka do pliku, który chcemy otworzyć, drugi natomiast to tryb, w naszym wypadku r – czyli read.

Następnie całą treść pliku musimy podzielić przez nową linię („\n”) i wiersze zapisać do tablicy.

Następnie, żeby czytać każdą linię po kolei przygotowujemy pętlę for przez tablicę linii.

Całość będzie wyglądać następująco:

Python nie posiada określonej funkcji, aby sprawdzić, czy zmienna jest zdefiniowana, ponieważ jest założenie, że wszystkie zmienne zostały zdefiniowane przed użyciem. Próba uzyskania dostępu do zmiennej, która nie została wcześniej zdefiniowana będzie pluła wyjątkami.

W pythonie to rzadkość, żeby nie wiedzieć czy dana zmienna jest zdefiniowana. Jeżeli nastąpi już taka sytuacja, że tego nie wiesz możesz to sprawdzić poprzez próbę „try”, która w przypadku niezdefiniowanej zmiennej powinna wznieść wyjątek „NameError”:

To nie wszystko, ponieważ musimy sprawdzić czy wyjątek został wzniesiony prostym warunkiem:

W wielu sytuacjach np. w formularzach wskazane jest korzystanie ze słowników i testów na obecność kluczy przy pomocy metody:

Wstęp

SQLAlchemy jest zestawem pythonowych narzędzi SQL i ORM znacznie pomagającym programiście przy pracy z bazami danych.
Obsługuje następujące bazy danych: MySQL, SQLite, PostgreSQL, Oracle, MS-SQL i Firebird.


Instalacja

Jest kilka sposób instalacji, ze względu na prostotę polecam:
easy_install sqlalchemy
Jeżeli nie korzystasz z konta roota, prawdopodobnie będziesz musiał skorzystać z sudo.
Zastrzegam, że to nie jedyny sposób instalacji (;


ORM

ORM – ang. Object-Relational Mapping co w dosłownym tłumaczeniu znaczy Mapowanie Obiektowo-Relacyjne. Polega to mniej więcej na odwzorowaniu struktury obiektowej na relacyjnej bazie danych.


Pierwszy raz

Mniej więcej wyjaśniliśmy sobie kilka pojęć związanych z SQLAlchemy. Poznaliśmy prostą metodę instalacji i definicję ORM. Posiadając taką wiedzę czas na pokazanie i wytłumaczenie prostego przykładu „w kodzie”. Stwórz plik „przyklad.py„, zamieść w nim zawartość poniższego listingu i zapisz.

Aby uruchomić nasz mały program wpisz w konsolę:
pyhton przyklad.py
Abyśmy mogli operwać na tabelach musieliśmy przypisać je do obiektu MetaData(). Teraz dopiero możemy stworzyć tabelę users. W przykładzie pokazałem dwa sposoby dodawania danych do bazy. Pierwszy pozwala na dodanie pojedyńczego obiektu, natomiast za pomocą drugiego sposobu podajemy listę słowników, żeby dodać wiele obiektów na raz. Jeżeli SQLAlchemy w naszych danych znajdzie się jakiś znak specjalny(np. apostrofę lub średnik) to SQLEngine automatycznie je zasleszuje. Dzięki takiej ochronie, atak SQL Injection staje się praktycznie niemożliwy. W SQLAlchemy pobieranie danych nie stanowi żadnego problemu, żeby pobrać jeden wiersz skorzystałem z funkcji fetchone(), natomiast żeby pobrać wszystkie rekordy na raz skorzystałem z fetchall() i wylistowałem je za pomocą pętli for, której obsługa w pythonie jest wyjątkowo prosta. Pewnie zwróciłeś uwagę to to, że korzystamy z sqlite. Jak już pewnie wiesz to nie jedyna baza obsługiwana przez SQLAlchemy. Poniżej przedstawiam sposoby łączenia się z innymi bazami danych:


Pobieranie danych – szczegółowo

Poświęćmy trochę czasu, aby zbadać różne sposoby pobierania danych z bazy przy pomocy SQLAlchemy, które skracają czas pracy i pomagają programiście tworzyć zaawansowane zapytania z klauzulami WHERE, AND, OR itd. Na początek stwórzmy plik „pobieranie.py„.


Order By, Limit i inne takie

Pobierając dane z bazy, zazwyczaj chcemy żeby były one odpowiednio posortowane. W takich przypadkach z pomocą przychodzą do nas Order by, Limit itp.


Delete

Czasami nie tylko chcemy pobierać dane, ale chcemy je usuwać. Tu z pomocą wkracza obiekt delete().


Update

Oprócz usuwania często chcemy coś poprawić lub zamienić w naszych rekordach. Pomoże nam w tym obiekt update().


JOIN czyli łączenie tabel

Wielokrotnie spotykamy się z problemem struktury bazy danych. Np. Trzymania w innej tabeli adresów zamieszkania naszych „userów”. Na początek stwórzmy sobie nowy plik „jointest.py” i wypełnij go poniższą zawartością:

i wykonaj takie polecenie:
python jointest.py


Obiekt bindparam()

W SQLAlchemy możesz sam „zbindować„(określić) inną nazwę dla istniejącej nazwy jakiejś kolumny i korzystać z takiego „binda” wielokrotnie w swoich zapytaniach do bazy. Brzmi to strasznie, ale wytłumaczenie tego słowami ( przynajmniej dla mnie ) jest stosunkowo trudne, dlatego zapraszam do zajrzenia do kodu:

Mam nadzieję, że jakoś to pojęliście (: Dokumentacja


Union

Union służy do łączenia wyników selectów ( nie pokaże powtarzających się wierszy ):


Podsumowanie

SQLAlchemy to narzędzie proste, szybkie i wygodne, przyspieszające pracę programisty, który nie musi się już zamartwiać długimi zapytaniami z JOIN itp. Zdecydowanie POLECAM!( zwłaszcza do pracy z Pylonsem )


Źródła wiedzy