<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="pl">
	<id>http://brain.fuw.edu.pl/edu/index.php?action=history&amp;feed=atom&amp;title=%2FPythonDBAPI</id>
	<title>/PythonDBAPI - Historia wersji</title>
	<link rel="self" type="application/atom+xml" href="http://brain.fuw.edu.pl/edu/index.php?action=history&amp;feed=atom&amp;title=%2FPythonDBAPI"/>
	<link rel="alternate" type="text/html" href="http://brain.fuw.edu.pl/edu/index.php?title=/PythonDBAPI&amp;action=history"/>
	<updated>2026-04-13T09:04:18Z</updated>
	<subtitle>Historia wersji tej strony wiki</subtitle>
	<generator>MediaWiki 1.34.1</generator>
	<entry>
		<id>http://brain.fuw.edu.pl/edu/index.php?title=/PythonDBAPI&amp;diff=2034&amp;oldid=prev</id>
		<title>Jarekz: Utworzono nową stronę &quot;= TI:WTBD/PythonDBAPI =  Podjęto próbę pewnej standaryzacji interfejsu programistycznego (API) pozwalającego na korzystanie z relacyjnych (SQL-owych) baz danych...&quot;</title>
		<link rel="alternate" type="text/html" href="http://brain.fuw.edu.pl/edu/index.php?title=/PythonDBAPI&amp;diff=2034&amp;oldid=prev"/>
		<updated>2015-05-23T14:49:29Z</updated>

		<summary type="html">&lt;p&gt;Utworzono nową stronę &amp;quot;= &lt;a href=&quot;/edu/index.php/TI:WTBD&quot; title=&quot;TI:WTBD&quot;&gt;TI:WTBD&lt;/a&gt;/PythonDBAPI =  Podjęto próbę pewnej standaryzacji interfejsu programistycznego (API) pozwalającego na korzystanie z relacyjnych (SQL-owych) baz danych...&amp;quot;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Nowa strona&lt;/b&gt;&lt;/p&gt;&lt;div&gt;= [[TI:WTBD]]/PythonDBAPI =&lt;br /&gt;
