Web2py - warstwa abstrakcji bazy danych
Plik Database Abstraction Layer (DAL)jest uważany za główną mocną stronę web2py. DAL udostępnia prosty interfejs programowania aplikacji (API) do podstawowej składni języka SQL.
W tym rozdziale poznamy nietrywialne zastosowania DAL, takie jak budowanie zapytań do efektywnego wyszukiwania według tagów i budowanie hierarchicznego drzewa kategorii.
Niektóre ważne cechy DAL to -
Platforma web2py zawiera warstwę abstrakcji bazy danych (DAL), interfejs API, który mapuje obiekty Pythona na obiekty bazy danych. Obiekty bazy danych mogą być zapytaniami, tabelami i rekordami.
DAL dynamicznie generuje kod SQL w czasie rzeczywistym przy użyciu określonego dialektu zaplecza bazy danych, dzięki czemu programista nie musi pisać pełnego zapytania SQL.
Główną zaletą korzystania z DAL jest to, że aplikacje będą przenośne z różnymi rodzajami baz danych.
Pierwsze kroki z DAL
Większość aplikacji w web2py wymaga połączenia z bazą danych. Dlatego zbudowanie modelu bazy danych jest pierwszym krokiem w projektowaniu aplikacji.
Rozważmy nowo utworzoną aplikację o nazwie “helloWorld”. Baza danych jest realizowana w ramach Modele aplikacji. Wszystkie modele dla danej aplikacji są zawarte w pliku o nazwie -models/db_custom.py.
Poniższe kroki służą do implementacji DAL -
Krok 1 - Konstruktor DAL
Ustanów połączenie z bazą danych. Jest to tworzone za pomocą obiektu DAL, który jest również nazywany konstruktorem DAL.
db = DAL ('sqlite://storage.sqlite')
Godną uwagi cechą DAL jest to, że umożliwia wiele połączeń z tą samą bazą danych lub z różnymi bazami danych, nawet z różnymi typami baz danych. Zauważono, że ta linia jest już w plikumodels/db.py. Dlatego możesz go nie potrzebować, chyba że go usunąłeś lub musisz połączyć się z inną bazą danych. Domyślnie web2py łączy się z bazą danych SQLite przechowywaną w plikustorage.sqlite.
Ten plik znajduje się w folderze baz danych aplikacji. Jeśli plik jest nieobecny, jest tworzony przez web2py podczas pierwszego uruchomienia aplikacji.
SQLite jest szybki i przechowuje wszystkie dane w jednym pliku. Oznacza to, że Twoje dane mogą być łatwo przenoszone z jednej aplikacji do drugiej. W rzeczywistości bazy danych SQLite są pakowane przez web2py razem z aplikacjami. Zapewnia pełną obsługę języka SQL, w tym tłumaczenia, łączenia i agregacje.
SQLite ma dwie wady.
Jednym z nich jest to, że nie wymusza typów kolumn i nie ma ALTER TABLE z wyjątkiem dodawania i usuwania kolumn.
Inną wadą jest to, że cała baza danych jest zablokowana przez każdą transakcję wymagającą dostępu do zapisu.
Krok 2 - Konstruktor tabeli
Po nawiązaniu połączenia z bazą danych możemy skorzystać z rozszerzenia define_table metoda definiowania nowych tabel.
Na przykład -
db.define_table('invoice',Field('name'))
Powyższa metoda jest również używana w konstruktorze tabel. Składnia konstruktora tabeli jest taka sama. Pierwszym argumentem jest nazwa tabeli, po której następuje listaField(s). Konstruktor pola przyjmuje następujące argumenty -
Sr.No | Argumenty i użycie |
---|---|
1 | The field name Nazwa pola w tabeli. |
2 | The field type przyjmuje wartości o dowolnym typie danych, takim jak string (domyślnie), text, boolean, integer i tak dalej. |
3 | Length Określa maksymalną długość. |
4 | default = None Jest to wartość domyślna po wstawieniu nowego rekordu. |
5 | update = None Działa to tak samo, jak domyślne, ale wartość jest używana tylko przy aktualizacji, a nie przy wstawianiu. |
6 | Notnull Określa, czy wartość pola może mieć wartość NULL, czy nie. |
7 | readable = True Określa, czy pole można odczytać w formularzach, czy nie. |
8 | writable = True Określa, czy pole jest zapisywalne w formularzach, czy nie. |
9 | label = "Field Name" To jest etykieta, która ma być używana w tym polu w formularzach. |
Plik define_table metoda przyjmuje również trzy nazwane argumenty -
Składnia
db.define_table('....',migrate=True, fake_migrate=False, format = '%(id)s')
migrate = True - To instruuje web2py, aby utworzyć tabelę, jeśli nie istnieje, lub zmienić ją, jeśli nie jest zgodna z definicją modelu.
fake_migrate = False - Jeśli model pasuje do zawartości tabeli bazy danych, ustaw fake_migrate = True, co pomoże web2py odbudować dane.
format = '%(id)s' - Jest to ciąg formatu, który określa sposób reprezentacji rekordów w danej tabeli.
Generowanie surowego kodu SQL
Korzystając z DAL, możemy nawiązać połączenie z bazą danych i utworzyć nowe tabele i ich pola za pomocą konstruktora tabel i konstruktora pól.
Czasami konieczne jest wygenerowanie instrukcji SQL, aby były zgodne z niezbędnymi danymi wyjściowymi. Platforma web2py zawiera różne funkcje, które pomagają w generowaniu surowego kodu SQL, które są podane w następujący sposób -
_wstawić
Pomaga w pobieraniu instrukcji insertowych dla danej tabeli. Na przykład,
print db.person._insert(name ='ABC')
Pobierze instrukcję wstawiania dla tabeli o nazwie „osoba”.
Wyjście instrukcji SQL -
INSERT INTO person(name) VALUES ('ABC');
_liczyć
Pomaga w pobieraniu instrukcji SQL, która podaje liczbę rekordów. Na przykład rozważmy tabelę o nazwie „osoba” i musimy znaleźć liczbę osób o imieniu „ABC”.
print db(db.person.name ==' ABC ')._count()
Wyjście instrukcji SQL -
SELECT count(*) FROM person WHERE person.name = ' ABC ';
_Wybierz
Pomaga w pobieraniu wybranych instrukcji SQL. Na przykład rozważmy tabelę o nazwie „osoba” i musimy znaleźć listę osób o imieniu „ABC”.
print db(db.person.name == ' ABC ')._select()
Wyjście instrukcji SQL -
SELECT person.name FROM person WHERE person.name = ' ABC ';
_usunąć
Pomaga w pobieraniu pliku delete SQLsprawozdania. Na przykład rozważ tabelę o nazwie „osoba” i musimy usunąć instrukcje o nazwie „ABC”
print db(db.person.name == ' ABC ')._delete()
Wyjście instrukcji SQL -
DELETE FROM person WHERE person.name = ' ABC ';4
_aktualizacja
Pomaga w pobieraniu zaktualizowanych instrukcji SQL. Na przykład weźmy pod uwagę tabelę o nazwie „osoba” i musimy zaktualizować nazwę kolumny o inną wartość.
print db(db.person.name == ' ABC ')._update()
Wyjście instrukcji SQL -
UPDATE person SET WHERE person.name = ’Alex’;
Problemy z DAL (Gotchas)
SQLite
SQLite nie obsługuje usuwania lub zmieniania kolumn. Usunięcie pola z tabeli powoduje, że pozostaje ono aktywne w bazie danych, przez co web2py nie będzie wiedział o żadnych wprowadzonych zmianach.
W takim przypadku konieczne jest ustawienie fake_migrate = True co pomoże przedefiniować metadane, tak aby wszelkie zmiany, takie jak zmiana lub usunięcie, pozostały pod kontrolą web2py.
SQLite nie obsługuje typów logicznych. W tym celu web2py wewnętrznie odwzorowuje wartości logiczne na jeden ciąg znaków, przy czym „T” i „F” reprezentujątrue i False odpowiednio.
MySQL
MySQL nie obsługuje funkcji ALTER TABLE. W związku z tym migracja bazy danych obejmuje wiele zatwierdzeń. Sytuacji tej można uniknąć, ustawiając parametrfake_migrate = True podczas definiowania bazy danych, która zachowa wszystkie metadane.
Wyrocznia
Oracle nie obsługuje funkcji paginacji rekordów. Brakuje również obsługi słów kluczowych OFFSET lub limit. W tym celu web2py osiąga paginację za pomocą złożonego, trójstronnego zagnieżdżonego wyboru DAL. DAL musi samodzielnie obsługiwać paginację, jeśli była używana baza danych Oracle.