&lt;br /&gt;
Podjęto próbę pewnej standaryzacji interfejsu programistycznego (API) pozwalającego na korzystanie z relacyjnych (SQL-owych) baz danych z poziomu programów w Pythonie. Oczywistym celem jest ułatwienie tworzenia programów, które minimalnym wysiłkiem programisty dałoby się zaadaptować do współpracy z różnymi systemami bazodanowymi. Nie ma co się łudzić, że da się to osiągnąć w ogóle bez trudu -- standaryzacja API jest tylko jednym z warunków. Trzeba brać pod uwagę choćby różnice w dialektach SQL.&lt;br /&gt;
&lt;br /&gt;
Zadania, jakie spełnia DB API to:&lt;br /&gt;
* nawiązanie komunikacji z bazą&lt;br /&gt;
** w przypadku SQLite to po prostu podanie nazwy pliku do otwarcia, i ewent. opcjonalnych parametrów ,,połączenia&amp;quot;&lt;br /&gt;
** dla systemów klient-serwer jest to nawiązanie połączenia sieciowego i dokonanie autoryzacji (w sposób specyficzny dla danego systemu)&lt;br /&gt;
* umożliwienie przekazywania poleceń SQL do silnika bazy&lt;br /&gt;
* odbiór wyników zapytań ewent. informacji o wykonaniu poleceń DDL i DML&lt;br /&gt;
* różne inne zadania np. sterowanie transakcjami, pobieranie metadanych&lt;br /&gt;
** takie zadania ,,różne&amp;quot; bywają różnie zrealizowane w różnych systemach&lt;br /&gt;
&lt;br /&gt;
Specyfikacja DB API jest przedmiotem dokumentu PEP (''Python Enhancement Proposal'') nr 249: [http://www.python.org/dev/peps/pep-0249/].&lt;br /&gt;
&lt;br /&gt;
Główne klasy definiowane w DB API to:&lt;br /&gt;
* połączenie (''Connection'')&lt;br /&gt;
* kursor (''Cursor'')&lt;br /&gt;
&lt;br /&gt;
DB API definiuje również hierarchię typów wyjątków, które służą przekazywaniu informacji o zajściu błędów oraz ostrzeżeń. Najczęstszy to ''ProgrammingError'', powstający w wyniku np. błędnej składni polecenia SQL, przekazania niewłaściwej liczby parametrów polecenia, itp. Jest to podklasa ''DatabaseError'', która z kolei dziedziczy od ''Error''. Ostrzeżenia tworzą osobną klasę ''Warning'' i powstają np. w sytuacji niepełnego zapisu danych wynikającego z właściwości danego systemu BD.&lt;br /&gt;
&lt;br /&gt;
== ''Connection'' ==&lt;br /&gt;
Obiekt klasy ''Connection'' otrzymuje się jako wynik wywołania funkcji ''connect(...)'', której argumenty (parametry połączenia) zależą od specyfiki danego systemu (ścieżka do pliku dla SQLite; adres sieciowy, ew. nr portu, dane autoryzacyjne -- dla systemów klient-serwer). Metody połączenia to:&lt;br /&gt;
; ''.close()''&lt;br /&gt;
: po zamknięciu połączenia nie da się go dalej wykorzystywać ani wznowić, należy w razie potrzeby utworzyć nowe, wywołując konstruktor ''connect()''. Nieważne są również wszystkie kursory związane z zamkniętym połączeniem. ''Jeżeli w momencie wywołania ''.close()'' była otwarta transakcja, nastąpi jej wycofanie (ROLLBACK).''&lt;br /&gt;
; ''.commit()''&lt;br /&gt;
: zatwierdzenie aktualnej transakcji. Jeśli baza nie wspiera transakcji, metoda ta nie zgłasza błędu, tylko nic nie robi.&lt;br /&gt;
; ''.rollback()''&lt;br /&gt;
: wycofanie aktualnej transakcji. Jeśli operacja ta jest niewspierana, powinien zostać rzucony wyjątek. Dla modułów nie wspierających transakcji w ogóle, może to być ''AttributeError'' (metoda nie istnieje).&lt;br /&gt;
; ''.cursor()''&lt;br /&gt;
: konstruktor obiektu klasy ''Cursor''.&lt;br /&gt;
&lt;br /&gt;
== ''Cursor'' ==&lt;br /&gt;
Obiekt klasy ''Cursor'' jest przede wszystkim ,,pojemnikiem&amp;quot; na wyniki zapytania lub innego polecenia i związane z nimi metadane. Atrybuty i metody:&lt;br /&gt;
; ''.description''&lt;br /&gt;
: atrybut (tylko do odczytu) opisujący kolumny zbioru wynikowego, w postaci sekwencji, której elementami są sekwencje 7-elementowe. Najważniejsze z tych 7 elementów to dwa pierwsze: nazwa i kod typu danych. Jeśli kursor nie ,,zawiera&amp;quot; żadnego zbioru wynikowego, atrybut ten ma wartość ''None''.&lt;br /&gt;
; ''.rowcount''&lt;br /&gt;
: atrybut (tylko do odczytu) którego wartością jest liczba wierszy zbioru wynikowego, lub wierszy tabeli zmienionych o ile ostatnią operacją było polecenie DML. Jeśli liczba ta nie jest możliwa do ustalenia, wartością jest -1.&lt;br /&gt;
; ''.callproc(nazwa, parametry ...)''&lt;br /&gt;
: wywołanie procedury składowanej (metoda opcjonalna)&lt;br /&gt;
; ''.close()''&lt;br /&gt;
: zamknięcie kursora (nie połączenia), zwolnienie zajmowanych zasobów&lt;br /&gt;
; ''.execute(polecenie[, parametry])''&lt;br /&gt;
: przesłanie polecenia SQL, ewent. sparametryzowanego. Parametry podaje się w postaci sekwencji lub słownika (mapowania), w zależności od dostępnego mechanizmu wiązania parametrów. Jest 'zdecydowanie' rekomendowane wykorzystanie poleceń sparametryzowanych, a nie -- każdorazowe konstruowanie pełnego tekstu polecenia SQL (wraz z wartościami parametrów) za pomocą operacji na napisach. Daje to korzyści zarówno na poziomie optymalizacji, jak i bezpieczeństwa. Ma to zwłaszcza znaczenie przy operacjach wielokrotnie powtarzanych z różnymi zestawami parametrów (np. masowe wstawianie danych do tabeli). Należy wówczas wielokrotnie korzystać z tego samego kursora. Wartość zwracana przez tę metodę jest nieokreślona.&lt;br /&gt;
; ''.executemany(polecenie, sekwencja_z_parametrami)''&lt;br /&gt;
: wielokrotnie to samo polecenie SQL z różnymi zestawami parametrów. Jeśli poleceniem jest zapytanie zwracające zbiór wynikowy, wynik jest nieokreślony -- może nim być rzucenie wyjątku.&lt;br /&gt;
; ''.fetchone()''&lt;br /&gt;
: pobrać kolejny wiersz aktualnego zbioru wynikowego, zwraca ''None'' jeśli nie ma już nic do pobrania (zbiór wynikowy został wyczerpany). Rzuci wyjątkiem ''Error'', jeśli poprzednio wywołane polecenie nie zwróciło zbioru wynikowego (a w szczególności, gdy aktualnym kursorem nie wywołano jeszcze żadnego polecenia).&lt;br /&gt;
; ''.fetchmany([size=cursor.arraysize])''&lt;br /&gt;
: pobrać max. ''size'' kolejnych wierszy aktualnego zbioru wynikowego, jako sekwencję. Poza tym uwagi jw.&lt;br /&gt;
; ''.fetchall()''&lt;br /&gt;
: pobrać wszystkie (pozostałe) wiersze aktualnego zbioru wynikowego, jako sekwencję.&lt;br /&gt;
; ''.nextset()''&lt;br /&gt;
: niektóre systemy BD implementują kursory będące uchwytami do wielu zbiorów wynikowych równocześnie, ta metoda (opcjonalna) powoduje przejście do kolejnego zbioru wynikowego, zwracając ''None'' jeśli zbiory wynikowe zostały wyczerpane.&lt;br /&gt;
; ''.arraysize''&lt;br /&gt;
: atrybut modyfikowalny, ustalający domyślną liczbę wierszy pobieranych przez ''.fetchmany()''.&lt;br /&gt;
; ''.setinputsizes(sizes), .setoutputsize(size[, nr_kolumny])''&lt;br /&gt;
: (często puste) metody związane z ,,tuningowaniem&amp;quot; zarządzania pamięcią przez moduł, rzadko wykorzystywane.&lt;br /&gt;
; ''.next(), .__iter__()''&lt;br /&gt;
: metody pozwalające traktować kursor jako iterator (po wierszach zbioru wynikowego). W specyfikacji wymienione jako opcjonalne rozszerzenia, ale w zasadzie już standardowe.&lt;br /&gt;
&lt;br /&gt;
== Atrybuty modułu ==&lt;br /&gt;
; ''connect(...)''&lt;br /&gt;
: konstruktor połączenia&lt;br /&gt;
; ''apilevel''&lt;br /&gt;
: wersja specyfikacji DP API, możliwe wartości: &amp;quot;1.0&amp;quot; (przestarzała), &amp;quot;2.0&amp;quot;&lt;br /&gt;
; ''threadsafety''&lt;br /&gt;
: poziom wielowątkowości, wartości z ''range(4)''&lt;br /&gt;
; ''paramstyle''&lt;br /&gt;
: sposób wiązania parametrów w polecenia sparametryzowanych&lt;br /&gt;
&lt;br /&gt;
== Sposoby wiązania parametrów ==&lt;br /&gt;
; ''&amp;quot;qmark&amp;quot;''&lt;br /&gt;
: każdy ''&amp;quot;?&amp;quot;'' w poleceniu jest zastępowany przez kolejny element sekwencji parametrów&lt;br /&gt;
; ''&amp;quot;numeric&amp;quot;''&lt;br /&gt;
: każde ''&amp;quot;:n&amp;quot;'' gdzie n jest liczbą naturalną zastępowany jest przez element o indeksie ''n'' w sekwencji parametrów&lt;br /&gt;
; ''&amp;quot;named&amp;quot;''&lt;br /&gt;
: każde '':nazwa'' zastępowane jest przez element odpowiadający kluczowi ''nazwa'' w słowniku parametrów&lt;br /&gt;
; ''&amp;quot;format&amp;quot;''&lt;br /&gt;
: kody jak z ''printf'' czy pythonowej operacji formatowania &amp;quot;%&amp;quot; zastępowane są kolejnymi elementami sekwencji parametrów&lt;br /&gt;
; ''&amp;quot;pyformat&amp;quot;''&lt;br /&gt;
: ,,rozszerzone&amp;quot; kody formatowania jak w pythonowej operacji &amp;quot;%&amp;quot;, tzn postaci ''&amp;quot;%(nazwa)s&amp;quot;''&lt;br /&gt;
&lt;br /&gt;
Moduł ''sqlite3'' ma ''paramstyle == &amp;quot;qmark&amp;quot;'', ale takk naprawdę wspiera również styl ''&amp;quot;named&amp;quot;''.&lt;/div&gt;</summary>
		<author><name>Jarekz</name></author>
		
	</entry>
</feed>